Книги и статьи по SQL Rambler's Top100 Switch language to: English 29 октября 2020 г. 5:00:43


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Апология 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

Рассмотрим задачу получения средней цены модели 1298. Пока все цены известны решение этой задачи не вызывает никаких сомнений:

SELECT model, AVG(price) avg_price
    FROM laptop
    WHERE model=1298
    GROUP BY model

model avg_price
1298 900.0

Пусть теперь цена модели с кодом 4 неизвестна. Если, как было решено ранее, мы будем заменять неизвестное значение, скажем, нулем (UPDATE laptop SET price=0 WHERE code=4), то получим заведомо неверное среднее значение цены - 550.0

Если же мы будем использовать NULL-значение, то результат будет вполне правильным - 825.0, т.к. NULL-значения будут игнорироваться при группировке, в результате чего среднее значение будет вычисляться только по моделям с известной ценой (т.е. среднее по двум моделям).

Итак, как я постарался показать, NULL-значение является неотъемлемой особенностью реляционной модели, и вместо критики предлагаю научиться корректно работать с такими значениями.

Приведенные здесь примеры можно выполнить непосредственно на сайте, установив флажок "Без проверки" на странице с упражнениями на SELECT.

На главную страницу

Print  Версия для печати


Использование любых материалов данного сайта возможно только
при условии обязательного размещения прямой ссылки на сайт
http://www.sqlbooks.ru
на каждой странице, где размещены используемые материалы.

 Начало   Статьи    Книги 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.