首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关系设计场景:限制子关系

关系设计场景:限制子关系
EN

Stack Overflow用户
提问于 2012-09-27 13:39:18
回答 1查看 144关注 0票数 3

请考虑以下情况。宠物主人可能有多只猫,也可能有多只狗。有些狗和同一主人的猫有亲缘关系(他们打架:-)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-27 17:31:42

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

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

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

正如你所看到的,猫和狗的识别方式与你可能预期的不同。猫是由它的主人识别的,并通过它的CatNo区别于同一主人的其他猫。狗也是。

如果您需要一个“更简单的”键,您可以只添加一个代理键,或者也可以通过“滥用”唯一约束来完全消除CatNoDogNo,仅用于迁移OwnerId

( U1表示唯一的约束。)

现在您可以更简洁地识别动物,但也有一个缺点:从执行唯一性的角度来看,唯一的约束是完全多余的。这是一个超级集的PK和PK是执行自己的独特性,只是很好。唯一约束的唯一目的是使CatDog.OwnerId能够引用Cat.OwnerId (和Dog.OwnerId) -大多数DBMSes都要求外键的父端点是键。

一些DBMSes (甲骨文)只允许您使用一个索引来执行PK和唯一约束,但大多数不会。每增加一个索引都会损害插入/更新/删除性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12622760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档