В реальном мире часто приходится сталкиваться с проблемой отсутствия какой-либо информации. Весьма типичны ситуации, когда, например, «дата рождения не известна», «имя докладчика будет объявлено дополнительно», «адрес лица в данный момент не известен» и т. д. Поэтому в системах баз данных должен существовать механизм обработки подобных ситуаций. На практике наиболее типичный подход к решению этой проблемы основан на применении неопределенных значений (NULL-значений) и трехзначной логики. Например, возраст человека может быть не известен, поэтому упрощенно можно сказать, что его возраст «является неопределенным». В более точном смысле это выражение означает следующее: а) известно, что человек существует; б) несомненно, человек обладает каким-то возрастом; в) его возраст нам не известен.
Далее рассмотрим концепцию трёхзначной логики, то есть рассмотрим влияние неопределённых значений (UNK, сокращённо от «unknown» — «неизвестно») на вычисление логических выражений.
Ключевая особенность трёхзначной логики состоит в том, что результатом операций сравнения скаляров, в которых хотя бы один из операндов является величиной UNK, будет логическое значение unknown, а не true или false, которое является третьим логическим значением, поэтому данная логика и является трёхзначной. Далее приведены таблицы истинности для операторов AND, OR и NOT в трёхзначной логике.
AND |
t |
u |
f |
OR |
t |
u |
f |
NOT |
|||
t |
t |
u |
f |
t |
t |
t |
t |
t |
f |
||
u |
u |
u |
f |
u |
t |
u |
u |
u |
u |
||
f |
f |
f |
f |
f |
t |
u |
f |
f |
t |
Тем не менее, для реализации трехзначной логики одних только операторов AND, OR и NOT недостаточно. Еще одним важным оператором является оператор MAYBE (возможно). Таблица истинности данного оператора показана ниже.
MAYBE |
|
t |
f |
u |
t |
f |
f |
Чтобы продемонстрировать необходимость в использовании оператора MAYBE, рассмотрим запрос: «Получить сведения о сотрудниках с годовой зарплатой меньше 50 тыс. долл., которые могут быть (но это точно не известно) программистами и родились до 18 января 1971 года». С помощью оператора MAYBE данный запрос можно достаточно кратко записать в следующем виде:
EMP WHERE MAYBE (JOB = 'Programmer' AND
DOB < DATE ('1971–1-18')
AND SALARY < 50000.00)
Существуют и другие логические операторы, которые применимы в трёхзначной логике. Например, TRUE_OR_MAYBE (который возвращает true, если его операнд равен true или unk, а в противном случае возвращает false).
Что касается других скалярных операторов, то в общем случае, если хотя бы один из операндов арифметического выражения является величиной UNK, результатом вычисления всего выражения также будет величина UNK. Но данное рассуждение не применимо для логических операторов, рассматриваемых выше, а также для оператора IS_UNK (возвращает значение true, если этот операнд равен UNK, или значение false — в противном случае) и IF_UNK (это оператор преобразования величины UNK в некоторое значение, отличное от UNK).
Следует отметить, что величина UNK (неопределенное значение вида «значение не известно») и значение unk (логическое значение unknown) — это не одно и то же. Данное положение дел является прямым следствием того, что unk — это логическое значение, в то время как величина UNK вообще не является значением. Из этого следует, что типы (т. е. множества значении) не могут содержать величину UNK.
В связи с введением NULLзначений в БД необходимо ввести правило поддержки целостности сущности: ни один компонент первичного ключа любой базовой переменной отношения не может содержать неопределенные значения (NULL).
Данное правило вводится из следующих соображений:
а) кортежи базовых переменных отношения представляют сущности реального мира;
б) сущности реального мира всегда должны допускать возможность их идентификации (по определению);
в) следовательно, их аналоги в базе данных также должны допускать возможность идентификации;
г) в базе данных значения первичного ключа используются в качестве идентификаторов;
д) следовательно, значение любого первичного ключа не может быть «неопределенным».
Стоит сказать, что в реальном мире мы обычно пользуемся именно специальными значениями. Например, специальное значение "?" используется для обозначения количества рабочих часов для некоторого сотрудника, если его фактическое значение по какой-либо причине не известно. Таким образом, общая идея заключается в том, чтобы просто применять подходящее специальное значение, отличное от всех обычных значений атрибута, во всех тех случаях, когда обычное значение не может использоваться.
Изложенный выше способ не очень изящен, но он обладает явным преимуществом, поскольку не подрывает логических основ реляционной модели.
Трёхзначную логику можно также расширить до четырёхзначной и даже более, так как существует множество причин отсутствия некоторой части информации. «Значение неизвестно» — это только одна из возможных причин. Среди других причин такие, как «значение неприменимо», «значение не существует» и т. д.
Литература:
- Дейт К. Дж. Введение в системы баз данных, 8-е издание: Пер. с англ. –М.: Издательский дом «Вильямс», 2005. ‑1328 с.
- Многозначная логика // Википедия. URL: https://ru.wikipedia.org/wiki/Многозначная_логика (дата обращения: 9.04.2017).