Sql 我该如何设计一个类似于堆栈溢出的注释系统?

Sql 我该如何设计一个类似于堆栈溢出的注释系统?,sql,database-design,Sql,Database Design,我非常喜欢堆栈溢出的设计和功能。所以,我想创建一个基于这个网站使用的评论系统我自己的设计 问题: 我应该使用什么样的表结构来存储注释 然后我可以使用什么SQL查询来获取存储的注释 这是一个相当明显的结构。这些实体是: Post: ID, Post Type (Question or Answer), Text, User ID Question extends Post: Title Answer extends Post: Comment: ID, Post ID (attached to

我非常喜欢堆栈溢出的设计和功能。所以,我想创建一个基于这个网站使用的评论系统我自己的设计

问题:
  • 我应该使用什么样的表结构来存储注释
  • 然后我可以使用什么SQL查询来获取存储的注释

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

    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
    

    你可以很容易地扩展它,添加标签、编辑/修订、投票、标志和关闭/重新打开投票。

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

    我假设评论(你特别问的)是关于“项目”的,这是一个非常普遍的类别,包括问题、答案,也许还有更多的东西(尽管在这样的情况下,评论只是关于问题或答案)

    因此,一个项目将是一个表,其主键为ItemId,所有项目共有的所有字段(创建该项目的时间戳,用户ID作为用户表上的FK,等等),并且可能是一个“ItemType”字段,可用于选择其他哪些表(问题、答案,可能更多)以获取特定项目的特定详细信息(如果有的话)。我可能会对每一项都进行索引,因为我可以很容易地想象在某个时间范围内寻找某个用户发布的项目&c

    如果您允许对评论进行上/下投票(或者甚至只对评论进行上/下投票)、标记和c,则评论将有自己的PK CommentId、FK of ItemId、时间戳、作者的用户ID,以及可能更多的列

    比如说,要获得“用户IDC对用户IDI项目的所有评论”,我需要查询:

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

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

    oops,两票接近??为什么?我们中的任何人怎么能比你自己更了解SO体系结构呢?大多数关于SO本身的问题往往都是封闭的。也许这本身就是一个有趣的问题,它似乎与编程有关,所以这可能是不幸的,但你可以看到最近的so博客“Stack Overflow Creative Commons Data Dump”:就个人而言,我认为询问评论系统的结构没有什么错。