Главная » SQL, Базы данных » Отсутствующая информация

0

В   повседневной   жизни   часто   приходится   сталкиваться   с   проблемой отсутствия некоторой информации. Весьма типичны ситуации, когда, например, "дата     рождения    не     известна",     "имя     докладчика     будет     объявлено дополнительно", "адрес лица в данный  момент не известен" и т.д. Поэтому в системах  баз  данных  должен   существовать  механизм  обработки  подобных ситуаций. На практике  наиболее типичный подход к решению этой проблемы (используемый, в  частности, в языке SQL, а значит, и в большинстве коммерческих  продуктов) основан на применении неопределенных значений (NULLзначений) и трехзначной логики. Например, вес детали, скажем, с номером Р7, может быть не известен, поэтому упрощенно можно сказать, что ее вес "является неопределенным". В более точном смысле это выражение означает следующее: а) известно, что деталь существует; б) несомненно, деталь имеет вес; в) ее вес нам не известен.

Рассмотрим этот пример более подробно. Ясно, что мы не можем поместить истинное  значение  веса  детали  в  атрибут  WEIGHT  кортежа,  описывающего

деталь с номером Р7. Следовательно, все, что остается, — пометить или как-то обозначить,    что    значение    атрибута    WEIGHT     этого    кортежа     является неопределенным.     В     дальнейшем     наличие     подобной                                        метки     будет

интерпретироваться как указание, что истинное значение атрибута не известно. Для  удобства  можно  неформально  сказать,  что  атрибут  WEIGHT  "содержит неопределенное значение" или что значение этого атрибута "равно NULL". На

практике подобные

выражения действительно широко используются. Но следует четко понимать, что подобные выражения неформальны и несколько  неточны, поскольку говоря,  что значение атрибута WEIGHT в кортеже является неопределенным или равно NULL, мы на самом деле имеем  в  виду,  что  кортеж  вообще  не  содержит   никакого  значения  атрибута WEIGHT. Поэтому широко распространенные выражения "неопределенное значение" и "значение NULL" использовать не  рекомендуется, так как это "неопределенное значение (NULL)" на самом деле не значение, а всего лишь некая отметка или обозначение.

В следующем разделе будет показано, что при сравнении любых скалярных значений, в которых какой-либо из операндов не определен (содержит NULL), вместо значения true (истина) или false (ложь) будет получено логическое  значение  unknown (не известно). Причиной такого состояния дел является  принятая нами интерпретация обозначения NULL как указателя "значение не известно". Если значение переменной А не известно, то не известен и результат любого ее сравнения, например вида А > в, причем независимо от значения в (даже если предположить, что значение переменной в также не известно). В частности, следует отметить, что два неопределенных значения (NULL) нельзя считать равными одно другому, поэтому, если обе переменные, А и в, содержат неопределенные значения (NULL), результатом сравнения А = в всегда будет unknown, а не true. Однако эти переменные не считаются и неравными, т.е. результатом сравнения А не =B также будет unknown. На этом и основано  понятие трехзначной логики, поскольку концепция неопределенных значений, по крайней мере, в общепринятом смысле, неизбежно приводит нас к  необходимости  использования логики с тремя логическими значениями: true (истина), false (ложь) и unknown (не известно).

Прежде чем продолжить обсуждение, автор данной книги считает необходимым еще раз заявить, что он полностью разделяет мнение многих авторов о том, что неопределенные значения (NULL) И трехзначная логика являются ошибочными  понятиями и им нет места в четких формальных системах, подобных реляционной модели. Например, утверждение о том, что некоторый кортеж с данными о детали вообще не содержит значения WEIGHT, по определению равносильно утверждению, что рассматриваемый кортеж в конечном итоге не является кортежем с данными  о детали; равным образом, это равносильно утверждению, что рассматриваемый кортеж не является конкретизацией соответствующего предиката. Фактически такой "с позволения сказать, кортеж" просто не является кортежем! Это можно легко проверить, еще раз прочитав определение термина кортеж в главе 6. Истина заключается в том, что даже сама попытка точно определить, что собой представляет схема, в которой применяются неопределенные значения, позволяет сразу же  показать, почему идея неопределенных значений не совсем обоснована.  Вследствие этого ее также трудно достаточно логично объяснить. Как указано в [11.10], "она приобретает хоть какой-то смысл, только если вы на многое  закрываете глаза и не слишком утруждаете себя размышлениями".

Тем не менее, не стоит лишать читателя возможности обсудить неопределенные значения и трехзначную логику, поэтому в настоящее издание и включена данная глава.

1 Во всей данной книге для представления истинностных значений используются ключевые слова, состоящие  полностью из прописных букв. В отличие от этого, в данной главе истинностные значения  представлены с помощью прописных букв  и  выделены курсивом (в  основном для  того,  чтобы  принятый стиль  соответствовал другим публикациям автора по той же теме).

План главы таков. Непосредственно после введения в разделе 19.2 без  излишнего недоверия и критики описываются основные идеи, на которых  базируется концепция неопределенных значений и трехзначной логики. (Суть в том, что невозможно строго и справедливо критиковать любые идеи без их предварительного описания.) Затем в разделе 19.3 обсуждаются некоторые более важные следствия изложенных идей и предпринимается попытка обосновать мнение автора о том, что понятие неопределенных значений является ошибочным. В разделе 19.4 рассматриваются следствия наличия неопределенных значений в первичных и внешних ключах. Далее, в разделе 19.5, будет сделано отступление от основной темы в целях описания чаще всего встречающихся операций в контексте неопределенных значений и трехзначной логики — операций внешнего соединения. В разделе 19.6 в очень сжатой форме описывается альтернативный способ обработки отсутствующей информации с использованием специальных значений. В разделе 19.7 кратко рассматриваются аспекты языка SQL, имеющие  отношение к обсуждаемой проблеме. Наконец, в разделе 19.8 приводится краткое резюме.

Еще одно предварительное замечание. Существует множество причин, не позволяю щих поместить истинное значение в тот или иной атрибут кортежа, и неизвестность этого значения — только одна из возможных причин. Среди других причин следует назвать такие, как "значение не применимо", "значение не существует", "значение не определе но", "значение не задано" и т.д. [19.5]2. Действительно, в [6.2] Кодд предложил исполь зовать в реляционной модели не один, а два вида неопределенных значений: одно из них —"значение не  известно", а второе — "значение не применимо". В результате в предложенной Коддом реляционной модели используется уже не трех-, а четырехзначная логика. Автор данной книги возражает против подобных предложений в этой и во всех других своих работах (например, в [19.5]). В данной главе мы сосредоточимся только на одном виде неопределенных значений, а именно — на неопределенных  данных с неиз вестным значением. На него мы достаточно часто, но не всегда, будем ссылаться с помо щью аббревиатуры UNK (сокращение от "unknown" — "неизвестно").

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии