我有桌子:
Articles{...}
Recipes{...}
Notifications{...}
Photos{...}
我需要实现'用户评论'功能(如facebook)。
我应该制作表格:ArticleComments, RecipesComments
等与1:n的关系吗?
或者为所有人创建一个Comments
表(但我不知道如何设计它)?
答案 0 :(得分:4)
您可以创建另一个表CommentableEntity
(尽管称之为更好)。表格中的每一行(Articles
,Recipes
等)都会引用此表中的唯一行。实体表可能有一个type
字段来指示实体的类型(以帮助反向连接)。
然后,您可以以通用方式拥有引用Comment
的{{1}}表。
例如,您最终会得到以下表格:
CommentableEntity
每次添加文章/食谱等时都可以添加CommentableEntity记录。所有评论处理代码必须知道的是CommentableEntity_id - 它不关心它是什么类型的事物。
答案 1 :(得分:2)
这取决于您的应用程序将如何使用评论。
我的猜测是,您经常想要提取用户创建的所有评论,而不管他们正在评论的实体。也就是说,我假设您经常需要一个返回行的查询,指示用户JohnDoe对第1条,然后是Photo 12,然后是Recipe 171进行了评论。如果是这种情况,那么拥有单个{{{ 1}}表的结构类似于Steve Mayne在Comments
表中建议的结构。
另一方面,如果您只访问特定项目的注释(即第1条的所有注释),则单独的CommentableEntity
和ArticleComments
表可能更合适。这样可以更容易在实体表和注释表之间使用外键,并且可能更有效,因为它是一个穷人的分区。当然,只要您开始组合来自多个评论表的数据,这种效率就会消失,因此您需要对用例有合理的信心。
答案 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/)