Есть несколько различных возражений против использования NULL. Некоторые из возражений основаны на теории баз данных. В теории нет разницы между теорией и практикой. На практике есть.
Это правда, что полностью нормализованная база данных может вообще обходиться без NULLS. Любое место, где необходимо пропустить значение данных, - это место, где можно пропустить всю строку без потери информации.
На практике декомпозиция таблиц в такой степени не служит большой полезной цели, и программирование, необходимое для выполнения простых операций CRUD над базой данных, становится более утомительным и подверженным ошибкам, а не меньшим.
Есть места, где использование NULLS может вызвать проблемы: по сути, они вращаются вокруг следующего вопроса: что в действительности означает отсутствие данных? Все, что NULL действительно передает, - это то, что в данном поле не хранится значение. Но программисты логических выводов, опирающиеся на отсутствующие данные, иногда неверны, и это вызывает много проблем.
Данные могут отсутствовать в местоположении по разным причинам. Вот некоторые из них:
Данные неприменимы в этом контексте. например имя супруга для одного человека.
Пользователь формы ввода данных оставил поле пустым, и приложение не требует ввода в поле.
Данные копируются в базу данных из другой базы данных или файла, и в источнике отсутствовали данные.
Существует необязательное отношение, закодированное во внешнем ключе.
В базе данных Oracle была сохранена пустая строка.
Вот несколько советов о том, когда следует избегать NULLS:
Если в ходе обычного ожидаемого программирования разработчики запросов должны написать много кода ISNULL, NV, COALESCE или аналогичного кода, чтобы заменить допустимое значение на NULL. Иногда лучше сделать замену во время хранения, при условии, что хранится «реальность».
Если счетчики могут быть отключены, потому что были подсчитаны строки, содержащие NULL. Часто этого можно избежать, просто выбрав count (MyField) вместо count (*).
Вот одно место, где вам, к счастью, лучше привыкнуть к NULLS и программировать соответственно: всякий раз, когда вы начинаете использовать внешние объединения, такие как LEFT JOIN и RIGHT JOIN. Весь смысл внешнего соединения, в отличие от внутреннего, состоит в том, чтобы получать строки, когда некоторые совпадающие данные отсутствуют. Недостающие данные будут представлены как NULLS.
Мой итог: не отвергайте теорию, не понимая ее. Но узнайте, когда отступать от теории, а также как ей следовать.