请考虑以下情况。宠物主人可能有多只猫,也可能有多只狗。有些狗和同一主人的猫有亲缘关系(他们打架:-)。
下面的关系设计没有施加这种限制,因为不同主人的猫和狗可能是相关的。有办法通过关系设计来施加这种限制吗?

发布于 2012-09-27 17:31:42
您需要使用标识关系将所有者的PK向下迁移到“两侧”,并迁移到菱形依赖的“底部”:

因为CatDog.OwnerId只是一个字段,它不能识别每一行的多个主人,而且由于它是针对两种动物的FK,所以这个所有者必须同时匹配猫的主人和狗的主人。
换句话说,猫只能与同一主人的狗发生关系。
正如你所看到的,猫和狗的识别方式与你可能预期的不同。猫是由它的主人识别的,并通过它的CatNo区别于同一主人的其他猫。狗也是。
如果您需要一个“更简单的”键,您可以只添加一个代理键,或者也可以通过“滥用”唯一约束来完全消除CatNo和DogNo,仅用于迁移OwnerId。

( U1表示唯一的约束。)
现在您可以更简洁地识别动物,但也有一个缺点:从执行唯一性的角度来看,唯一的约束是完全多余的。这是一个超级集的PK和PK是执行自己的独特性,只是很好。唯一约束的唯一目的是使CatDog.OwnerId能够引用Cat.OwnerId (和Dog.OwnerId) -大多数DBMSes都要求外键的父端点是键。
一些DBMSes (甲骨文)只允许您使用一个索引来执行PK和唯一约束,但大多数不会。每增加一个索引都会损害插入/更新/删除性能。
https://stackoverflow.com/questions/12622760
复制相似问题