2009-05-01 123 views
6

我正在研究一个PHP应用程序,它有几个可以评论的对象。每个评论都可以投票,用户可以给它+1或-1(如Digg或Reddit)。现在我正计划拥有一张载有user_id及其投票信息的“投票”表,这似乎工作正常。评论投票数据库结构的最佳做法

问题是,每个对象都有数百个注释存储在单独的注释表中。在我加载评论之后,我必须对票进行总结,然后逐个检查每位投票者,以确保他们只能投票一次。这工作,但似乎真的是数据库密集型 - 很多只是评论的查询。

是否有一个更简单的方法来减少数据库密集度?我目前的数据库结构是最好的方法吗?

更清晰了解当前的数据库结构:

评论表:

  • USER_ID
  • OBJECT_ID
  • total_votes

投票表:

  • COMMENT_ID
  • USER_ID
  • 投票

最终目标:

  • 允许用户在每个评论有至少#MySQL的查询只有一次投票(每个对象有多条评论)

回答

8

要确保每个选民只投票一次,请在这些字段中设计您的投票表— CommentID,UserID,VoteValue。使CommentID和UserID成为主键,这将确保一个用户只有一个投票。然后,要查询投票评论,做这样的事情:

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

这有帮助吗?

+0

实际上帮助很大,谢谢!有关两个主键的想法甚至没有跨过我的想法。 – mdolon 2009-05-01 02:26:00

0

为什么不保存每个评论的总计票数?当新的投票发生时增加/减少。

然后,您必须检查用户是否投票专门针对此评论,以允许每个用户的每条评论只有一个投票。

+0

诀窍在于第二部分,检查用户是否已投票支持该特定评论 - 它基本上导致拥有单独的投票表。 – mdolon 2009-05-01 02:22:55

0

你可以把SQL连接条件,它返回由该对象的当前用户提出的意见所有的选票,如果你没有行,用户还没有投票。这与您在程序中逐一检查每条评论略有不同。

就数据库结构而言,保持这些东西是分开的,这似乎是完全合乎逻辑的。投票{user_id,object_id,object_type,vote_info ...)

您可能已经在做这件事,对不起,但我无法从您的帖子中解释,如果是这样的话。