请考虑以下场景。宠物主人可能有多只猫,也可能有多只狗。有些狗与一些猫有亲缘关系(即它们打架:-))同一所有者的.
以下关系设计不施加此限制,因为不同所有者的猫和狗可能是相关的。有没有办法通过关系设计来施加这种限制?
您需要使用识别关系将所有者的 PK 向下迁移到菱形依赖关系的“两侧”和“底部”:
Since CatDog.OwnerId
只是一个字段,它无法识别每一行的多个所有者,并且由于它是对两种动物的 FK,因此该所有者必须与猫和狗的所有者相匹配。
换句话说,猫只能与同一主人的狗产生联系。
正如您所看到的,猫和狗的识别方式与您可能预期的不同。猫由其主人来识别,并通过其与同一主人的其他猫区分开来。CatNo
。对于狗来说也是如此。
如果您需要一个“更简单”的密钥,您始终可以添加一个代理密钥,或者,您可以完全消除CatNo
and DogNo
仅出于迁移的目的而“滥用”UNIQUE 约束OwnerId
:
(The U1
表示唯一约束。)
现在您可以更简洁地识别动物,但有一个缺点:从强制唯一性的角度来看,UNIQUE 约束是完全多余的。它是 PK 的超集,并且 PK 本身就具有独特性。 UNIQUE 约束的唯一目的是启用CatDog.OwnerId
来参考Cat.OwnerId
(and Dog.OwnerId
) - 大多数 DBMS 要求外键的父端点是键。
一些 DBMS(Oracle http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2797775200346956958)将允许您仅使用一个索引来强制执行 PK 和 UNIQUE 约束,但大多数不会。每个额外的索引都会损害插入/更新/删除性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)