【问题标题】:Best practice for comment voting database structure评论投票数据库结构的最佳实践
【发布时间】:2010-10-23 00:49:39
【问题描述】:

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

问题是,每个对象都有数百个 cmets,这些 cmets 存储在一个单独的 cmets 表中。加载 cmets 后,我必须对选票进行统计,然后单独检查对用户的每张选票,以确保他们只能投票一次。这行得通,但似乎真的是数据库密集型的——很多查询只针对 cme​​ts。

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

为了更清楚地了解当前的数据库结构:

评论表:

  • user_id
  • object_id
  • total_votes

投票表:

  • comment_id
  • user_id
  • 投票

最终目标:

  • 允许用户对每条评论至少投票一次,且 MySQL 查询次数最少(每个对象有多个 cmets)

【问题讨论】:

    标签: php mysql comments voting


    【解决方案1】:

    您可以设置一个 sql 连接条件,返回当前用户对该对象所做的所有 cmets 投票,如果您没有获得任何行,则该用户没有投票。这与您在程序中逐条检查每个评论略有不同。

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

    您可能已经这样做了,抱歉,如果是这样的话,我无法从您的帖子中解释。

    【讨论】:

      【解决方案2】:

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

      然后您必须检查用户是否专门为该评论投票,以允许每个用户每条评论仅投一票。

      【讨论】:

      • 诀窍是第二部分,检查用户是否为该特定评论投票 - 它基本上导致拥有一个单独的投票表。
      【解决方案3】:

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

      SELECT SUM(VoteValue)
      FROM Votes
      WHERE CommentID = ?
      

      这有帮助吗?

      【讨论】:

      • 这实际上很有帮助,谢谢!我什至没有想到有两个主键..
      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2016-09-21
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多