Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление данными (пособие).pdf
Скачиваний:
280
Добавлен:
21.05.2015
Размер:
5.42 Mб
Скачать

81

ограничения целостности уровня кортежа,

ограничения целостности уровня отношения,

ограничения целостности уровня базы данных.

Рассмотрим эти виды ограничений целостности более подробно.

9.1.Ограничения целостности уровня атрибута

Домены отношений

Ограничения целостности уровня атрибута являются ограничениями, накладываемыми на допустимые значения атрибута. Эти ограничения исходят из того, что каждый атрибут определен на каком-либо конкретном домене.

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

Понятие домена играет в реляционной модели очень важную роль. Описание для атрибута его домена позволяет осуществлять контроль правильности вводимых в базу значений атрибутов.

Ограничение целостности атрибутов выглядит следующим образом:

Значение каждого атрибута берутся из соответствующего домена.

Домены ограничивают также операции сравнения значений атрибутов.

В процессе работы с базой данных, построения запросов к данным, возникает необходимость сравнения между собой значений различных атрибутов. При этом, естественно, встает вопрос: «В каком случае такое сравнение будет корректным?» Так вот – сравнивать между собой можно только значения атрибутов, определенных на общих доменах.

Действительно, абсурдно выглядит запрос: «Получить список студентов, у которых полученная на экзамене оценка больше номера курса, на котором учится студент», требующий выполнения операции сравнения между собой значения курса, на котором учится студент, и полученной им оценки (хотя и то, и другое значение выражается целым положительным числом). Очевидно, что значения атрибутов курс и оценка, соответствующих свойствам сущности студент, должны быть определены на разных доменах и, следовательно, не могут сравниваться между собой.

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

82

атрибуты, КОЛИЧЕСТВО_ЕДИНИЦ_ТОВАРА и ЦЕНА_ЕДИНИЦЫ_ТОВАРА, то,

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

А = (КОЛИЧЕСТВО_ЕДИНИЦ_ТОВАРА * ЦЕНА_ЕДИНИЦЫ_ТОВАРА)

для расчета, например, общей стоимости всех единиц товара.

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

Отсутствующая информация или NULL-значения.

Говоря в контексте понятие доменов о значениях, которые может принимать тот или иной атрибут следует обратить внимание еще на одну ситуацию, которую в реальной жизни исключит нельзя. А именно, ситуацию, когда конкретные значения атрибута могут отсутствовать. Например, в базе данных в записи о конкретном студенте может отсутствовать информация о его дате рождения или месте жительства. Сейчас не важно, по каким причинам информация о значении атрибута может отсутствовать, однако, в силу реальности таких ситуаций, при построении модели предметной области желательно иметь средство для их представления.

Коддом было предложено использовать для обозначения отсутствующей информации о значении атрибута специальный маркер – NULL, обычно называемый NULL-значение. Введение маркера NULL означает следующее. При определении (описании) конкретного атрибута (например, в отношении СТУДЕНТ атрибута ГОРОД, означающего город, в котором живет студент), помимо задания домена допустимых для этого атрибута значений (список допустимых названий городов) должен быть указано, что в случае, если по каким-либо причинам истинное значение этого атрибута не известно, то вместо него устанавливается маркер NULL.

Сразу же следует обратить внимание на то, что NULL не является одним из возможных значений атрибута, NULL вообще не является значением, а представляет собой обозначение факта отсутствия, действительного

83

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

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

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

вреляционную модель NULL-значений считается ошибочным, рассматриваемым как фактор, нарушающий целостность этой модели, и неоправданно ее усложняющий. Тем не менее, современные СУБД, как правило, поддерживают NULL-значения. Поэтому специалисту, работающему

вобласти баз данных необходимо хорошо знать особенности, возникающие при их использовании.

Скалярные выражения с использованием отсутствующих значений (NULL). Трехзначная (3VL) логика

Рассмотрим особенности, к которым приводит использование NULL-значений при выполнении различных скалярных операций над значениями атрибутов, т.е. проблемы, возникающие при использовании в качестве операндов какой-либо скалярной операции атрибута, значения которого могут быть неизвестны или не определены. Например, рассмотрим отношение, кортежи которого описывают некоторые объекты, свойствам которых в свою очередь соответствуют атрибуты отношения ДЛИНА и ШИРИНА. Пусть для каких-то объектов конкретные значения этих атрибутов могут быть неизвестными. Значения этих атрибутов могут использоваться в качестве операндов различных скалярных операций, например, при вычислении площади объекта путем перемножения значений атрибутов ДЛИНА и ШИРИНА.

84

Аспект, который сразу же возникает в этом случае, состоит в том, что если какой-либо операнд скалярного выражения не определен, то результат этого выражения также может быть не известен.

Если не известны значения какого-либо из операндов ДЛИНА или ШИРИНА, то и вычисляемое значение площади (ДЛИНА×ШИРИНА) также неизвестно. При неизвестном значении операнда ДЛИНА, неизвестным будут также значения следующих скалярных арифметических выражений:

ДЛИНА, +ДЛИНА, ДЛИНА +10, 10+ДЛИНА, ДЛИНА10, 10ДЛИНА, ДЛИНА×10, 10×ДЛИНА, ДЛИНА/10, 10/ДЛИНА.

Сложность, однако, в том, что не всегда значение выражения с неизвестным значением операнда будет само не определенным. Так, очевидно, специального определения требуют выражение типа ДЛИНАДЛИНА, результат которого известен и должен быть 0 (нуль) в любом случае, независимо от того известно или неизвестно значение операнда. Неоднозначна также интерпретация выражения ДЛИНА/0 при неопределенном значении операнда ДЛИНА (вместо обычной индикации ошибки деления на нуль).

Еще большие особенности вызывает допущение использования в атрибутах отсутствующих (NULL) значений со скалярными операциями сравнивания

а=b, аb, a>b, a<b, ab, ab.

В обычном случае результатом операции сравнивания, является два возможных значения true – истина и false – ложь. Допущение у операндов выражений, использующих операторы сравнивания, состояний, когда их выходное значение неизвестно, приводит к необходимости дополнения двух логических состояний true и false третьим логическим состоянием, которое можно назвать unk (от англ. unknown – неизвестно). Другими словами, допущение у атрибутов отсутствующих или неопределенных значений приводит к необходимости перехода от двузначной логики (true, false) к трехзначной (true, false, unk), называемой еще 3VL-логикой (от английского three values logic).

85

Соответствующим образом должны быть модифицированы и базовые скалярные логические операции AND, OR и NOT. Их таблицы истинности принимают следующий вид.

AND

true

unk

false

 

OR

true

unk

false

 

NOT

 

true

true

unk

false

 

true

true

true

true

 

true

false

 

unk

unk

false

 

 

true

unk

unk

 

 

unk

unk

 

unk

 

unk

 

false

false

false

 

 

true

unk

false

 

 

true

false

 

false

 

false

 

 

 

 

 

 

 

 

 

 

 

 

Появляется необходимость введения дополнительных операторов, например, операторов, позволяющих проверять – определено или не определено конкретное значение атрибута.

Логическое выражение типа A=NULL не является корректным, так как NULL не является значением и сравнивать что-либо с ним бессмысленно. Для получения информации о том, определено или не определено конкретное значение, вводятся новые операторы IS UNK и IS NOT UNK. В языке SQL их аналогами являются операторы IS NULL и IS NOT NULL. Эти операторы всегда возвращают значения true и false и их таблицы истинности имеют вид.

 

IS UNK

 

 

IS NOT UNK

 

 

 

 

 

A

false

 

A

true

unk

true

 

unk

false

где А – это какое-либо обычное, точно определенное значение.

В логических выражениях двузначной логики используются также кванторы EXISTS и FORALL. В качестве их операндов выступает множество переменных х1, х2, …, хn, принимающих значение true или false.

Выражение EXISTS(х1, х2, …, хn) принимает значение true, если хотя бы один из элементов множества 1, х2, …, хn> находится в состоянии true, и принимает значение false, если все элементы множества имеют значение false.

Выражение FORALL(х1, х2, …, хn) принимает значение true, в случае, когда все элементы множества 1, х2, …, хn> находятся в состоянии true, и принимают значение false во всех остальных случаях.

Допущение использования неопределенных значений, также заставляет расширять определение этих операторов.

Выражение EXISTS(х1, х2, …, хn) принимает значение true если, хотя бы один элемент множества 1, х2, …, хn> равен true, принимает значение false, если все элементы этого множества равны false, в остальных случаях,