Hel*_*pMe 3 erd database-design relational-theory
我将这个学期的 DB 课程作为我的 CS 研究的一部分。
本周我们开始研究 ER 图的主题,我觉得这有点令人困惑。
我对上面的图片有些不确定(注意:圆形箭头表示“一个且只有一个”——也就是说,B 中的每个主题都可以而且必须指向 A 中的一个主题,反之亦然)。
我必须为此图创建一个合适的关系模式,这是我的尝试:
这是我的不确定性:
R(b, e) - 无论我用这些外键创建哪个键,都不会保留“一个且唯一一个”约束。
如何创建此约束所在的架构?
如果您有“最多一个”箭头,而不完全是这样呢?
答案会如何变化?
您有多种可能性,每种可能性都有优点和缺点。
定义单个表:
AB(a b c d e f)
Run Code Online (Sandbox Code Playgroud)
有两个候选键,b
和e
。您选择其中一个作为主键,并将另一个声明为唯一键。
优点:满足两个实体之间关联的所有约束。
缺点:如果还有其他实体与A
or相关B
,那么如果选择的主键AB
是“其他”键,则与该实体对应的关系的外键可能不是“自然”的。
使用不可为空的外键为另一个定义两个关系之一,例如将fke
(“属性e
in 的外键B
”)添加到关系A
。然后声明这个属性是唯一的。
优点:让两个实体保持独立的关系更“自然”。您保留每个元素A
与其中一个且仅一个元素相关的约束B
(因为该属性fke
不可为空,并且它在所有关系中都是唯一的)。
缺点:您失去了一个约束: 的每个元素B
都与 的某个元素相关A
。在数据库上开发的应用程序中必须强制执行此约束。
和以前一样,交换的作用A
和B
。
正如您所提到的,带有桥接表R(b,e)
。然后同时声明b
,并e
作为唯一的。
优点:您保留了 的每个元素A
只能与 的一个元素相关的约束,B
反之亦然。
缺点:您失去了每个元素A
都与某个元素相关的约束,B
反之亦然。这些约束必须由应用程序强制执行。此外,您还有一张表,这使得查询更加复杂。
您在两个表中的每一个中放置一个外键以引用另一个表。这些外键也被声明为唯一的。
优点:您保持约束,即中的每个元素A
都与 中的一个且仅一个元素相关B
,反之亦然。
缺点:你输了,如果某一元素的限制b1
的B
对应一个元素a1
A的,然后a1
关联到b1
。事实上,这个解决方案允许不一致:一个元素a1
可以关联到b2
,a2
可以关联到b1
,同时外键 forb2
可以引用a2
,外键 forb1
可以引用a1
。所以这个约束应该由应用程序强制执行。而且,数据中存在一定的冗余。
至少在我看来,这些解决方案按照从更“安全”到更“危险”的顺序列出。
最后,从这个案例中值得注意的一点是:当从 ER 模型转换到关系数据模型时,存在转换不完全令人满意的情况。
对于您的最后一个问题:如果最多只有一个箭头会发生什么。在这种情况下,可以使用第二种或第三种解决方案。通常,如果一个箭头是完整的(即您在另一个实体集中恰好有一个元素)而另一个是部分的,则将外键放在关系是完整的关系中。如果两者都是部分的,那么您可以自由选择放置外键的关系。