Вне аргумента того, должны ли когда-либо использоваться значения NULL: я отвечаю за существующую базу данных, которая использует NULL для обозначения «отсутствующих или никогда не вводимых» данных. Он отличается от пустой строки, что означает «пользователь установил это значение и выбрал« пустой ».»
Другой подрядчик проекта твердо убежден в том, что «NULL для меня не существует; я никогда не использую NULL, и никто другой не должен, ни одна из сторон аргумента». Однако меня смущает то, что, поскольку команда подрядчика признает разницу между «отсутствующим / никогда не введенным» и «преднамеренно пустым или указанным пользователем как неизвестный», они используют один символ «Z» в своем коде и хранимых процедурах для обозначают «отсутствует / никогда не вводится» с тем же значением, что и NULL, в остальной части базы данных.
Хотя наш общий клиент попросил изменить это, и я поддержал этот запрос, команда называет это «стандартной практикой» среди администраторов баз данных, гораздо более продвинутых, чем я; они не хотят переходить на NULL, основываясь только на моем невежественном запросе. Итак, кто-нибудь может помочь мне преодолеть мое невежество? Есть ли среди экспертов по SQL какой-либо стандарт или небольшая группа людей, или даже один громкий голос, который выступает за использование Z вместо NULL?
Обновление
У меня есть ответ от подрядчика, чтобы добавить. Вот что он сказал, когда клиент попросил удалить специальные значения, чтобы разрешить NULL в столбцах без данных:
По сути, я спроектировал базу данных, чтобы по возможности избегать значений NULL. Вот обоснование:
• Значение NULL в строке [VARCHAR] никогда не требуется, поскольку пустая (нулевая длина) строка предоставляет точно такую же информацию.
• Значение NULL в целочисленном поле (например, значение идентификатора) может обрабатываться с использованием значения, которое никогда не встречается в данных (например, -1 для целочисленного поля IDENTITY).
• Значение NULL в поле даты может легко вызвать осложнения в вычислениях даты. Например, в логике, которая вычисляет разницу между датами, например разницу в днях между [RecoveryDate] и [OnsetDate], логика будет взорвана, если одна или обе даты равны NULL - если для обеих дат не сделано явное допущение быть NULL. Это дополнительная работа и дополнительная обработка. Если для [RecoveryDate] и [OnsetDate] (например, «1/1/1900») используются даты «по умолчанию» или «местозаполнитель», математические вычисления могут показывать «необычные» значения - но логика дат не будет взорвана.
Обработка NULL традиционно была областью, где разработчики допускают ошибки в хранимых процедурах.
За 15 лет работы в качестве администратора базы данных я решил, что лучше всего избегать значений NULL, где это возможно.
Кажется, это подтверждает в основном негативную реакцию на этот вопрос. Вместо применения принятого подхода 6NF для проектирования NULL, используются специальные значения, чтобы «избегать NULL, где это возможно». Я оставил этот вопрос без предубеждений, и я рад, что узнал больше о дебатах «NULLs полезны / NULLs являются злом», но теперь мне вполне удобно называть подход «особыми ценностями» полной бессмыслицей.
пустая (нулевая длина) строка предоставляет точно такую же информацию.
Нет, это не так; в существующей базе данных, которую мы модифицируем, NULL означает «никогда не вводится», а пустая строка означает «введено как пустое».
Обработка NULL традиционно была областью, где разработчики допускают ошибки в хранимых процедурах.
Да, но эти ошибки были сделаны тысячи раз тысячами разработчиков, и уроки и предостережения о том, как избежать этих ошибок, известны и задокументированы.Как уже упоминалось здесь: независимо от того, принимаете вы или отклоняете NULL, представление пропущенных значений является решенной проблемой .Нет необходимости изобретать новое решение только потому, что разработчики продолжают допускать легко преодолеваемые (и легко идентифицируемые) ошибки.
В качестве сноски: я был DBEи разработчик более 20 лет (что, безусловно, достаточно для меня, чтобы узнать разницу между инженером базы данных и администратором базы данных).На протяжении всей моей карьеры я всегда был в лагере «NULLs полезны», хотя я знал, что несколько очень умных людей не согласились.Я чрезвычайно скептически относился к подходу «особых ценностей», но не достаточно хорошо разбирался в учениях «Как избежать NULL правильного пути», чтобы занять твердую позицию.Я всегда люблю узнавать что-то новое, и у меня еще есть чему поучиться через 20 лет.Спасибо всем, кто помог сделать это обсуждение полезным.