消除ER模型中的循环

时间:2016-11-11 19:38:32

标签: database-design entity-relationship

我正在尝试将数据库设计为练习ER模型的练习题。简而言之,我有三个实体:UserPostComment。我在UserPost之间有一对多的关系(用户可以发布帖子),UserComment之间的一对多关系(用户可以写很多)评论)以及PostComment之间的一对多关系(帖子可以包含很多评论)。显然,这形成了一个循环,我被告知在设计时避免循环。那么有没有聪明的方法来简化这些关系以消除周期?或者可能有一个通用算法,也就是说,消除周期?

2 个答案:

答案 0 :(得分:1)

只有在通过多个路径连接相同的两个实体时,才会出现有问题的循环,这是有待避免的。例如,如果员工在某个部门工作,则部门位于城市中,并且您还有一个关系,表明某个员工在哪个城市工作。但是,如果你有一个关系,说明员工住在哪个城市,那可能与他工作的城市有所不同,那么,即使它形成一个循环,你也不能在不丢失信息的情况下消除它。

以类似的方式,在你的模型中没有什么可以消除的,除非你想丢失一些基本信息,因为User和Comment之间的关系表达了​​某个用户写了某个注释的事实,这可能是一个评论另一位用户的帖子。

答案 1 :(得分:1)

  

显然,这形成了一个循环,我被告知在设计时避免循环。

我不知道ERD图表能够拥有"周期"来自。我花了好几年的时间做这种工作 - 我们有一个E尺寸的绘图仪​​,并将图表贴在门上 - 从来没有遇到过无周期规则,直到我在SO上听到它。

真正的规则不是关于页面上的图片;它是关于数据库中的行。

想象一下员工的组织结构图表。大多数员工都有老板,每个老板都是员工。因此,员工与员工之间存在着一种关系:循环。除之外,它不是循环。它看起来像页面上的那个,因为employee表代表所有员工。它看起来并不像数据库中的那个,因为每个员工都是不同的。如果您将所有boss-employee 映射为索引卡和地板上的纱线,您将看到一棵树。

我认为没有周期规则可以防止冗余关系,如Why should I avoid loops when designing relationships for a database?中所述,但数据库设计不能简化为这样的简单规则。规范化是删除所有冗余的过程,而不仅仅是那些具有某些图形特征的冗余。如果可以用肤浅的规则检查,可以通过机器完成。你所要做的就是在顶部倒入列名,而out会弹出你的数据库设计。

所以实际的规则是,不能绘制可导出的关系。绘制表达约束所需的最小集合,而不是更多。就像米开朗基罗和大理石一块(据说):只要把所有不是大卫的东西都砍掉,然后你就完成了。