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

8
我正在开发一个PHP应用程序,其中有几个对象可以被评论。每个评论都可以被投票,用户可以给它+1或-1(类似于Digg或Reddit)。现在我计划有一个“投票”表,其中包含user_id和他们的投票信息,这似乎很好地工作。
问题是,每个对象都有数百条存储在单独的评论表中的评论。加载评论后,我必须计算投票并逐个检查每个投票以确保他们只能投一次票。这样做虽然有效,但却需要大量数据库查询 - 只是为了获取评论。
有没有更简单的方法来做到这一点,而且不会对数据库造成太大的压力?我的当前数据库结构是最佳方式吗?
为了更清楚地说明当前的数据库结构:
评论表:
- user_id - object_id - total_votes
投票表:
- comment_id - user_id - vote 最终目标:
- 允许用户对每个评论只投一次票,并尽可能少地使用MySQL查询(每个对象都有多个评论)
3个回答

11
为了确保每个投票者只能投一次票,设计你的 Votes 表格,包括以下字段:CommentID、UserID、VoteValue。将 CommentID 和 UserID 设为主键,这样可以确保一个用户只能投一票。然后,要查询一个评论的投票情况,可以按照以下方式进行操作:
SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?

这有帮助吗?


那真的很有帮助,谢谢!想到使用两个主键的方法我完全没想到... - mdolon

1
为什么不保存每个评论的总票数?当有新的投票发生时,增加/减少此票数。
然后您需要检查用户是否已经对此评论进行了投票,以允许每个用户每个评论只有一次投票。

诀窍在于第二部分,检查用户是否为该特定评论投票 - 这基本上导致有一个单独的投票表。 - mdolon

0

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

就数据库结构而言,将这些内容分开保持逻辑上的完整性是非常合理的。投票 { 用户 ID、对象 ID、对象类型、投票信息... )

您可能已经在这样做了,但很抱歉我无法从您的帖子中解释出是否是这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接