Теория и практика построения баз данных (1088289), страница 76
Текст из файла (страница 76)
В конце концов, изначально база данных не имеет проблем с целостностью, а чтобы эти проблемы возникли, сначала их ладо вызвать. Разумеется, здесь мы рассчитываем слишком на многое. Ошибки случаются. Поэтому в СУБД предусмотрена возможность определить и реализовать такие ограничения средствами самой СУБД. Это значит, что СУБД не позволит выполнить операцию вставки, удаления или модификации значения внешнего ключа, которая приведет к парушеншо ограшщеиия целостности по внешнему ключу.
Например, заглянем немного вперед и посмотрим на рцс. 10,20, где установленньш флажок ЕпТогсе ЯеТегепВа1 1птедгйу (Реализовывать ссыло шую целостность) предписывае~ Ассеээ реализовывать следующее ограничение: значение атрибута Ешр1оуее1чаше в таблице ЕМРСОУЕЕ Рйопе1чвтЬег должно существовать среди значений атрибута 1чаше в таблице ЕМРСОУЕЕ. Подобные возможности сушествукп во всех СУБД.
Кроме того, в серверных СУБД, таких как ОВАССЕ и 5Я1 5егчег, имеются утилиты, периодически запуская которые, можно гарантировать, па в базу данных не проникнут нарушения ссылочной целостности, обусловленные частично завершенными транзакциями, импортированными данными и другими чудесами Вселенной. Запуск этих утилит обычно входит в план обслуживания базы данных (см. главу 1!). Ограничения кардинальности связи Ограничения кардинальности связи проистекают из кардинальных чисел связанных объектных атрибутов.
Например, на рис. 10.3, а связь с объектом С05ТОМЕЯ в группе пОкК.Тгапэасбоп имеет кардинальность 1.1; следовательно, группа Тгапэасб юп должна иметь связь с объектом С05ТОМЕЯ. Вообще такие ограничения имеют два источника: ненулевое минимальное кардинальное число и максимальное кардинальное число, не равное 1 или г1. так, кардинальности 1.1, 1.Х, 2.М приведут к возникновению ограничений карлинальности, как и кардинальности 0.3, 1А и 2А.
За одним исключением, эти транзакции должны реализовываться в коде приложения. Исключением является кардинальность 1.1 на стороне потомка в связи 1М В атом случае ограничение можно реализовать, сделав внешний ключ обязательным. Так, ограничение кардпнальностн 1.1 на объект С05ТОМЕЯ в группе Р10КК.Тгапэасаоп можно реализовать, сделав атрибут Свэ1отег10 обязательным и таблице ТРАИ5АСТ10Н. Во всех прочих случаях разработчик базы данных должен написать код, реализующий ограничения кардииачьпостп. Этот код можно поместить в хранимые процедуры, которые будут вызываться СУБД при внесении изменений в связи, либо в прикладные программы, либо в обработчики определенных событий в формах, например ВеТогеОрва1е (обсуждается ниже).
Чтобы упростить обсуждение, мы будем рассматривать только ограничения 1.1 и 1.)ч. Логика этих двух примеров непосредственно распространяется и на прочие ограничения. На рис. 10.17 представлена связь между отношешшми СПЕЦИАЛЬНОСТЬ и СТУДЕНТ. В соответствии с рис. 10.17, а, специальность должна быть связана по крайней мере с одним студентом, а каждый студент должен иметь ровно одну специыьность. Когда пользователи обновляют любое из этих отношений, должен вызваться код реализации ограничений.
На рис. 10,17, б, например, если пользователь попытается удалить строку студента 400, код реализации ограничений должен отклонить этот запрос. Если бы этот запрос был разрешен, для строки в таблице ФИНАНСЫ не нашлось бы дочерней строки, и ограничение обязательности было бы нарушено. Подобным же образом, невозможно добавить новую строку в таблицу СПЕЦИАЛЬНОСТЬ (например «БИОЛОГИЯ»), пока не появится студент, специализирующийся на этом предмете. б Риа.
1ОА 7. Пример ограничения вида «обязательно-обязательное а — структура связи; б — данные для примера Реализация ограничений 363 Тип связи Вставка Обновление (ключв) Удаление удалит~ всех потомков ИЛИ переназначить всех потомков Изменит~ соответствующие ключи у всех потомков Создать как минимум одного потомка Ок 0-0 удалит~ всех потомков ИЛИ переназначить всех потомков Изменить соответствующие ключи у всех потомков 0-н ОК Изменить ключ как минимуму одного потомка ИЛИ соответствующий потомок ужв существует Н-0 Добавить нового потомка ИЛИ соответствующий потомок уже существует ОК ОК ОК н — н Удаление Обновление (ключа) Тип связи Вставке Брат существует Родител~ с новым значением существует (или создать его) И брат существует Родитель с новым значением существует ИЛИ создать родителя Брат существует ОК Родитель существует ИЛИ создать родителя Родитель существует ИЛИ создать родителя Ок ОК 0-0 Ок 0-Н Брат существует ОК н — 0 н — н 362 Глава 10.
Проектирование приложений баз данных Строка, у которой отсутствует заявленный обязательный родитель или потомок, назьгвается иногла гррагттеитом ГТгадщепг), а лочерние строки, не имеющие заявленного обязательно~о родителя, иногда называют зависшими записями, Одна пз функций прикладной программы — предотвращать появление фрагментов и зависших записей. Способ предотвращения появления фрагментов зависит от типа ограничения. На рис. 10.18 приведены примеры четырех возможных ограничений на связи вида 1:чт): «обязательно-обязательно» ГО-О), «обязательно — необязательно» СО-Н), «необязательно-обязательно» ГН-О) |г «необязательно — необязательно» СН вЂ” Н).
Эти ограпнченпя показаны только для связей вида «один ко многим», но эти же четыре типа сохраняются н для других типов связей. в г Рис. 10.18. Пример четырех типов ограничений связи: в — «обязательно-обязательно» (Π— 0); б — «обязательно-необязательно»(0-Н); в — «необязательно- обязательно (Н-0); г — «необязательно-необязательно»(Н-Н) Нарушения ограничений могут происходить при всяком изменении значений ключевых атрибутов. Например, если на рнс.
10.17, б изменить специализацию студента 300, поменяв «БУХГАЛТЕРСКИЙ УЧЕТ» па «ФИНАНСЫ», студент будет переведен на кафедру финансов. Хотя при этом меняется родитель, это не вызывает нарушения ограничения. Такое нарушение произойдет, однако, если поменять специализацию студента 400 па «БУХГАЛТЕРСКИЙ УЧЕТ». После этого окажется, что нп один студент не специализируется на предмете «ФИНАНСЫ», и таким образом будет нарушено ограничение «О вЂ” О» между таблицами СПЕЦИАЛЬНОСТЬ и СТУДЕНТ, В табл. 10.1 и 10.2 представлен свод правил, позволяющих предотвратить появление фрагментов для каждого пз указанных пщов ограничений.
В табл. 10.1 приведены правила, касатопщеся действий с родительской строкой, а в табл. 10.2— с дочерней строкой. Как видно пз этих таблиц, возможных действий имеется три: вставить новые строки, модифицировать ключевые данные и удалить строки. В этих таблицах перечислены правила для связей вида «один ко лтногим»; правила для связей вида «олин к одному» аналогичны, Таблица 10.1.
Условия допустимости изменений в родительских записях таблица 10.2. Условия допустимости изменений е дочерних записях Ограничения на обновление родительских строк Первая строка в табл. 10.1 относится к ограничениям «О-О>. Новуго родптель< кую строку можно вставить только в том случае, если в то >ке самое время создается по крайней мере одна дочерняя строка, что можно сделать, либо вставив новую дочерщою строку, либо взяв ее от другого родителя (однако последнее действие может само по себе вызвать нарушение ограничения). Изменение ключа родителя разрешается в связи «О-О > только в том случае, если при этом изменяются значения соответствующего внешнего клгоча в дочерних строках.
(Можно переназначить всех потомков другому родителю и затем создать для родителя хотя бы одного нового потомка, но так поступают репко.) Так, изменение атрибута Счет-Фактура в опюшеннн СЧЕТ ЗА ГОСТИНИЦУ разрешается, если значение этого атрибута будет также изменено в соответствующих строках таблицы ПЛАТА ЗА ДЕНЬ. Обратите внимание, что при использовании суррогатных ключей это дейспще никогда не произойдет. Наконец, родитель в связи «О вЂ” О» может быть удален только тогда, котла будут удалены или переназначены все его потомки.
Что касается ограничений «О вЂ” Н», родительские строки можно добавлять без ограничений, поскольку родитель пе обязан иметь потомка. Для связи на рис. 10.18, б в отношение ПРЕПОДАВАТЕЛЬ новую строку можно добавить без Реализация ограничений 365 а«яа»я«и«и> ааа Р сиа >>~ »яа ааыад»а>» Р «я»ь в«аа а«а>а«а»а а >ак а а>иа, с»>аи Рис. 10. 19.