Использует ли Null значение для плохой практики? - PullRequest
4 голосов
/ 19 января 2009

Если я использую ноль как представление всего в таблице базы данных, это плохая практика?

т.е.

У меня есть таблицы: myTable (ID) и myRelatedTable (ID, myTableID)

myRelatedTable.myTableID представляет собой FK myTable.ID

Я хочу выполнить следующее: если myRelatedTable.myTableID равен нулю, моя бизнес-логика будет интерпретировать это как связанную со всеми строками myTable.

Причина, по которой я хочу это сделать, заключается в том, что у меня есть неизвестное количество строк, которые можно вставить в myTable после создания строки myRelatedTable, и некоторые строки в myRelatedTable должны ссылаться на все существующие строки в myTable.

Ответы [ 6 ]

13 голосов
/ 19 января 2009

Я думаю, вы могли бы согласиться с тем, что было бы неправильно использовать число 3 для представления значения, отличного от 3 .

По той же причине плохая идея использовать NULL для представления чего-либо, кроме отсутствия значения.

Если вы не согласны и закрутите NULL для какой-либо другой цели, программисты по обслуживанию, которые придут за вами, не будут вам благодарны.

1 голос
/ 19 января 2009

В идеале не должно быть нулей вообще. Должна быть другая таблица для представления отношения.

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

1 голос
/ 19 января 2009

Не очень хорошая идея, потому что тогда вы вообще не можете использовать факт «связанный со всеми записями» в SQL-запросах. В какой-то момент вы, вероятно, захотите / должны сделать это.

0 голосов
/ 20 января 2009

То, что вы опубликовали, а именно то, что NULL во внешнем ключе устанавливает связь со всеми строками в ссылочной таблице, очень нестандартно. Сверху головы, я думаю, это чревато опасностями.

Что большинство людей, которые используют NULL в FK, имеют в виду, что оно устанавливает связь с NONE строк в ссылочной таблице. Это распространено в случае необязательных отношений, которые могут встречаться ноль раз.

Пример: у нас есть база данных HR, с таблицей под названием «СОТРУДНИКИ». У нас есть два столбца, которые называются «EmpID» и «SupervisorID». (Многие люди называют первый столбец просто «ID»). У каждого сотрудника в таблице есть запись под SupervisorID, за единственным исключением генерального директора компании. Генеральный директор имеет значение NULL в столбце SupervisorID, что означает, что у главного исполнительного директора нет руководителя. Генеральный директор подотчетен BOD, но он не представлен в SupervisorID.

Что вы можете подразумевать под отношением со ВСЕМИ строками в ссылочной таблице, так это: ВОЗМОЖНАЯ связь между рассматриваемой строкой и ЛЮБОЙ из строк в ссылочной таблице. Когда вы начинаете задавать вопросы о фактах, которые являются истинными в реальном мире, но неизвестны базе данных, вы открываете целую большую банку червей.

0 голосов
/ 19 января 2009

Да, по той простой причине, что NULL представляет без значения . Не особая ценность; не пустое значение, но ничего.

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

0 голосов
/ 19 января 2009

Я не думаю, что NULL - лучший способ сделать это, но вы можете использовать отдельный столбец tinyInt, чтобы указать, что строка в MyRelatedTable связана со всем в MyTable, например, MyRelatedTable.RelatedAll. Это сделало бы это более явным для других, которые должны поддерживать это. Тогда вы могли бы сделать какой-то запрос Union, например,

SELECT M.ID, R.ID AS RelatedTableID,....
FROM MyTable M INNER JOIN MyRelated Table R ON R.myTableId = M.Id
UNION
SELECT M.ID, R.ID AS RelatedTableID,....
FROM MyTable M, MyRelatedTable R
WHERE R.RelatedAll = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...