gpt4 book ai didi

database-design - 关系设计场景: restrict children relations

转载 作者:行者123 更新时间:2023-12-02 18:08:22 25 4
gpt4 key购买 nike

请考虑以下场景。宠物主人可能有多只猫,也可能有多只狗。有些狗与同一主人的一些猫有亲缘关系(即它们打架:-))。

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

enter image description here

最佳答案

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

enter image description here

由于 CatDog.OwnerId 只是一个字段,因此它无法识别每一行的多个所有者,并且由于它是针对两种动物的 FK,因此该所有者必须与猫和狗的所有者相匹配。

换句话说,猫只能与同一主人的狗产生联系。

如您所见,猫和狗的识别方式与您可能预期的不同。猫由其主人识别,并通过其 CatNo 与同一主人的其他猫区分开来。对于狗来说也是如此。

<小时/>

如果您需要一个“更简单”的 key ,您始终可以添加一个代理 key ,或者,您可以通过“滥用”UNIQUE 来完全消除 CatNoDogNo仅用于迁移 OwnerId 的目的的约束:

enter image description here

(U1 表示 UNIQUE 约束。)

现在您可以更简洁地识别动物,但有一个缺点:从强制唯一性的角度来看,UNIQUE 约束是完全多余的。它是 PK 的超集,并且 PK 本身就具有独特性。 UNIQUE 约束的唯一目的是使 CatDog.OwnerId 能够引用 Cat.OwnerId(和 Dog.OwnerId) - 大多数 DBMS 都需要外键的父端点作为键。

某些 DBMS ( Oracle ) 允许您仅使用一个索引来强制执行 PK 和 UNIQUE 约束,但大多数不允许。每个额外的索引都会损害插入/更新/删除性能。

关于database-design - 关系设计场景: restrict children relations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12622760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com