2010-11-14 131 views
1

创建一个类似于stackoverflow的投票系统。像这样的问题一直在问几次,我已经检查,但我还没有找到一个投票系统,你评价线程和评论。我想知道做这件事的最好方法是什么?投票系统,你会在同一个表中进行线程投票和评论投票吗?

这是最好的方法吗?

thread table 
id PK 
userid 
title 
description 

comment table 
id PK 
userid 
comment 

在上面的表格中有评分,或者让它们分开吗? :

thread_rating table 
threadid PK 
userid PK 
rating 

comment_rating table 
commentid PK 
userid PK 
rating 

或只是有一个评价表和评论表?

回答

2

如果您的评论位于线程的单独表格中,则每个评分可能没有任何业务在同一个表格中。所以是的;鉴于你打算如何做线程和评论,你应该为他们的每个评级都有单独的表格。

@drachenstern提到的内容也很重要,btw;您可以通过View或其他机制来做些事情来跟踪选民(和投票者)的整体投票。举例来说,SO显示我们的总赞成/反对票,无论他们是在提问还是回答。然而与此同时,还有徽章在哪里知道哪些是重要的。

如果将表结合为一种“组合”投票总数的方式,则可能发生的一个问题是,您可能必须采用不同的方式为线索和评论生成UID,以确保无线程与注释具有相同的ID(这意味着您需要使表结构更复杂)。在这样的思路中,我的观点可能是将主题和评论合并成一张表。当然,这会带来其自身的复杂性。

:)

+0

感谢我@AndrewBarber同意评级表有更好的投票| vote_up | vote_down | ....或.... | vote | vote_type | ...你怎么看? – Jonathan 2010-11-14 03:33:24

+0

一个选项可能只是简单地将'vote'字段设置为'int',并且对于upvotes为'+ 1',对于downvotes为'-1'。没有理由你不能使用其他值,如果你想给他们不同的权重。然后,应用程序可以简单地将正数显示为正数,将负数显示为倒数。 – 2010-11-14 03:36:40

+0

通过将它们设置为对您的应用程序很重要的数值,您可以使用一些简单的数学聚合函数来确定总体评分。 – 2010-11-14 03:37:26

1

我想这将是有意义的跟踪谁投赞成票的每个,所以<user,commentid,vote,timestamp>一张桌子和<user,answerid,vote,timestamp>

否则一个表中的线程