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

96

NULL-значений в этих случаях определяется разработчиком системы исходя из конкретных особенностей предметной области и решаемой задачи.

Правила ссылочной целостности

Как уже говорилось, требование целостности данных, касающееся внешних ключей, состоит в следующем.

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

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

Действительно, предположим, что мы удаляем из отношения R1 некоторый кортеж (и тем самым соответствующее этому кортежу значение потенциального ключа данного отношения). Если в другом отношении R2 имеется внешний ключ, который ссылается на модифицируемое отношение R1, то эта операция может привести к тому, что значение внешнего ключа в R2 может оказаться без соответствующего ему значения родительского потенциального ключа в этом отношении R1. Образуется, как говорят, «висячая» ссылка и данные в базе данных оказываются несогласованными, то есть целостность базы данных будет нарушенной. Такая ситуация возникнет, например, при удалении из таблицы СТУДЕНТЫ (рис. 9.2) кортежа {С6,

Смирнов, Физический, С2}. В таблице УСПЕВАЕМОСТЬ у трех кортежей,

ссылающихся на значение С6 как на родительский ключ, значение атрибута КОД_СТУД будет не определено.

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

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

97

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

Для родительского отношения это операции:

•Вставка кортежа в родительском отношении. При вставке кортежа в родительское отношение возникает новое значение потенциального ключа.

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

•Обновление кортежа в родительском отношении. При обновлении кортежа в родительском отношении может измениться значение потенциального

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

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

Для дочернего отношения:

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

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

может привести к нарушению ссылочной целостности.

•Удаление кортежа в дочернем отношении. При удалении кортежа в дочернем отношении ссылочная целостность не нарушается.

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

98

•Обновление кортежа в родительском отношении.

•Удаление кортежа в родительском отношении.

•Вставка кортежа в дочернее отношение.

•Обновление кортежа в дочернем отношении.

Для того чтобы исключить нарушение ограничений ссылочной целостности и возникновение «висячих» ссылок при выполнении операций изменения (UPDATE) и удаления (DELETE) значений атрибутов необходимо выполнять определенные правила. Эти правила называются правилами внешних ключей (foreign key rules). Существуют два основных варианта действий для обеспечения целостности данных при выполнении указанных выше потенциально опасных операций над данными:

•Ограничить. Этот вариант состоит в запрете операции, приводящей к нарушению ограничений целостности.

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

Если в отношениях являются допустимыми NULL-значения, то существует

дополнительная возможность восстановления ссылочной целостности.

•Установить в NULL. Операция разрешается, но при этом возникающие некорректные значения внешних ключей («висячие» ссылки) заменяются NULL-значениями.

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

•Установить по умолчанию. Операция также разрешается, но при этом возникающие некорректные значения внешних ключей заменяются некоторым значением, принятым по умолчанию.

Достоинством последнего варианта является то, что он позволяет не

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

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

99

При обновлении кортежа в родительском отношении

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

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

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

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

При удалении кортежа в родительском отношении

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

•Каскадировать. Операция удаления выполняется, однако, вместе с

удалением кортежа, содержащего родительский потенциальный ключ, каскадно удаляются также и кортежи дочернего отношения, содержащие внешние ключи, ссылающиеся на удаляемый кортеж.

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

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

При вставке кортежа в дочернее отношение

•Ограничить. Операция вставки кортежа отвергается, если значение внешнего ключа этого кортежа не соответствует ни одному