TSQL自定义约束 - 处理可以为空的外键

时间:2013-05-30 16:07:32

标签: sql-server tsql database-design

我需要以下数据库设计。

将为名为DEVICE的所有设备提供一个表,并为名为ROOM的房间提供一个表。必须将每个设备分配给另一个设备或房间。目前,我有一个可空的外键关系连接Device to Room,用于字段名称Device.RoomId和另一个可以为空的外键关系,将Device连接回Device.ContainerId。

是否有更合适的设计可以通过数据库约束/ fk关系强制执行?我意识到应该编写好的代码来防止存储坏数据,但我希望增加db实施规则的安全性。

1 个答案:

答案 0 :(得分:2)

听起来不错,但是,如果你还没有,你可以添加一个检查约束,以确保其中一个父亲是NOT NULL

考虑以下伪代码。

CREATE TABLE Device (
    DeviceId int NOT NULL PRIMARY KEY,
    Name string NOT NULL UNIQUE,
    ParentDeviceId int NULL FOREIGN KEY Device (DeviceId),
    ParentRoomId int NULL FOREIGN KEY Room (RoomId),
    CHECK (
        (
            ParentDeviceId IS NULL
                AND ParentRoomId IS NOT NULL
        ) OR (
            ParentDeviceId IS NOT NULL
                AND ParentRoomId IS NULL
        )
    )
)

CREATE TABLE Room (
    Room Id int NOT NULL PRIMARY KEY,
    Name string NOT NULL UNIQUE
)