Преимущество обнуляемых иностранных ключей - PullRequest
3 голосов
/ 28 августа 2010

Мне нужно построить таблицу для некоторых новых компонентов, которые будут отслеживать доступные и использованные запасы.Это будет что-то вроде этого:

CREATE TABLE components
(
   component_Id int NOT NULL PRIMARY KEY,
   workOrder_Id int FOREIGN KEY,
   componentSerial varchar(25) NOT NULL,
   foo varchar(50),
   bar int,
   information nvarchar(250)
   date DateTime
)

Какие преимущества дает возможность использовать FOREIGN KEY workOrderID, если он еще не использовался, по сравнению с NOT NULL и значением по умолчанию 0?
Для меня то, что это может быть обнуляемым, имеет больше смысла.

Я смотрел на некоторые похожие ситуации, но я не уверен, почему кто-то выбрал бы одну над другой.

Ответы [ 2 ]

9 голосов
/ 28 августа 2010

Если у вас есть внешний ключ со значением по умолчанию 0, это означает, что вы должны всегда поддерживать существование workOrder с идентификатором 0, как fake-workOrder для неназначенных компонентов для ссылки.Это довольно уродливый хак.

(Это предполагает, что ваш FOREIGN KEY на самом деле является правильным, принудительным внешним ключом, что, безусловно, желательно, но не произошло бы, если бы вы, скажем, использовали MyISAM.Пример не работает для меня, так как просто говорю FOREIGN KEY сам по себе, не указывая, какой столбец он REFERENCES не является допустимым SQL.)

Если вам не нравятся NULL, альтернативное решениесоединение таблиц, сопоставляющих компоненты с workOrders, с ограничением UNIQUE для component_Id.

6 голосов
/ 28 августа 2010

Преимущество внешнего ключа, допускающего значение NULL, совпадает с преимуществом любого другого столбца, допускающего значение NULL. Если у вас нет известного или применимого значения для хранения в данной строке, вы можете использовать NULL вместо выбора «специального значения», котороеозначает отсутствие значения.

...