【问题标题】:Relational design scenario: restrict children relations关系设计场景:限制子关系
【发布时间】:2012-09-27 13:39:18
【问题描述】:

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

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

【问题讨论】:

  • 在Cat表和Dog表的关系表中添加OwnerId即可。
  • @WahidBitar 仅此还不够 - 您必须确保连接表与猫和狗的相同所有者匹配,而不仅仅是任何所有者。为此,所有者的 PK 本质上需要在整个层次结构中传播。

标签: database-design model entity-relationship relational relational-model


【解决方案1】:

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

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

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

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


如果您需要一个“更简单”的键,您可以随时添加一个代理键,或者,您可以完全消除 CatNoDogNo,仅出于迁移 @987654328 的目的“滥用”UNIQUE 约束@:

U1 表示唯一约束。)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 2016-10-08
    • 2015-06-18
    • 1970-01-01
    • 2021-10-22
    • 2019-08-16
    • 2019-07-18
    • 2012-04-02
    相关资源
    最近更新 更多