На главную страницу
Апология NULL-значений
Моисеенко С.И.
Смысл NULL-значения - отсутствие информации или неприменимость данного атрибута
в данном кортеже.
Можно спросить: "Зачем иметь атрибут, если его значение неприменимо?". Ответ на
этот вопрос лежит в области моделирования предметной области. Рассмотрим,
например, схему БД "Компьютеры". Она представляет собой реляционную модель
связи "тип-супертип". Сущностями предметной области здесь являются модели
компьютерной продукции (супертип), при этом каждый тип продукции (ПК,
ПК-блокнот или принтер) отображается в отдельную таблицу со связями "многие к
одному" с таблицей Product.
Такая модель обеспечивает высокую степень нормализации (3НФ). Однако это не
единственный способ. Можно было бы хранить всю информацию в одной таблице,
которая содержала бы как общие для всех моделей атрибуты (например, цена -
price), так и атрибуты, которые имеют смысл только для моделей определенного
типа (например, цвет - color - для характеристики принтеров). Для такой схемы
NULL-значение является вполне оправданным именно в смысле неприменимости
характеристики, т.е. NULL в столбце color , будет говорить о том, что
эта характеристика не имеет отношения, скажем, к моделям ПК.
Вернемся теперь ко второй ипостаси NULL-значений - отсутствию информации. Если
мы решим отказаться от использования NULL-значений, то должны предложить
альтернативу. Естественным путем является использование значения по умолчанию,
которое будет подставлено в соответствующий столбец при отсутствии информации.
Следует заметить, что таких значений по умолчанию должно быть, по меньшей мере,
столько, сколько различных типов данных поддерживается СУБД (целые, строки,
дата-время, …).
Рассмотрим, например, таблицу Laptop и поле price (цена). Пусть предметная
область такова, что на момент ввода информации о моделях ПК-блокнотов их цена
не всегда известна. При выборе значения по умолчанию мы должны ограничиться
только значениями, допустимыми для поля price. Тип данных для столбца (money)
заставляет нас ограничиться только числовыми значениями, совместимыми с данным
типом и доменными ограничениями (ограничение типа CHECK), наложенными на
допустимые значения для этого столбца. Любое положительное значение в качестве
значения по умолчанию будет вызывать путаницу, т.к. невозможно будет отличить
"истинное" значение цены от заменителя отсутствующей цены. Поэтому следует
выбрать нуль или любое отрицательное значение. А теперь поговорим о том, чем
плоха такая замена.
Для примера рассмотрим информацию о моделях 1298, имеющихся в таблице Laptop.
Чтобы познакомиться с данными, выполним запрос:
SELECT * FROM laptop WHERE model=1298
Вот результаты выполнения этого запроса:
code |
model
|
speed
|
ram |
hd |
price |
screen |
1 |
1298 |
350 |
32 |
4 |
700.0 |
11 |
4 |
1298 |
600 |
64 |
10 |
1050.0 |
15 |
6 |
1298 |
450 |
64 |
10 |
950.0 |
12 |