【问题标题】:How might I design a commenting system like that on Stack Overflow?我如何在 Stack Overflow 上设计一个类似的评论系统?
【发布时间】:2010-10-31 20:35:33
【问题描述】:

我非常喜欢 Stack Overflow 的设计和功能。所以,我想根据本网站使用的评论系统创建我自己的设计!

问题:

  • 我应该使用什么样的表结构来存储 cmets?
  • 然后我可以使用哪些 SQL 查询来获取存储的 cmets?

【问题讨论】:

  • 糟糕,两票接近??为什么?
  • 我们中的任何人怎么可能比您自己更了解 SO 架构?
  • 关于 SO 本身的大多数问题往往会被关闭。可能这本身就是一个有趣的问题,而且它似乎确实与编程相关,所以也许这很不幸,但你去吧
  • 查看最近的 SO 博客“Stack Overflow Creative Commons Data Dump”:blog.stackoverflow.com/2009/06/…
  • 就我个人而言,询问评论系统的结构并没有错。

标签: sql database-design


【解决方案1】:

这是一个相当明显的结构。实体是:

Post: ID, Post Type (Question or Answer), Text, User ID
Question extends Post: Title
Answer extends Post:
Comment: ID, Post ID (attached to which Post), User ID, Text

您可以轻松扩展它以添加标记、编辑/修订、投票、标志和关闭/重新打开投票。

【讨论】:

    【解决方案2】:

    @cletus 的回答很有用,但使用了几乎不是标准关系术语的“扩展”,所以让我提供 2 美分。

    我假设 cmets(您具体询问的内容)是关于“项目”的,这是一个非常笼统的类别,包括问题、答案,也许还有更多的事情(尽管在 SO cmets 中只是关于问题或答案) .

    因此,一个项目将是一个包含 ItemId PK 的表,所有项目共有的所有字段(创建它的时间戳,作为用户表上的 FK 的用户 ID 等)以及可能的“ItemType " 字段可用于选择哪个其他表(问题、答案,也许还有更多)以获取特定项目的特定详细信息(如果有)。我可能会对其中的每一个进行索引,因为我可以很容易地想象在某个时间范围内查找由某个用户发布的项目等。

    如果您允许对 cme​​ts 进行向上/向下投票(或者甚至只是对它们进行向上投票),评论将具有自己的 PK CommentId、ItemId 的 FK、时间戳、作者的 UserId,并且可能还有更多列、标记等。

    例如,要获得“用户 IDC 对用户 IDI 项目的所有 cmets”,我会查询:

    SELECT * FROM Comments
      JOIN Items USING (ItemId)
      WHERE Comments.UserId = @IDC
        AND Items.UserId = @IDI
    

    我希望所有其他感兴趣的查询都和这个一样明显(如果所有有趣的查询都非常简单,那么这很好地说明了使它们如此简单的 DB 模式;-)。

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 2011-08-06
      • 2013-01-22
      • 2010-09-07
      • 1970-01-01
      • 2022-11-13
      • 2011-07-26
      • 2011-02-09
      • 2011-03-10
      相关资源
      最近更新 更多