Целостность сущностей. NULL. Бизнес-правила.



Целостность БД – это совокупность механизмов, обеспечивающих достоверность хранимой информации.

Прежде, чем рассматривать проблемы целостности, остановимся на одном важном понятии, используемом в серверных БД.

Идентификатор NULL указывает на то обстоятельство, что некоторому атрибуту конкретного кортежа (полю записи) не присвоено никакого значения.

Замечание. Недопустимо говорить «поле имеет значение NULL». NULL – это отсутствие какого бы то ни было значения.

Ограничение NOT NULL (отсутствие значения не допустимо) в отношении целочисленного поля не означает, что туда не может быть записано нулевое значение. Это ограничение означает, что полю обязательно должно быть присвоено значение и, в частности, этим значением может быть и ноль. Аналогично, для строковых полей и переменных пустая строка также является значением.

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

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

 

if a > 0 thenоператор1elseоператор2;

рассматривается следующим образом: если a > 0, тогда выполняется оператор1, если a <= 0 или a не имеет значения, то выполняется оператор2.

Много ошибок и недоразумений возникает при вычислении разного рода выражений. Здесь действует правило: если какой-либо операнд в выражении не имеет значения, то и результатом вычисления всего выражения также будет отсутствие значения. Например, в результате вычисления выражения c = a + b, при b = 1 и a, не имеющем значения (a is NULL), в c также будет отсутствовать значение (c is NULL). Более того, выражение a = a + 1 не присвоит a никакого значения, если a не имела значения исходно.

Первое ограничение целостности относится к первичным ключам и называется целостностью сущностей. Оно гласит, что для атрибутов первичных ключей недопустимо отсутствие значений. То есть, все атрибуты первичных ключей должны задаваться с ограничением NOT NULL (Required в терминологии локальных БД).

Физический смысл такого ограничения очевиден. Первичные ключи предназначены для уникальной идентификации кортежей отношений. Ясно, что при отсутствии значения в атрибуте ПК, ни о какой уникальной идентификации речи быть не может (ситуация не определена, то есть не однозначна).

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


Ссылочная целостность. Механизм каскадных изменений.

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

Например, в таблице наличия в полях «Лицо» и «Предмет» могут использоваться только те условные номера лиц и предметов, которые есть в таблицах лиц и предметов, соответственно. Здесь отсутствие значений в полях ВК не допустимо, в противном случае это будет наличие у неизвестно какого лица или неизвестно какого предмета. А вот в таблице лиц допустимо отсутствие значения в поле «Подразделение», т.к., поставщики и направления списания не имеют отношения к подразделениям.

Ссылочная целостность накладывает ограничения не только на дочерние, но и на родительские отношения. Действительно, совершенно очевидно, что недопустимо удалять в родительском отношении те строки, на которые есть ссылки из дочерних отношений. Например, если у лица с номером 5 есть какие-то предметы в наличии, то информацию о нем нельзя удалять из таблицы лиц.

При изменении значений в полях первичного ключа родительского отношения, такие же изменения необходимо выполнить в полях внешних ключей дочерних отношений. Например, если условный номер лица изменился с 5 на 25, то и в таблицах наличия и проводок в полях «Лицо», «Расход» и «Приход» значение 5 должно быть изменено на 25.

За поддержание ссылочной целостности в СУБД отвечает специальный механизм, который называется механизмом каскадных изменений. Работает он следующим образом.

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

Аналогичная проверка делается и при попытке изменения значений полей первичного ключа родительского отношения. Если есть ссылающиеся дочерние строки, то операция или запрещается или точно такие же изменения выполняются в полях внешних ключей дочерних отношений (каскадное изменение).

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

Ссылочная целостность должна учитываться и при написании приложений. Обычно пользователю не дают возможности непосредственного ввода значений в поля внешних ключей дочерних отношений. Вместо этого ему предоставляют возможность выбора нужной строки из родительского отношения, а значения его первичного ключа программно копируют в поля внешнего ключа дочернего отношения (механизм Lookup-полей). Например, пользователь не должен знать ни о каких условных номерах лиц и предметов. При добавлении строки в таблицу наличия ему должен быть предоставлен выбор лица и предмета из соответствующих таблиц с показом их реальных наименований, а не условных номеров. Условные номера в строку наличия должны подставляться программным образом.
Семантическая целостность. Механизм транзакций.

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

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

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

В нашем примере для обеспечения семантической целостности все три операции следовало бы объединить в рамках одной транзакции.

Замечание. Полноценно механизм транзакций реализован только для серверных БД.

Последнее ограничение целостности называется бизнес-правилами (корпоративными ограничениями целостности). Это ограничения, которые обусловлены конкретной сферой применения базы данных. То есть, ограничения, имеющие отношение только к данной конкретной БД.

В нашем примере можно выделить такие бизнес-правила: поставщики должны передавать предметы только лицам, работающим на центральном складе; поставщики не имеют права списывать предметы; в одном подразделении могут работать несколько подотчетных лиц и т.д.


Дата добавления: 2018-05-31; просмотров: 257; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!