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

Целостность данных является понятием базы данных [1, 2]. ERwin позволяет в модели "сущность-связь" задать правила ссылочной целостности (возможно также задание ограничений на значения атрибутов, но мы не рассматриваем эту возможность). При генерации схемы базы данных ERwin генерирует правила декларативной ссылочной целостности и триггеры. То есть правила ссылочной целостности задаются в модели "сущность-связь", а реализуются в построенной по это модели реляционной базе данных. Соответствие между моделью и базой данных легко устанавливается, учитывая, что сущностям модели соответствуют отношения реляционной базы данных, а экземплярам сущностей – кортежи отношений.

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

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

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

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

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

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

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

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

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

3. При удалении кортежа дочернего отношения ссылочная целостность не нарушается.

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

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

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

3) вставка кортежа в дочернее отношение;

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

Существуют две основные стратегии поддержания ссылочной целостности:

1) RESTRICT (ОГРАНИЧИТЬ) – не разрешать выполнение операции, приводящей к нарушению ссылочной целостности. Это самая простая стратегия, требующая только проверки, имеются ли кортежи дочернего отношения, связанные с некоторым кортежами родительского отношения.

2) CASCADE (КАСКАД) – разрешить выполнение требуемой операции, но внести при этом необходимые поправки в других кортежах отношений так, чтобы не допустить нарушения ссылочной целостности и сохранить все имеющиеся связи. Изменение начинается в родительском отношении и каскадно выполняется в дочернем отношении. Так как дочернее отношение может быть родительском для некоторого третьего отношения, то может потребоваться выполнение каскадной стратегии и для этой связи и т.д. Это самая сложная стратегия, но она хороша тем, что при этом не нарушается связь между кортежами родительского и дочернего отношений.

Эти стратегии являются стандартными и присутствуют во всех СУБД, в которых имеется поддержка ссылочной целостности.

ERwin реализует также дополнительные стратегии поддержания ссылочной целостности (если они реализованы в целевой СУБД):

1) NONE (НИКАКОЙ) – никаких операций по поддержке ссылочной целостности не выполняется. В этом случае в дочернем отношении могут появляться некорректные значения внешних ключей, и вся ответственность за целостность базы данных ложится на приложение

2) SET NULL (УСТАНОВИТЬ В NULL) – разрешить выполнение требуемой операции, но все возникающие некорректные значения внешних ключей заменять на неопределенные значения (null-значения). При этом кортежи дочернего отношения теряют всякую связь с кортежами родительского отношения.

3) SET DEFAULT (УСТАНОВИТЬ ПО УМОЛЧАНИЮ) – разрешить выполнение требуемой операции, но все возникающие некорректные значения внешних ключей изменять на некоторое значение, принятое по умолчанию. При этом должен существовать кортеж родительского отношения, первичный ключ которого принят как значение по умолчанию для внешних ключей. Этот кортеж нельзя удалять из родительского отношения, и в этом кортеже нельзя изменять значение ключа. Кроме того, как и в предыдущем случае, кортежи дочернего отношения теряют всякую связь с кортежами родительского отношения.

Рассмотрим применение стратегии поддержания ссылочной целостности [8].

При обновлении кортежа в родительском отношении допустимы следующие стратегии:

1) RESTRICT – не разрешать обновление, если имеется хотя бы один кортеж дочернего отношения, ссылающийся на обновляемый кортеж родительского отношения.

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

3) SET NULL – выполнить обновление и во всех кортежах дочернего отношения, ссылающихся на обновляемый кортеж, изменить значения внешних ключей на null-значение.

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

5) NONE – выполнить обновление, не обращая внимания на нарушения ссылочной целостности.

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

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

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

3) SET NULL – выполнить удаление и во всех кортежах дочернего отношения, ссылающихся на удаляемый кортеж, изменить значения внешних ключей на null-значение.

4) SET DEFAULT – выполнить удаление и во всех кортежах дочернего отношения, ссылающихся на удаляемый кортеж, изменить значения внешних ключей на некоторое значение, принятое по умолчанию.

5) NONE – выполнить удаление, не обращая внимания на нарушения ссылочной целостности.

При вставке кортежа в дочернее отношение возможны стратегии:

1) RESTRICT – не разрешать вставку, если внешний ключ во вставляемом кортеже не соответствует ни одному значению потенциального ключа родительского отношения.

2) SET NULL – вставить кортеж, но в качестве значения внешнего ключа занести не предлагаемое пользователем некорректное значение, а null‑значение.

3) SET DEFAULT – вставить кортеж, но в качестве значения внешнего ключа занести не предлагаемое пользователем некорректное значение, а некоторое значение, принятое по умолчанию.

4) NONE – вставить кортеж, не обращая внимания на нарушения ссылочной целостности

При обновлении кортежа в дочернем отношении возможны стратегии:

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

2) SET NULL – обновить кортеж, но в качестве значения внешнего ключа занести не предлагаемое пользователем некорректное значение, а null‑значение.

3) SET DEFAULT – обновить кортеж, но в качестве значения внешнего ключа занести не предлагаемое пользователем некорректное значение, а некоторое значение, принятое по умолчанию.

4) NONE – обновить кортеж, не обращая внимания на нарушения ссылочной целостности.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: