【问题标题】:Newbie Database Design - "Stack Overflow style voting system"新手数据库设计 - “堆栈溢出式投票系统”
【发布时间】:2011-12-20 03:21:36
【问题描述】:

这是我目前所拥有的数据库设计的简化版本,用于“堆栈溢出”风格的投票系统。

问题是:如果用户对他们为响应获得的总票数有一个分数,那么该分数是“即时”计算出来的,还是用户表中是否应该有一个字段引用他们的分数.另外,如果是后者,推荐的更新方法是什么?

Users Table
-id
-name
-email

Question Table
-id
-text
-poster (user id)

Responses Table
-id
-text
-question (question id)
-poster (user id)

Votes Table
-id
-response (response id)
-voter (user id)

【问题讨论】:

  • 您还应该为问题添加投票和书签/收藏表。

标签: database database-design relational-database


【解决方案1】:

对数据库模型进行反规范化以便一些关键场景可以具有更好的性能是合理的,只要您以谨慎和深思熟虑的方式进行。

所以您已经对实际数据量进行了基准测试并确定动态计票会导致性能问题,请继续并缓存计票。

保持缓存值最新的最稳健的方法可能是实现一个数据库触发器,该触发器在将行插入Votes 时递增缓存值,并在删除行时递减缓存值。

注意:拥有SELECT COUNT(*)... 触发器可能会引入微妙的并发问题。

【讨论】:

    【解决方案2】:

    我建议至少在开始时根据需要计算投票总数。开始使用时需求可能会很低,稍后可以将其更改为作为字段存储在响应表中。当/如果发生这种情况,请使用触发器对其进行更新。此外,设置一个视图来报告响应和总数,因此当/如果进行更改时,您可以在一个中心位置进行界面更新,而不是在代码中查找查询。

    如果在开发过程中或初始发布后需求发生变化,这具有更灵活的额外好处。注意功能蠕变。

    您还可以删除 Votes 表中的 id 字段。如果每个投票对于响应和投票者都是唯一的,那么将这些字段设置为表的键就足够了。

    【讨论】:

    • 我将删除 Votes 表上的那个 id,谢谢,并用这两个外键的组合键替换它
    【解决方案3】:

    您可能希望架构也允许对问题进行投票(这意味着需要另一个投票表)。我认为在Users 表中有一个投票总和(声誉)是一个好主意,因为查询表中的单行比每次查询两个表的总和更有效显示用户的信誉。您可以从触发器或业务逻辑更新它。您还需要考虑如何表示赞成/反对票。您可以在两个投票表中使用位值(表示向上或向下)或绝对数 (1/-1) 来执行此操作。每次在两个投票表中插入、删除或更新条目时,您都必须调整 Users 表中的总数。通过触发器更新总数可能会更“愚蠢”,但您也可以争辩说它应该存在于您的业务逻辑层中,并且人们不应该直接在表格中玩耍。但是,只要您做出明智的决定,我个人认为这并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多