Все говорят, и никто, кроме Дпортаса и Уолтера, даже не может понять вопрос. Итак, 95% людей в SO не понимают Нулевую проблему и чувствуют угрозу, потому что их базы данных полны нулей, они хотят преобразовать искателя. Бесценный. Как кто-нибудь собирается учиться, когда они спорят?
Хорошо для вас, для устранения Nulls. Я никогда не допускал значения Nulls ни в одной из моих баз данных.
Конечно, если пустые значения запрещены, недостающая информация должна быть обработана другими способами. К сожалению, эти другие средства слишком сложны, чтобы подробно обсуждать их здесь.
На самом деле это совсем не так сложно. Есть три варианта.
- Вот статья о Как справиться с пропавшим без вести
Информация без использования N Darll от H Darwen, это может помочь вам разобраться в проблеме.
1,1. Шестая Нормальная Форма - это ответ. Но вам не нужно нормализовать вашу всю базу данных до 6NF. Для каждого необязательного столбца вам нужна дочерняя таблица вне основной таблицы, только с PK, который также является FK, потому что это отношение 1 :: 0-1. Кроме PK, единственным столбцом является необязательный столбец.
Посмотрите на это Модель данных ; AssetSerial
на стр. 4 - классический случай: не все Assets
имеют SerialNumbers
; но когда они это сделают, я хочу, чтобы они сохранили их; более важно, я хочу убедиться, что они уникальны.
(Между прочим, для OO-людей это трехуровневая диаграмма классов в реляционной нотации, "наследование таблиц Concwete", ничего страшного, у нас это было 30 лет.)
* 1 035 * 1.2. Для каждой такой таблицы используйте View для предоставления формы таблицы 5NF. Конечно, используйте Null (или любое значение, подходящее для столбца), чтобы определить отсутствие столбца для любой строки. Но не обновлять через вид.
1.3 Не используйте прямые соединения для захвата столбца 6NF. Также не используйте внешние объединения (и сделайте так, чтобы сервер заполнил Null для пропущенных строк). Используйте подзапрос, чтобы заполнить столбец, и укажите значение, которое вы хотите вернуть для отсутствующего значения (кроме случаев, когда у вас есть Oracle, потому что его обработка подзапроса еще хуже, чем его обработка набора). Например. и просто например. Вы можете преобразовать числовой столбец в строку и использовать «Missing» для пропущенных строк.
Если вы не хотите заходить так далеко (6NF), у вас есть еще два варианта.
.
2. Вы можете использовать нулевые заменители. Я использую CHAR (0) для символьных колонн и 0 для числовых. Но я не допускаю этого для ФК. Очевидно, вам нужно значение, которое находится за пределами нормального диапазона данных. Это не позволяет использовать трехзначную логику.
.
3. В дополнение к (2) для каждого столбца Nullable необходим логический индикатор. Для примера столбца Sex
индикатор будет выглядеть примерно так: SexIsMissing
или SexLess
(извините). Это позволяет очень жесткую трехзначную логику. Многим людям в этих 5% нравится, потому что дБ остается на 5NF (и меньше таблиц); столбцы с отсутствующей информацией загружаются со значениями, которые никогда не используются; они используются только в том случае, если индикатор имеет значение false. Если у вас есть корпоративная база данных, вы можете заключить ее в функцию и всегда использовать UDF, а не необработанный столбец.
Конечно, во всех случаях вы никогда не сможете избежать написания кода, необходимого для обработки недостающей информации. Будь то ISNULL()
, или подзапрос для столбца 6NF, или Индикатор для проверки перед использованием значения, или UDF.
Если значение Null имеет конкретное значение ... , тогда оно не равно Null! По определению, Null - это неизвестное значение.