我对以下数据库设计有要求。
将有一个名为 DEVICE 的所有设备的表和一个名为 ROOM 的房间表。每个设备必须分配给另一个设备或房间。目前,对于字段名称 Device.RoomId,我有一个可空的外键关系连接设备到 Room,而另一个可空的外键关系将设备连接回自身以获取 Device.ContainerId。
是否有更合适的设计可以通过数据库约束/fk 关系来实施?我意识到应该编写好的代码来防止存储坏数据,但我希望增加 db 执行规则的安全性。
我对以下数据库设计有要求。
将有一个名为 DEVICE 的所有设备的表和一个名为 ROOM 的房间表。每个设备必须分配给另一个设备或房间。目前,对于字段名称 Device.RoomId,我有一个可空的外键关系连接设备到 Room,而另一个可空的外键关系将设备连接回自身以获取 Device.ContainerId。
是否有更合适的设计可以通过数据库约束/fk 关系来实施?我意识到应该编写好的代码来防止存储坏数据,但我希望增加 db 执行规则的安全性。
听起来不错,但如果您还没有,您可以添加一个检查约束以确保其中一个父母是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
)