关于许多表数据库设计问题的评论

时间:2011-04-19 21:56:37

标签: mysql sql sql-server database database-design

我有桌子:

Articles{...}
Recipes{...}
Notifications{...}
Photos{...}

我需要实现'用户评论'功能(如facebook)。 我应该制作表格:ArticleComments, RecipesComments等与1:n的关系吗? 或者为所有人创建一个Comments表(但我不知道如何设计它)?

5 个答案:

答案 0 :(得分:4)

您可以创建另一个表CommentableEntity(尽管称之为更好)。表格中的每一行(ArticlesRecipes等)都会引用此表中的唯一行。实体表可能有一个type字段来指示实体的类型(以帮助反向连接)。

然后,您可以以通用方式拥有引用Comment的{​​{1}}表。

例如,您最终会得到以下表格:

CommentableEntity

每次添加文章/食谱等时都可以添加CommentableEntity记录。所有评论处理代码必须知道的是CommentableEntity_id - 它不关心它是什么类型的事物。

答案 1 :(得分:2)

这取决于您的应用程序将如何使用评论。

我的猜测是,您经常想要提取用户创建的所有评论,而不管他们正在评论的实体。也就是说,我假设您经常需要一个返回行的查询,指示用户JohnDoe对第1条,然后是Photo 12,然后是Recipe 171进行了评论。如果是这种情况,那么拥有单个{{{ 1}}表的结构类似于Steve Mayne在Comments表中建议的结构。

另一方面,如果您只访问特定项目的注释(即第1条的所有注释),则单独的CommentableEntityArticleComments表可能更合适。这样可以更容易在实体表和注释表之间使用外键,并且可能更有效,因为它是一个穷人的分区。当然,只要您开始组合来自多个评论表的数据,这种效率就会消失,因此您需要对用例有合理的信心。

答案 2 :(得分:0)

最简单的方法是拥有一个'多态'注释表,该表可以包含id引用的对象和类型的列。

您可以执行以下操作:

SELECT * FROM Comments where type = "Articles" and type_id = 1;
SELECT * FROM Comments where type IN ("Recipes", "Photos")

在(type,id)上放置一个唯一的复合索引也可以提高查找的性能。

答案 3 :(得分:0)

SELECT TOP 1000 [Comments_Id]
      ,[Comments_Text]
      ,[Comments_IsApproved]
      ,[Comments_IsVisible]
      ,[Comments_DateStamp]
      ,[Type_Id]
      ,[Entity_Id] -- From Entity Table, listing Articles, Recipes etc. 
      ,[EntityItem_Id] -- One of the PK from table of Articles, Recipes etc.
      ,[User_Id]
  FROM [tbl_Comments]

答案 4 :(得分:-1)

要了解如何为所有对象创建单个Comments表格,您可以查看django comment model http://docs.djangoproject.com/en/dev/ref/contrib/comments/models/