评论投票数据库结构的最佳实践

时间:2009-05-01 02:02:25

标签: php mysql comments voting

我正在开发一个PHP应用程序,它有几个可以评论的对象。每个评论都可以投票,用户可以给它+1或-1(如Digg或Reddit)。现在我正计划有一个带有user_id和投票信息的“投票”表,这似乎工作正常。

问题是,每个对象都有数百条注释存储在单独的注释表中。加载评论后,我必须统计选票,然后单独检查每个投票对用户,以确保他们只能投票一次。这可行,但看起来真的是数据库密集型 - 很多只是评论的查询。

是否有一种更简单的方法可以减少数据库密集度?我当前的数据库结构是最好的方法吗?

更清楚当前的数据库结构:

评论表:

  • USER_ID
  • 的object_id
  • total_votes

投票表:

  • COMMENT_ID
  • USER_ID
  • 表决

结束目标:

  • 允许用户仅使用最少的MySQL查询数(每个对象有多个注释)对每个注释只投票一次

3 个答案:

答案 0 :(得分:9)

为了确保每个选民只投票一次,请使用这些字段设计您的投票表 - CommentID,UserID,VoteValue。使CommentID和UserID成为主键,这将确保一个用户只获得一票。然后,要查询投票以获得评论,请执行以下操作:

SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?

这有帮助吗?

答案 1 :(得分:0)

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

然后你必须检查用户是否已经专门为此评论投票,以便每个用户每个评论只允许一次投票。

答案 2 :(得分:0)

您可以设置一个sql join条件,该条件返回当前用户对此对象所做的评论的所有投票,如果没有行,则表示用户尚未投票。这与您在程序中逐一检查每条评论略有不同。

就数据库结构而言,将这些事物分开似乎是完全符合逻辑的。 vote {user_id,object_id,object_type,vote_info ...)

你可能已经这样做了,很抱歉,如果是这种情况,我无法向你解释。