2009 г.
И снова о вечной проблеме отсутствующей информации
Сергей Кузнецов
В сентябрьском номере журнала ACM SIGMOD Record за 2008 г. опубликованы сразу две небольших статьи, формальным поводом к написанию которых явилась статья Клода Рубинсона (Claude Rubinson) NULL, трехзначная логика и неопределенность в SQL: критика критики Дейта, которая, в свою очередь, была опубликована в декабрьском номере того же журнала за 2007 г. Когда мы публиковали мой пересказ этой статьи в нашей библиотеке, я написал небольшую собственную заметку Критика критики критики Дейта, в которой постарался показать, что претензии Рубинсона к Дейту не основательны, а доводы Дейта относительно несоответствия требованиям реального мира подхода к управлению отсутствующей информации, принятого в SQL, безупречны.
На этот раз на статью Рубинсона откликнулись сам Кристофер Дейт (C. J. Date), а также Джон Грант (John Grant), известный своими многочисленными серьезными работами, в частности, на эту тему. Обе статьи очень небольшие по объему, но, как мне кажется, любопытные и полезные для более полного понимания сути проблемы и путей ее решения. Поэтому я решил опубликовать переводы их обеих в библиотеке CITForum, сопроводив их этой краткой заметкой со своими пояснениями и комментариями.
Начну с одного чисто переводческого пояснения. В переводе статьи Дейта Критика статьи Клода Рубинсона «NULL, трехзначная логика и неопределенность в SQL: критика критики Дейта» везде в русском тексте я использую (и даже склоняю) только слово null, не пытаясь заменять его, например, словосочетанием неопределенное значение. В то же время, в переводе статьи Гранта Неопределенные значения в SQL я спокойно иду на такие вольности. Это связано с тем, что авторы статей по-разному относятся к проблеме отсутствующей информации и к соответствующей терминологии.
Для Дейта одним из наиболее серьезных поводов к неприятию null в SQL является как раз то, что null – это не значение, а обозначение отсутствия значения. По мнению же Дейта (совершенно справедливому) в реляционной базе данных могут храниться только типизированные значения. Поэтому называть null неопределенным значением в переводе статей Дейта просто нельзя, поскольку это не значение вообще. И сам Дейт в последние годы никогда не использует словосочетание null value, всегда только null.
Грант в гораздо меньшей степени формалист. Его не очень беспокоит терминология. В его статье "базы данных выполняют запросы", и совершенно спокойно используется термин null value. Поэтому я и в переводе не стесняюсь использовать привычный оборот неопределенное значение. Для Гранта гораздо важнее дефекты трехзначной логики в том виде, в котором она применяется в SQL.
В статье Дейта, в общем-то, и нет критики статьи Рубинсона. Он даже и не пытается опровергнуть нападки в свою сторону, что, дескать он (Дейт) не понимает трехзначной логики SQL. Дейт снисходительно соглашается, что готов признать (условно!) безупречность логики SQL. Он всего лишь говорит, что если null является обозначением отсутствия значения, то для таблиц SQL не работает традиционная интерпретация отношений, принятая в реляционной модели.
Дейт показывает, что при интерпретации каждого отношения степени n как n-местного предиката, а каждого кортежа этого отношения – как истинного высказывания, являющегося инстанциацией предиката отношения, логически правильным подходом для поддержки в реляционных базах данных отсутствующей информации является подход к горизонтальной декомпозии, предложенный несколько лет назад соратником Дейта Хью Дарвеном (Hugh Darwen), см. его материал How To Handle Missing Information Without Using NULL.
Грант, напротив, начинает свою статью с того, что Рубинсон совершенно не прав, утверждая, что Дейт не умеет писать запросы на SQL. Просто SQL не умеет правильно выполнять запросы, формулируемые Дейтом. И он поясняет, почему так получилось. Оказывается, во всем виноват Кодд, который тридцать с лишним лет тому назад не послушал Гранта, когда тот говорил, что нельзя использовать трехзначную логику, основанную на таблицах истинности. А потом ошибочный подход Кодда попал в стандарт SQL, и отсюда и пошли все неприятности. К сожалению, я не читал статьи Гранта, написанные в 1970-е гг., и не смог найти их в Internet. Наверное, стоит устанить этот недочет.
Затем Грант кратко описывает два подхода к организации баз данных (дизъюнктивный и вероятностный), которые позволяют справляться с отсутствующей информацией без дефектов, свойственных SQL. По крайней мере, он показывает, что на основе этих подходов запрос из примера Дейта выполнился бы корректно.
В общем, понятно одно. В SQL имеется ряд дефектов, связанных с поддержкой null'ов. Рано или поздно эти дефекты нужно устранить. Наверное, уже всем ясно, что от этого языка нам никуда не деться. Значит, нужно его, по мере возможности, приводить в порядок.
Итак, Вашему вниманию предлагаются статьи: