题
我正在开发一个 PHP 应用程序,它有几个可以评论的对象。每个评论都可以进行投票,用户可以给它 +1 或 -1(如 Digg 或 Reddit)。现在我计划建立一个“投票”表,其中包含 user_id 及其投票信息,这似乎工作正常。
问题是,每个对象都有数百条评论,这些评论存储在单独的评论表中。加载评论后,我必须统计选票,然后单独检查用户的每张选票,以确保他们只能投票一次。这可行,但看起来确实是数据库密集型的——大量查询只是针对评论。
有没有一种更简单的方法来减少数据库密集度?我当前的数据库结构是最好的方法吗?
为了更清楚当前的数据库结构:
评论表:
- 用户身份
- 对象 ID
- 总票数
票数表:
- 评论id
- 用户身份
- 投票
最终目标:
- 允许用户对每个评论仅投票一次,且 MySQL 查询数最少(每个对象有多个评论)
解决方案
为了确保每个投票者只投票一次,请使用以下字段设计投票表:CommentID、UserID、VoteValue。将 CommentID 和 UserID 作为主键,这将确保一个用户只能获得一票。然后,要查询评论的投票,请执行以下操作:
SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?
这有帮助吗?
其他提示
为什么不保存每条评论的总票数?当新的投票发生时增加/减少此值。
然后,您必须检查用户是否专门为此评论投票,以允许每个用户的每个评论只投一票。
您可以放置一个 sql 连接条件,该条件返回当前用户对此对象所做的评论的所有投票,如果没有获得任何行,则该用户尚未投票。这和你在程序中一一查看每条评论只是稍有不同。
就数据库结构而言,将这些东西分开似乎是完全合乎逻辑的。投票 { user_id, object_id, object_type, vote_info...)
您可能已经在这样做了,抱歉,但如果是这种情况,我无法从您的帖子中进行解释。
不隶属于 StackOverflow