首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >浅谈多表数据库设计问题

浅谈多表数据库设计问题
EN

Stack Overflow用户
提问于 2011-04-19 21:56:37
回答 5查看 2.1K关注 0票数 2

我有表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Articles{...}
Recipes{...}
Notifications{...}
Photos{...}

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-19 22:04:05

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

然后,您可以拥有一个以通用方式引用CommentableEntityComment表。

因此,例如,您将得到以下表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 -它并不关心它是什么类型的东西。

票数 4
EN

Stack Overflow用户

发布于 2011-04-19 22:11:06

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

我的猜测是,无论用户评论的是什么实体,您都会经常想要拉出用户创建的所有评论。也就是说,我假设您经常需要一个查询,该查询返回指示用户JohnDoe在文章1上评论的行,然后是照片12,然后是食谱171。如果是这样,那么拥有一个结构类似于Steve Mayne所建议的CommentableEntity表的Comments表将更有意义。

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-19 22:03:04

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

您可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM Comments where type = "Articles" and type_id = 1;
SELECT * FROM Comments where type IN ("Recipes", "Photos")

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5723209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文