(Оффтоп)
Sonic86Более того. Кодд (который, собственно, и создал реляционную теорию, а потом ввел и NULL), написал, кажется, три или четыре работы, где пытался подобрать "разумную" 3- или 4-значную логику для использования. Не вышло, Дарвен потом в обзоре замечал, что главная проблема введения многозначной логики — это исчезновение сокращенного вычисления AND и OR:
не обязательно равно
. А это — серьезный удар по возможности оптимизации запросов.
NULL вводился для обозначения "тут должна быть информация, но мы ее не знаем". Некоторые используют его как null-pointer, как "здесь вообще не должно быть никакой информации" — ну, например, если работник — самый главный начальник, у него колонка "Кто начальник?" должна быть пуста.
Так вот, можно обе эти ситуации разрулить и без NULL. Грубо говоря, если в столбце должен быть NULL — таблица разбивается на две, в одной этот столбец есть (незануляемый!), в другой этого столбца нет вовсе + наложены ограничения, что значения первичных ключей в этих двух таблицах не пересекаются. Получаем БД, в которой NULL-столбцов нет вовсе. А так как нет такого закона, что две таблицы должны обязательно храниться в двух различных B-деревьях — никакого штрафа на производительность при join-ах этих двух таблиц (в теории) нет.