Вне аргумента о том, следует ли когда-либо использовать NULL: я несу ответственность за существующую базу данных, которая использует NULL для обозначения отсутствующих или никогда не вводимых данных. Это отличается от пустой строки, что означает, что пользователь установил это значение и выбрал «пусто».
Другой исполнитель проекта твердо придерживается мнения, что NULL для меня не существуют; Я никогда не использую NULL, и никто другой не должен, по обе стороны аргумента. Однако меня смущает то, что, поскольку команда подрядчика ДЕЙСТВИТЕЛЬНО признает разницу между отсутствующим / никогда не введенным и намеренно пустым или указанным пользователем как неизвестным, они используют один символ `` Z '' во всем своем коде и хранимых процедурах для представления отсутствующих / никогда вводится с тем же значением, что и NULL во всей остальной базе данных.
Хотя наш общий клиент просил изменить это, и я поддержал этот запрос, команда считает это стандартной практикой среди администраторов баз данных, гораздо более продвинутых, чем я; они не хотят использовать NULL только на основании моего невежественного запроса. Итак, может ли кто-нибудь помочь мне преодолеть мое невежество? Есть ли какой-нибудь стандарт, небольшая группа людей или хотя бы один громкий голос среди экспертов по SQL, который выступает за использование буквы «Z» вместо NULL?
Обновлять
Мне нужно добавить ответ от подрядчика. Вот что он сказал, когда клиент попросил удалить специальные значения, чтобы разрешить NULL в столбцах без данных:
По сути, я спроектировал базу данных так, чтобы по возможности избегать значений NULL. Вот обоснование:
• NULL в поле строки [VARCHAR] никогда не требуется, потому что пустая строка (нулевой длины) предоставляет точно такую же информацию.
• NULL в целочисленном поле (например, значение ID) можно обработать, используя значение, которое никогда не встречается в данных (например, -1 для целочисленного поля IDENTITY).
• NULL в поле даты может легко вызвать сложности при вычислении даты. Например, в логике, которая вычисляет разницу в датах, такую как разница в днях между [RecoveryDate] и [OnsetDate], логика взорвется, если одна или обе даты имеют значение NULL - если только для обеих дат не делается явный допуск. быть NULL. Это дополнительная работа и дополнительное управление. Если для [RecoveryDate] и [OnsetDate] используются даты по умолчанию или даты-заполнители (например, 01.01.1900), математические вычисления могут показывать необычные значения, но логика дат не нарушится.
Обработка NULL традиционно была областью, в которой разработчики допускали ошибки в хранимых процедурах.
За 15 лет работы администратором баз данных я решил, что лучше по возможности избегать значений NULL.
Похоже, это подтверждает в основном отрицательную реакцию на этот вопрос. Вместо применения общепринятого подхода 6NF к проектированию NULL, используются специальные значения, чтобы избежать NULL везде, где это возможно. Я опубликовал этот вопрос непредвзято, и я рад, что узнал больше о том, что NULL полезны / NULL - это злые дебаты, но теперь я вполне спокойно называю подход «особых значений» полной ерундой.
пустая строка (нулевой длины) предоставляет точно такую же информацию.
Нет, это не так; в существующей базе данных, которую мы модифицируем, NULL означает, что никогда не вводился, а пустая строка означает, что введена как пустая.
Обработка NULL традиционно была областью, где разработчики допускали ошибки в хранимых процедурах.
Да, но эти ошибки были сделаны тысячи раз тысячами разработчиков, и уроки и предостережения, позволяющие избежать этих ошибок, известны и задокументированы. Как уже упоминалось здесь: принимаете ли вы значения NULL или отклоняете их, представление отсутствующих значений является решенной проблемой. Нет необходимости изобретать новое решение только потому, что разработчики продолжают делать легко устранимые (и легко идентифицируемые) ошибки.
В качестве сноски: я был администратором баз данных и разработчиком более 20 лет (что, безусловно, достаточно для меня, чтобы понять разницу между инженером базы данных и администратором базы данных). На протяжении всей моей карьеры я всегда был в лагере полезности нулевых значений, хотя я знал, что несколько очень умных людей не соглашались с этим. Я крайне скептически относился к подходу с особыми ценностями, но недостаточно хорошо разбирался в академиках «Как избежать нулевого и правильного пути», чтобы занять твердую позицию. Я всегда люблю узнавать что-то новое - и через 20 лет мне еще есть чему поучиться. Спасибо всем, кто сделал это обсуждение полезным.
WHERE Column = NULL
и был сбит с толку, почему он не получил никаких результатов. - person Mike Caron   schedule 10.07.2011NULL
, могу я порекомендовать короткую статью Как обрабатывать недостающую информацию без использования NULL (ссылка на PDF-файл из Домашняя страница Третьего манифеста) - Кстати, я не думаю, чтоNULL
s всегда плохо, но замена его на'Z'
почти определенно плохая идея. . - person stakx - no longer contributing   schedule 10.07.2011null
в базе данных или перейти к таблицам 6NF и просто не добавлять записи для отсутствующих данных, не имеет значения; дело в том, что отсутствующие данные - это решенная проблема. Вы можете сделать то же самое, и у обоих есть свои последователи и недоброжелатели, но никто (и я готов сделать такое обобщение), кто знает, что они делают, не порекомендует универсальное магическое значение, которое оптовая заменаnull
. - person Adam Robinson   schedule 11.07.2011