UNK и равенство
После объяснения того, что его схема потребует заменить каждый
домен (скажем, домен XXXX) новым доменом XXXX_OR_UNK, Дейт
переходит к рассмотрению различных операций над специальным
значением UNK. (Мне кажется, что предложенное Дейтом именование
новых доменов может привести к заблуждению, поскольку эти домены
содержат как реальные значения, так и UNK, а не одно или другое.
Обсуждение Дейта было бы немного более понятным, если бы домены с
именами XXXX_OR_UNK понимались как содержащие значения XXXX и
значение UNK.) Он начинает с операции установления равенства и
после определения операции применительно к специальному значению
UNK говорит: "Заметим, что из определения следует, что сравнение
'UNK=UNK' вырабатывает значение true. Здесь нет никакой
трехзначной логики!" (январь 1997 г.).
На самом деле, трудно было бы найти лучший пример потребности в
трехзначной логике! И поскольку именно этот вопрос определяет то,
может ли подход со специальными значениями обеспечить ту же
выразительность, что и MVL, мы должны очень тщательно
проанализировать утверждение Дейта о UNK и равенстве.
Рассмотрим таблицу с двумя столбцами и 100 строками, каждая из
которых содержит пару UNK. Предположим, что домен каждого столбца
включает a) целые числа и b) UNK. Следовательно, для каждой
строки с реальными значениями в обоих столбцах (числа от 1 до
100) шансы того, что строка содержит одинаковые значения,
составляют 1 к 10000 (100*100). Шансы того, что во всех строках
значения столбцов будут одинаковы и того меньше (1 к миллиону).
Предположим, что на интерфейс базы данных подается запрос
"Сколько строк в этой таблице содержат столбцы с равными
значениями" (с использованием схемы со специальными значениями).
В соответствии с определением Дейта ответом будет "Все 100". Но
поскольку мы не знаем реальных значений чисел во всех строках,
шансы того, что этот ответ правильный, составляют 1 к миллиону!
Та ли это схема, которую хотелось бы использовать для обращения к
базе данных за информацией?
Серьезность последствий неадекватности подхода Дейта зависит от
ситуации. Например, предположим, что столбцы чисел - это
координаты ста целей, вычисленные независимыми прицельными
механизмами для системы наведения ракетного крейсера. Пусть для
безопасности применяется правило, что ракета запускается только в
том случае, когда прицельные механизмы выдают одинаковые
координаты. И, наконец, предположим, что условия стрельбы
настолько неудачны, что для всех 100 целей прицельные механизмы
не могут вычислить координаты. Поскольку каждый из них работает с
доменом TARGETING_COORDINATE_OR_UNK, он занесет в свой столбец
значение UNK во всех 100 строках.
Теперь используем интерфейс, основанный на новой схеме Дейта,
чтобы определить, по каким из ста целей следует стрелять. Мы
сказали: "Стрелять по каждой из 100 целей в том и только в том
случае, когда сравнение coordinate1=coordinate2 дает значение
true". И все 100 ракет будут запущены, хотя ни один из прицельных
механизмов не обеспечил координат ни одной цели!
Конечно, если бы мы догадались добавить к условию конъюнктивное
требование истинности сравнения coordinate1 != UNK, то ракеты не
были бы запущены.
Если Дейт захочет, он может назвать пересмотренный запрос
"решением", но для меня очевидно, что здесь что-то неправильно.
Пользователя заставляют компенсировать ошибку в семантике
оператора сравнения в схеме Дейта. Она связана с тем, что как
всем известно, ответом на вопрос "Равны ли два неизвестных
значения" не является "Да". И если Дейт ответит, что при
определении равенства специального значения UNK он не имел в виду
"неизвестные значения", то он должен признать, что его схема не
представляет семантику неизвестных значений "реального мира".