3

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

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

在此处输入图像描述

4

1 回答 1

1

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

在此处输入图像描述

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

换句话说,一只猫只能与同一主人的一只狗相关联。

如您所见,猫和狗的识别方式与您可能预期的不同。一只猫由它的主人识别,并通过它的CatNo. 狗也一样。


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

在此处输入图像描述

U1表示唯一约束。)

现在您可以更简洁地识别动物,但有一个缺点:从强制唯一性的角度来看,UNIQUE 约束是完全多余的。它是 PK 的超集,并且 PK 本身就可以很好地执行唯一性。UNIQUE 约束的唯一目的是允许CatDog.OwnerId引用Cat.OwnerId(and Dog.OwnerId) - 大多数 DBMS 要求外键的父端点是键。

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

于 2012-09-27T17:31:42.930 回答