Mysql 多表数据库设计问题评述

Mysql 多表数据库设计问题评述,mysql,sql,sql-server,database,database-design,Mysql,Sql,Sql Server,Database,Database Design,我有桌子: Articles{...} Recipes{...} Notifications{...} Photos{...} 我需要实现“用户评论”功能(比如facebook)。 我应该用1:n关系制作表:ArticleComments、RecipesComments等吗? 或者为所有对象创建一个Comments表(但我不知道如何设计它)要了解如何为所有对象创建一个Comments表,您可以查看django comment model()最简单的方法是创建一个“多态”注释表,该表中包含它所引

我有桌子:

Articles{...}
Recipes{...}
Notifications{...}
Photos{...}
我需要实现“用户评论”功能(比如facebook)。 我应该用1:n关系制作表:
ArticleComments、RecipesComments
等吗?
或者为所有对象创建一个
Comments
表(但我不知道如何设计它)

要了解如何为所有对象创建一个
Comments
表,您可以查看
django comment model
()

最简单的方法是创建一个“多态”注释表,该表中包含它所引用对象的id和类型的列

您可以执行以下操作:

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

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

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

然后可以有一个
Comment
表,该表以通用方式引用
CommentableEntity

例如,您将得到以下表格:

Articles
-----------------
Article_id
CommentableEntity_id (fk, unique)
Content
....

Recipes
-----------------
Recipe_id
CommentableEntity_id (fk, unique)
Content
....

CommentableEntity
-----------------
CommentableEntity_id (pk)
EntityType (e.g. 'Recipe', 'Article')

Comment
-------
Comment_id (pk)
CommentableEntity_id (fk)
User_id (fk)
DateAdded
Comment 
...etc...

您可以在每次添加文章/配方等时添加CommentableEntity记录。您的注释处理代码只需要知道CommentableEntity的id—它不关心它是什么类型的东西。

这取决于您的应用程序将如何使用注释

我的猜测是,您经常会想要调出用户创建的所有评论,而不管他们对哪个实体发表评论。也就是说,我假设您经常需要一个查询,该查询返回的行指示用户JohnDoe对第1条发表了评论,然后是Photo 12,然后是Recipe 171。如果是这样的话,那么使用一个结构类似于Steve Mayne建议的
CommentableEntity
表的
Comments
表就更有意义了


另一方面,如果您只访问特定项目的注释(即第1条的所有注释),则单独的
ArticleComments
PhotoComments
表格可能更合适。这使得在实体表和注释表之间使用外键变得更容易,而且由于这是一个穷人的分区,因此可能会更高效一些。当然,一旦您开始组合来自多个注释表的数据,这种效率就会降低,因此您需要对用例有合理的信心。

如果我理解您的建议,可能会重复:Articles{ArticleId…}Reciper{RecipeId…}CommmentableEntity{EntityId,UserId,CommentId,Date}//这里EntityId是文章的ID,recipse等。注释{CommentId,Text}这是一个好的设计吗?我已经添加到我的答案中-希望这将有助于描述我的意思——目标链接消失了
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]