我有表:
Articles{...}
Recipes{...}
Notifications{...}
Photos{...}
我需要实现‘用户评论’的功能(如facebook)。我应该制作具有1:n关系的表:ArticleComments, RecipesComments
等吗?或者为所有人创建一个Comments
表(但我不知道如何设计它)?
发布于 2011-04-19 22:04:05
您可以创建另一个表CommentableEntity
(尽管称之为更好的表)。表中的每一行(Articles
、Recipes
等)将具有对此表中唯一行的引用。实体表可能有一个type
字段来指示实体的类型(以帮助反向联接)。
然后,您可以拥有一个以通用方式引用CommentableEntity
的Comment
表。
因此,例如,您将得到以下表:
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 -它并不关心它是什么类型的东西。
发布于 2011-04-19 22:11:06
这取决于您的应用程序将如何使用注释。
我的猜测是,无论用户评论的是什么实体,您都会经常想要拉出用户创建的所有评论。也就是说,我假设您经常需要一个查询,该查询返回指示用户JohnDoe在文章1上评论的行,然后是照片12,然后是食谱171。如果是这样,那么拥有一个结构类似于Steve Mayne所建议的CommentableEntity
表的Comments
表将更有意义。
另一方面,如果您只访问特定项目的评论(即第1条的所有评论),则单独的ArticleComments
和PhotoComments
表可能更合适。这使得在实体表和注释表之间使用外键变得更容易,而且可能会更有效,因为这是一个糟糕的人的分区。当然,一旦您开始必须组合来自多个注释表的数据,这种效率就会消失,因此您需要对用例保持合理的信心。
发布于 2011-04-19 22:03:04
最简单的方法是创建一个“多态”注释表,该表将同时包含它所引用的对象的id和类型的列。
您可以执行以下操作:
SELECT * FROM Comments where type = "Articles" and type_id = 1;
SELECT * FROM Comments where type IN ("Recipes", "Photos")
将唯一的复合索引放在(type,id)上也可以提高查找的性能。
https://stackoverflow.com/questions/5723209
复制相似问题