【问题标题】:How to represent an (optional) one to (optional) one relationship如何表示(可选)一对(可选)关系
【发布时间】:2015-09-13 17:05:52
【问题描述】:

我正在从 UML 图创建一个数据库。我试图编写一个我从未遇到过的案例,它是(可选的)一对(可选的)一对一关系。

我有两个表,我们称它们为 A 和 B。A 可以通过 0..1 关系引用 B。问题是 B 最多应该被一个 A 对象引用。

我不确定我应该如何处理这个问题。我应该在 B 中引用 A 并在 a 中引用 B 吗?我应该只在 A 中添加对 B 的引用(并在触发器或代码中强制进行其他检查)吗?

如果有帮助,这些链接将不会经常创建,并且只会一一创建,因此如果在代码或触发器中进行检查,则不会出现性能问题。但我宁愿通过数据库设计来禁止不良数据,而不仅仅是通过代码。

【问题讨论】:

  • 外键的唯一约束?
  • B 的引用似乎应该在 A 中。这样您就可以限制对 B 的 ID 有多个引用的行。
  • @PM77-1 不错且简单的解决方案。我不敢相信我没有想到这个。你应该把它作为一个答案。
  • 我认为 UNIQUE 约束将只允许一行具有 NULL 值。这符合您对 0..1 关系的要求吗?
  • 看来,unlike MySQLSQL Server 确实不允许在一个 UNIQUE 列中允许多个 NULL 值。

标签: sql sql-server database-design


【解决方案1】:

请试试这个例子,

    CREATE TABLE dbo.TableA
    (
        col tinyint NOT NULL ,
        Primary KEY(Col)
    );

    CREATE TABLE dbo.TableB
    (
        colRef    tinyint NULL
    );

    Alter Table TableB
    ADD FOREIGN KEY (ColRef)
    REFERENCES TableA(Col)

    INSERT dbo.TableA VALUES (1);
    INSERT dbo.TableA VALUES (2);

    GO
    CREATE VIEW dbo.TableBUnique
    WITH SCHEMABINDING AS
    SELECT b.colRef
    FROM dbo.TableB AS b
    WHERE b.colRef IS NOT NULL;

    GO
    CREATE UNIQUE CLUSTERED INDEX uci
    ON dbo.TableBUnique (colRef);
    GO
    INSERT dbo.TableB VALUES (1);
    INSERT dbo.TableB VALUES (2);
    INSERT dbo.TableB VALUES (NULL);
    INSERT dbo.TableB VALUES (NULL);

    -- Error
    INSERT dbo.TableB VALUES (1); -- Duplicate Data
    INSERT dbo.TableB VALUES (3); -- Reference Not Exist

    GO

【讨论】:

    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多