2013-05-30 26 views
0

我對以下數據庫設計有要求。TSQL自定義約束 - 處理可空的外鍵

所有名爲DEVICE的設備和名爲ROOM的房間都有一張表。每個設備必須分配給其他設備或房間。目前,我有一個可空的外鍵關係連接Device to Room,用於字段名稱Device.RoomId和另一個可爲null的外鍵關係,將Device加回到Device.ContainerId自身。

是否有更合適的設計可以通過數據庫約束/ fk關係強制執行?我意識到應該編寫好的代碼來防止存儲錯誤的數據,但我希望增加數據庫執行規則的安全性。

回答

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 
)