5

问题视觉

考虑上面的问题,“CommonChild”实体可以是子类型 A 或 B,但不是 C。我将如何在关系 [SQL] 数据库中设计物理模型?

理想情况下,该解决方案将允许...

  1. 用于识别 CommonChild 与其相关子类型之间的关系。
  2. 1:N 的关系。

可能的解决方案

  1. 向超类型添加额外的子类型,并将子类型 A 和 B 移动到新的子类型下。然后,CommonChild 可以对新创建的子类型进行 FK 约束。适用于上述情况,但如果添加了一个可以与子类型 A 和 C 有关系但不与 B 有关系的附加实体,则不能。

  2. 在 CommonChild 和 SuperType 之间添加 FK 约束。在允许新元组进入 CommonChild 之前,对超类型的鉴别器使用触发器或检查约束(w/UDF)。看起来很简单,但现在 CommonChild 几乎看起来像是新的子类型本身(它不是)。

  3. 我的模型存在根本缺陷。改造和问题应该消失。

我正在寻找其他可能的解决方案或确认我已经提出的上述解决方案之一。

谢谢!


编辑

我将实施 Branko Dimitrijevic 提供的专有外键解决方案(请参阅接受的答案)。

在这种情况下,我将稍作修改:

  1. 超类型、子类型和“CommonChild”都具有相同的 PK 并且;
  2. PK 是 3 列复合材料。

修改是创建一个中间表,其唯一作用是强制子类型和“CommonChild”之间的排他 FK 约束(Dimitrijevic 提供的精确模型减去“CommonChild”属性。)。CommonChild 的 PK 将对中间表具有正常的 FK 约束。

这将防止“CommonChild”拥有 2 组 3 列复合 FK。另外,由于标识关系是从超类型到“CommonChild”维护的,因此 [read] 查询可以有效地完全忽略中间表。

4

2 回答 2

3

看起来您需要排他外键的变体:

CREATE TABLE CommonChild (
    Id AS COALESCE(SubTypeAId, SubTypeBId) PERSISTED PRIMARY KEY,
    SubTypeAId int REFERENCES SubTypeA (SuperId),
    SubTypeBId int REFERENCES SubTypeB (SuperId),
    Attr6 varchar,
    CHECK (
        (SubTypeAId IS NOT NULL AND SubTypeBId IS NULL)
        OR (SubTypeAId IS NULL AND SubTypeBId IS NOT NULL)
    )
);

这里有几点需要注意:

  • 有两个可以为 NULL 的FOREIGN KEY。
  • 有一个 CHECK 允许这些 FK 中的一个恰好为非 NULL。
  • 有一个计算列Id等于 FK 之一(以当前非 NULL 为准),它也是 PRIMARY KEY。这可确保:
    • 一个父母不能有多个孩子。
    • “孙子”表可以CommonChild.Id直接从其 FK 引用。SuperType.Id有效地一直向下传播。
    • 我们不必弄乱 NULL-able UNIQUE 约束,这在 MS SQL Server 中是有问题的(见下文)。

一种与 DBMS 无关的做类似事情的方式是......

CREATE TABLE CommonChild (
    Id int PRIMARY KEY,
    SubTypeAId int UNIQUE REFERENCES SubTypeA (SuperId),
    SubTypeBId int UNIQUE REFERENCES SubTypeB (SuperId),
    Attr6 varchar,
    CHECK (
        (SubTypeAId IS NOT NULL AND SubTypeAId = Id AND SubTypeBId IS NULL)
        OR (SubTypeAId IS NULL AND SubTypeBId IS NOT NULL AND SubTypeBId = Id)
    )
)

不幸的是,MS SQL Server 不允许包含多个 NULL 的 UNIQUE 列,这在大多数 DBMS 中是不允许的。但是,如果您不想直接引用SubTypeAIdSubTypeBId直接引用,则可以省略 UNIQUE 约束。

于 2013-08-18T08:44:34.783 回答
3

想知道我在这里错过了什么?

诚然,没有具体问题的措辞很难,但事情确实有点颠倒。


在此处输入图像描述

于 2013-08-18T18:23:38.233 回答