如何将(可选)一个表示为(可选)一个关系

时间:2015-06-26 16:52:00

标签: sql sql-server database-design

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

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

我不确定如何处理这个问题。我应该在B中引用A和在B中引用B吗?我是否应该只在A中引用B(并强制另一个检查触发器或代码中)?

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

1 个答案:

答案 0 :(得分:0)

请尝试这个例子,

    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