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。您选择其中一个作为主键,并将另一个声明为唯一键。
优点:满足两个实体之间关联的所有约束。
缺点:如果还有其他实体与Aor相关B,那么如果选择的主键AB是“其他”键,则与该实体对应的关系的外键可能不是“自然”的。
使用不可为空的外键为另一个定义两个关系之一,例如将fke(“属性ein 的外键B”)添加到关系A。然后声明这个属性是唯一的。
优点:让两个实体保持独立的关系更“自然”。您保留每个元素A与其中一个且仅一个元素相关的约束B(因为该属性fke不可为空,并且它在所有关系中都是唯一的)。
缺点:您失去了一个约束: 的每个元素B都与 的某个元素相关A。在数据库上开发的应用程序中必须强制执行此约束。
和以前一样,交换的作用A和B。
正如您所提到的,带有桥接表R(b,e)。然后同时声明b,并e作为唯一的。
优点:您保留了 的每个元素A只能与 的一个元素相关的约束,B反之亦然。
缺点:您失去了每个元素A都与某个元素相关的约束,B反之亦然。这些约束必须由应用程序强制执行。此外,您还有一张表,这使得查询更加复杂。
您在两个表中的每一个中放置一个外键以引用另一个表。这些外键也被声明为唯一的。
优点:您保持约束,即中的每个元素A都与 中的一个且仅一个元素相关B,反之亦然。
缺点:你输了,如果某一元素的限制b1的B对应一个元素a1A的,然后a1关联到b1。事实上,这个解决方案允许不一致:一个元素a1可以关联到b2,a2可以关联到b1,同时外键 forb2可以引用a2,外键 forb1可以引用a1。所以这个约束应该由应用程序强制执行。而且,数据中存在一定的冗余。
至少在我看来,这些解决方案按照从更“安全”到更“危险”的顺序列出。
最后,从这个案例中值得注意的一点是:当从 ER 模型转换到关系数据模型时,存在转换不完全令人满意的情况。
对于您的最后一个问题:如果最多只有一个箭头会发生什么。在这种情况下,可以使用第二种或第三种解决方案。通常,如果一个箭头是完整的(即您在另一个实体集中恰好有一个元素)而另一个是部分的,则将外键放在关系是完整的关系中。如果两者都是部分的,那么您可以自由选择放置外键的关系。