我正在开发一个 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...)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top