Database design 关系设计场景:限制子关系 请考虑下面的场景。宠物主人可能有多只猫,也可能有多只狗。有些狗与同一主人的一些猫有亲缘关系

Database design 关系设计场景:限制子关系 请考虑下面的场景。宠物主人可能有多只猫,也可能有多只狗。有些狗与同一主人的一些猫有亲缘关系,database-design,model,entity-relationship,relational,relational-model,Database Design,Model,Entity Relationship,Relational,Relational Model,以下关系设计不施加此限制,因为不同主人的猫和狗可能是相关的。有没有办法通过关系设计来施加这种限制 您需要使用标识关系将所有者的PK向下迁移到菱形依赖项的“两侧”和“底部”: 因为CatDog.OwnerId只是一个字段,它不能识别每行的多个所有者,而且因为它是针对两种动物的FK,所以这一所有者必须同时匹配猫和狗的所有者 换句话说,猫只能和同一主人的狗联系起来 正如你所看到的,猫和狗的识别与你可能预期的不同。猫由主人识别,并通过其猫号与同一主人的其他猫区分开来。狗也一样 如果您需要一个“更简单

以下关系设计不施加此限制,因为不同主人的猫和狗可能是相关的。有没有办法通过关系设计来施加这种限制


您需要使用标识关系将所有者的PK向下迁移到菱形依赖项的“两侧”和“底部”:

因为
CatDog.OwnerId
只是一个字段,它不能识别每行的多个所有者,而且因为它是针对两种动物的FK,所以这一所有者必须同时匹配猫和狗的所有者

换句话说,猫只能和同一主人的狗联系起来

正如你所看到的,猫和狗的识别与你可能预期的不同。猫由主人识别,并通过其猫号与同一主人的其他猫区分开来。狗也一样


如果您需要一个“更简单”的密钥,您总是可以添加一个代理密钥,或者,您可以完全消除
CatNo
DogNo
,方法是“滥用”唯一约束,仅为了迁移
所有者ID

(U1的
U1
表示唯一约束。)

现在,您可以更简洁地识别动物,但有一个缺点:从强制唯一性的角度来看,唯一性约束是完全多余的。这是PK的一个超级集合,PK本身就可以强制实现唯一性。唯一约束的唯一目的是启用
CatDog.OwnerId
引用
Cat.OwnerId
(和
Dog.OwnerId
)-大多数DBMS要求外键的父端点为键


一些dbmse()将允许您只使用一个索引来强制执行PK和UNIQUE约束,但大多数不会。每增加一个索引都会影响插入/更新/删除性能。

只需在Cat表和Dog表之间的关系表中添加OwnerId。@WahidBitar这还不够-您必须确保连接表与Cat表和Dog表匹配的是同一所有者,而不仅仅是任何所有者。要做到这一点,所有者的PK基本上需要向下传播到整个层次结构中。