2013-05-30 2 views
0

У меня есть требование для следующего проекта базы данных.TSQL Custom Constraint - работа с обнуляемыми внешними ключами

Будет таблица для всех устройств с именем DEVICE и стол для комнат с именем ROOM. Каждое устройство должно быть назначено либо другому устройству, либо комнате. В настоящее время у меня есть отношение NULL для связи с внешним ключом Device to Room для имени поля Device.RoomId и еще одной связи с NULL-интерфейсом, соединяющей устройство с самим собой для Device.ContainerId.

Есть ли более подходящий дизайн, который может быть применен посредством связей базы данных/fk? Я понимаю, что хороший код должен быть написан для предотвращения хранения плохих данных, но я хотел бы добавить безопасность соблюдения правил db.

ответ

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 
) 
Смежные вопросы