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

4.3. Ссылочная целостность

Как известно классы объектов предметной области могут быть связаны между собой одной из трех видов связей: «ОДИН – К – ОДНОМУ», «ОДИН – КО – МНОГИМ», «МНОГИЕ – КО – МНОГИМ». Первая из них в практике анализа предметной области с целью дальнейшего проектирования информационных систем встречается достаточно редко. Третий тип связи при построении реляционных отношений сводится ко второму за счет построения кроме реляционных отношений, характеризующих каждый класс объектов, и отдельного отношения, характеризующего связь объектов. Таким образом, наиболее часто отдельные таблицы базы данных (реляционные отношения) взаимодействуют на основе связи «ОДИН – КО – МНОГИМ».

Реляционные отношения, между которыми установлена связь вида «ОДИН – КО – МНОГИМ» являются материнским (основным) и дочерним (порожденным). Например, пусть имеются следующих два реляционных отношения, описывающих фрагмент предметной области «Художники и их картины»:

Живописец (идентификационный №1, Ф.И.О., страна, год рождения)

Полотно (инвентарный №, идентификационный №1, название, год, место хранения)

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

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

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

Первичный ключ материнского отношения, включенный в дочернее отношение, становится в нем внешним ключом.

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

В практике реализации ссылочной целостности наиболее широко используются две стратегии [40]: стратегия ограничения (запрета) и стратегия каскадирования, значительно реже – стратегия установки значений по умолчанию, стратегия игнорирования и стратегия установки неопределенного значенияNULL).

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

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

Пусть на основе анализа предметной области выделены два класса информационных объектов «АПТЕКА» и «ФИЛИАЛ», при этом класс принадлежности сущности для ИО «ФИЛИАЛ» обязателен (любой объект этого класса обязательно связан с одним или несколькими объектами класса «АПТЕКА»), а сам объект является односвязанным. Таким образом, взаимосвязь целесообразно отразить в реляционном отношении, характеризующим класс объектов «ФИЛИАЛ», включив в качестве внешнего ключа первичный ключ реляционного отношения «АПТЕКА». В этом случае реляционное отношение, характеризующее класс объектов «АПТЕКА» (назовем его так же «Аптека»), является основным (материнским). Реляционное отношение, характеризующее класс объектов «ФИЛИАЛ» (назовем его «Филиал»), будет порожденным (дочерним). В реляционном отношении “Аптека” в качестве первичного ключа назначим номер лицензии аптеки (identif), который в качестве внешнего ключа реляционного отношения “Филиал” будет использоваться для их связи.

При выполнении такой транзакции, как удаление кортежа в основном отношении, сохранится ссылочная целостность, если будет реализовано следующее ограничение целостности: “При попытке удаления кортежа в реляционном отношении “Аптека” реализовывать стратегию ограничения (запрета на удаление), при условии, что в порожденном отношении “Филиал” существуют кортежи, непосредственно связанные с удаляемым”. Таким образом, при реализации данной стратегии выполнение операции удаления кортежа из основного отношения будет возможным, если в порожденном отношении не найдется кортежа, непосредственно связанного с удаляемым (для данного случая – если отсутствуют данные о филиалах заданной аптеки). Заметим, в данном случае недопустимо использование стратегии ограничения для операции удаления кортежа в порожденном отношении. Наиболее приемлемой здесь будет стратегия игнорирования либо стратегия каскадирования.

Суть стратегии каскадирования заключается в том, что допускается выполнение необходимой транзакции и при этом вносятся соответствующие изменения в тех отношениях, которые связаны с текущем (с тем, в который в данный момент производится транзакция). Изменения в отношениях, связанных с текущем реализуются с целью не допустить нарушения ссылочной целостности и сохранить при этом все имеющиеся связи. Чаще всего изменение начинается в родительском отношении и каскадно выполняется в порожденном отношении. Следует заметить, что последнее может в свою очередь выступать в качестве материнского для каких-либо других отношений. В связи с этим может возникнуть необходимость соответствующих изменениях (транзакциях) и в этих отношениях. Если при этом какая-либо из каскадных операций (любого уровня) не может быть выполнена, то необходимо отказаться от первоначальной операции и вернуть базу данных в исходное состояние. Это самая сложная стратегия, но она хороша тем, что при этом не нарушается связь между кортежами родительского и дочернего отношений.

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

Как было отмечено ранее, в некоторых случаях для поддержания ссылочной целостности используется стратегия установки по умолчанию. В рамках данной стратегии разрешается выполнение требуемой операции, но все возникающие некорректные значения внешних ключей при этом изменяются на некоторое значение, которое принятое по умолчанию. Достоинство этой стратегии по сравнению с предыдущей в том, что она позволяет не пользоваться null-значеними. Недостатки заключаются в следующем. Во-первых, в родительском отношении должен быть некий кортеж, потенциальный ключ которого принят как значение по умолчанию для внешних ключей. В качестве такого "кортежа по умолчанию" обычно принимают специальный кортеж, заполненный нулевыми значениями (не null-значениями!). Этот кортеж нельзя удалять из родительского отношения, и в этом кортеже нельзя изменять значение потенциального ключа. Таким образом, не все кортежи родительского отношения становятся равнозначными, поэтому приходится прилагать дополнительные усилия для отслеживания этой неравнозначности. Это плата за отказ от использования null-значений. Во-вторых, как и в предыдущем случае, кортежи дочернего отношения теряют всякую связь с кортежами родительского отношения. Установить, с каким кортежем родительского отношения были связаны измененные кортежи дочернего отношения, после выполнения операции уже нельзя.

И, наконец, стратегия ингнорирования (IGNORE), суть которой заключается в том, что разрешено выполнять любые транзакции, не обращая при этом внимание на нарушения ссылочной целостности.

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