Целостность сущности и ссылок В реляционной модели данных фиксируются два базовых требования целостности, которые должны поддерживаться в любой реляционной СУБД.
1. Требование целостности сущностей. Объекту или сущности реального мира в реляционных БД соответствуют кортежи отношений. Требование состоит в том, что любой кортеж любого отношения должен быть отличим от любого другого кортежа этого отношения, т.е. другими словами, любое отношение должно обладать первичным ключом. Это требование автоматически удовлетворяется, если в системе не нарушаются базовые свойства отношений.
2. Требованием целостности по ссылкам. Мы видели, что результатом процесса нормализации отношений является представление сложных сущностей реального мира в реляционной БД в виде нескольких кортежей нескольких отношений.
Пример. В реляционной базе требуется представить сущности ОТДЕЛ с атрибутами Отд_номер (номер отдела), Отд_кол (количество сотрудников) и СОТРУДНИКИ (набор сотрудников). Для каждого сотрудника нужно хранить Сотр_номер (номер сотрудника), Сотр_имя (имя сотрудника), Сотр_зарп (заработная плата сотрудника) и Сотр_отд_номер (номер отдела, где работает сотрудник). При правильном проектировании (в соответствии с принципами нормализации) соответствующей БД в ней появятся два отношения:
ОТДЕЛ (Отд_номер,Отд_Кол) (первичный ключ - Отд_номер)
СОТРУДНИКИ (Сотр_номер,Сотр_имя,Сотр_зарп,Сотр_отд_номер)(первичный ключ Сотр_номер)
Заметим, что атрибут Сотр_отд_номер появляется в отношении СОТРУДНИКИ не потому, что номер отдела является собственным свойством сотрудника, а лишь для того, чтобы иметь возможность восстановить при необходимости полную сущность ОТДЕЛ. Значение атрибута Сотр_отд_номер в любом кортеже отношения СОТРУДНИКИ должно соответствовать значению атрибута Отд_номер в некотором кортеже отношения ОТДЕЛ. Атрибут такого рода называется внешним ключом, поскольку его значения однозначно характеризуют сущности, представленные кортежами некоторого другого отношения (то есть задают значения их первичного ключа). Другими словами, для поддержания ссылочной целостности данных многие СУБД поддерживают механизм внешних ключей.
Говорят, что отношение, в котором определен внешний ключ, ссылается на соответствующее отношение, в котором такой же атрибут является первичным ключом; при этом отношение, на первичный ключ которого ссылается внешний ключ другого отношения, называется master-отношением, или главным отношением; а отношение, от которого исходит ссылка, называется detail-отношением, или подчиненным отношением.
Требование целостности по ссылкам, или требование внешнего ключа, состоит в том, что для каждого значения внешнего ключа, появляющегося в подчиненным отношении, в главном отношении должен найтись кортеж с таким же значением первичного ключа, либо значение внешнего ключа должно быть полностью неопределенным (иметь значение NULL. т.е. ни на что не указывать). Для нашего примера это означает, что если для сотрудника указан номер отдела, то этот отдел должен существовать.
Ясно, что для соблюдения целостности сущности достаточно гарантировать отсутствие в любом отношении кортежей с одним и тем же значением первичного ключа. С целостностью по ссылкам дела обстоят сложнее. Понятно, что при обновлении подчиненного отношения (вставке новых кортежей или модификации значения внешнего ключа в существующих кортежах) достаточно следить за тем, чтобы не появлялись некорректные значения внешнего ключа. Проблемы возникают при удалении или изменении кортежа из главного отношения.
СУБД имеет возможность автоматически генерировать ошибку в случаях, когда делается попытка:
· вставки в подчиненное отношение записи, для внешнего ключа которой не существует соответствия в главном отношении (например, там нет еще записи с таким первичным ключом);
· удаления из главного отношения записи, на первичный ключ которой имеется хотя бы одна ссылка из подчиненных отношений;
· изменения первичного ключа записи главного отношения, на которую имеется хотя бы одна ссылка из подчиненных таблиц.
Можно выделить следующие подходы, поддерживающие целостность по ссылкам.
1. Запрещается производить удаление и изменение кортежей, на которые существуют ссылки (то есть, сначала нужно либо удалить ссылающиеся кортежи из подчиненных таблиц, либо соответствующим образом изменить значения их внешнего ключа).
2. При удалении кортежа из главного отношения во всех ссылающихся на него кортежах всех подчиненных отношений значение внешнего ключа автоматически становится неопределенным.
3. При удалении кортежа из главного отношения из подчиненных отношений автоматически удаляются все ссылающиеся кортежи.
- Распространить всякие изменения в первичном ключе главного отношения на подчиненные отношения, а именно, при изменении в главном отношении первичного ключа записи в подчиненных отношениях должны быть изменены все внешние ключи записей, ссылающихся на изменяемую.
Для выбора подхода необходимо анализировать требования конкретной прикладной области.
|