我需要以下数据库设计。
将为名为DEVICE的所有设备提供一个表,并为名为ROOM的房间提供一个表。必须将每个设备分配给另一个设备或房间。目前,我有一个可空的外键关系连接Device to Room,用于字段名称Device.RoomId和另一个可以为空的外键关系,将Device连接回Device.ContainerId。
是否有更合适的设计可以通过数据库约束/ fk关系强制执行?我意识到应该编写好的代码来防止存储坏数据,但我希望增加db实施规则的安全性。
答案 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
)