Комментарий С.Кузнецова
Я полностью согласен с мнением господина Джонсона относительно
ряда некорректностей в схеме, предложенной господином Дейтом.
Однако я не могу согласиться с тем, что использование
неопределенных значений и многозначной логики во всех случаях
повышает выразительность языка и позволяет более естественно и
просто пользоваться всей содержащейся в базе данных информацией,
чем если ограничиться использованием выделенного значения
"значение неизвестно" и двузначной логики.
Все дело в том, что (по крайней мере в языке SQL) логическое
значение unknown является запрещающим, т.е. если для некоторой
строки таблицы условие выборки вычисляется в unknown, то строка
не входит в результирующую таблицу запроса. По этому поводу
трехзначная логика действительно помогает более сжато
формулировать условия ограничения, но никак не содействует
извлечению из базы данных возможной информации.
Если обратиться к первому примеру Джонсона, то предположим, что
нас интересуют цели, для которых хотя бы одно из прицельных
устройств смогло выдать координаты (конечно, если координаты
выдали оба прицельных устройства, то эти координаты должны
совпадать). Условие выборки для этого запроса будет иметь
следующий совсем непростой вид:
(coordinate1 = coordinate2) OR ((coordinate1 IS NOT NULL) AND
(coordinate2 IS NULL)) OR ((coordinate1 IS NULL) AND (coordinate2 IS NOT NULL))
Попробуйте написать это по-другому! Здесь в чистом виде работает
двузначная логика и специальное значение NULL. Трехзначная логика
не помогает.
Аналогично обстоят дела в более простом случае второго примера:
"Сколько раз Джонс и Смит смогли бы сыграть вничью?". Понятно,
что хотелось бы написать условие в виде:
((column1 = column2) = true) OR ((column1 = column2) = unknown)
Но в языке SQL в таком виде условия задавать нельзя (да если бы и
было можно, то так ли это просто и естественно?). Поэтому
придется переформулировать условие следующим образом:
(column1 = column2) OR (column1 IS NULL) OR (column2 IS NULL)
Это ровно то же самое, что потребовалось бы написать при
использовании схемы Дейта для получения корректного ответа. Опять
работает двузначная логика и специальное значение NULL.
Ну и где же здесь повышение выразительной мощности и упрощение
формулировки запросов?