Главная » SQL, Базы данных » КЛЮЧИ в реляционной модели

0

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

Потенциальные ключи

Допустим, что R — переменная отношения. По определению, множество всех атрибутов R обладает свойством уникальности; это означает, что в любой конкретный момент времени никакие два кортежа в значении R не являются дубликатами друг друга. На практике часто встречается ситуация, в которой определенное собственное подмножество множества всех атрибутов R также обладает свойством уникальности, например, в случае переменной отношения поставщиков S таким свойством обладает подмножество, содержащее только атрибут s#. На основании этих соображений может быть сформулировано приведенное ниже неформальное определение, продиктованное интуицией3.

■  Допустим, что к — множество атрибутов переменной отношения R. В таком случае к является потенциальным ключом для R тогда и только тогда, когда оно обладает одновременно двумя перечисленными ниже свойствами.

а)  Уникальность. Ни одно допустимое значение R никогда не содержит два разных кортежа с одним и тем же значением к.

б)  Несократимость. Никакое строгое подмножество к не обладает свойством уникальности.

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

13  Следует отметить, что это определение касается именно переменных отношения; аналогичное понятие может быть также определено для значений отношения [3.3], но переменные отношения —  наиболее важный случай. Заслуживает также внимания то, что и в этом случае мы исходим из понятия равенства кортежей (точнее, это понятие применяется в определении свойства уникальности).

ключа для поставщиков определена комбинация атрибутов {S#,CITY} вместо  одного только атрибута {S#}. В таком случае система не могла бы следить за соблюдением ограничения, согласно которому номера поставщиков являются "глобально" уникальными, а обладала бы способностью контролировать только более слабое ограничение, состоящее в том, что номера поставщиков являются  уникальными "локально", в пределах одного города. Кроме всего прочего, по этой причине в приведенном выше определении требуется, чтобы потенциальные ключи не содержали никаких атрибутов, которые не обеспечивают решения задачи уникальной идентификации14.

Следует отметить, что понятие несократимости, определение которого  приведено выше, в литературе (включая первые издания этой книги) часто обозначается термином минимальность. Но в действительности термин минимальность является не вполне подходящим, поскольку из утверждения, что потенциальный ключ К1 является минимальным, не следует, что не может быть найден другой потенциальный ключ, К2, с меньшим количеством компонентов; вполне возможно, что, например, К1 имеет четыре компонента, а К2 — только два. Поэтому автор придерживается термина несократимость.

В языке Tutorial D для определения потенциального ключа рассматриваемой переменной отношения в объявлении переменной отношения используется следующий синтаксис.

KEY  {  <attribute name commalist>  }

Ниже приведено еще несколько примеров.

VAR S BASE RELATION

{ S#    S#, SNAME

NAME, STATUS INTEGER, CITY

CHAR } KEY { S# }

;

Примечание. В предыдущих главах это определение было приведено с конструкцией PRIMARY KEY, а не с неуточненной конструкцией KEY. Дополнительные описания и пояснения даны в подразделе "Первичные и альтернативные ключи" данного раздела.

VAR SP BASE RELATION { S# S#, P#  P#, QTY QTY }

KEY { S#, P# } … ;

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

VAR ELEMENT BASE RELATION { NAME    NAME, SYMBOL  CHAR, ATOMIC# INTEGER } KEY { NAME } KEY { SYMBOL } KEY { ATOMIC# } ;

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

В этом примере показана переменная отношения с несколькими различными потенциальными ключами, причем все они являются простыми.

VAR MARRIAGE BASE RELATION { HUSBAND                                                                                                                          NAME, WIFE                                                                                                                                                                 NAME, DATE /* Дата регистрации брака */ DATE

}

/* Предполагается, что во всех рассматриваемых браках отсутствуют такие */

/* ситуации, как многомужие, многоженство и повторная регистрация брака */

/* одних и тех же супругов после их развода …*/ KEY { HUSBAND, DATE }

KEY { DATE, WIFE } KEY

{ WIFE, HUSBAND } ;

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

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

S  WHERE   S#   =   S#    (‘S3′)

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

S  WHERE  CITY   =    ‘Paris’,

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

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

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

Реакции на выполняемые операции, которые были названы выше "странными и аномальными" и "не полностью соответствующими реляционной модели", касаются таких

вопросов, как обновление представлений и оптимизация (эти темы рассматриваются,

соответственно, в главах 10 и 18).

В завершение этого раздела приведем несколько замечаний.

■     Потенциальные ключи должны иметь не только базовые переменные отношения!

Это требование распространяется на все переменные отношения, включая, в частно сти, представления. Но что касается, например, представлений, вопрос о том, могут ли или должны быть объявлены такие ключи, отчасти зависит от того, предусмот рена ли в системе возможность использоватьссылки на потенциальный ключ [3.3].

■     Надмножество потенциального ключа называется суперключом (например, супер ключом для переменной отношения S является множество атрибутов {S#,CITY}). Суперключ обладает свойством уникальности, но не обязательно обладает свойст вом несократимости. Безусловно, потенциальный ключ — это частный случай су перключа.

■     Если SK — суперключ для переменной отношения R, а А — атрибут R, то в R обяза тельно существует функциональная зависимость SK А. В действительности, мы можем определить суперключ как подмножество SK атрибутов R, такое что функ циональная зависимость SK А имеет место для всех атрибутов А в R.

Примечание. Важное понятие функциональной зависимости подробно рассматривается в главе 11.

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

Первичные и альтернативные ключи

Как уже было сказано выше, в любой переменной отношения возможно наличие двух или большего количества потенциальных ключей. В таком случае в реляционной модели традиционно предъявлялось такое требование (по меньшей мере, к базовым переменным отношения), чтобы точно один из этих ключей был выбран в качестве первичного ключа; с тех пор остальные ключи назывались альтернативными. Например, в случае определения таблицы элементов  Менделеева, ELEMENT, МОЖНО выбрать {SYMBOL} в качестве первичного ключа,  после чего применять {NAME} и {АТОМ1С#} как альтернативные ключи. При наличии даже одного потенциального ключа в реляционной модели по традиции предъявлялось требование, чтобы этот потенциальный ключ рассматривался как первичный ключ для данной базовой переменной отношения. Поэтому  считалось,  что каждая базовая переменная отношения всегда имеет первичный ключ.

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

поддержку такой позиции приведены в [9.14], а в этом разделе достаточно привести лишь один из них, который состоит в том, что выбор первичного ключа не диктуется логикой, а вместо этого, по сути, является произвольным.  (Процитируем слова Кодда [9.9]: "Обычно основанием [для выбора первичного  ключа] является упрощение работы, но этот аспект выходит за рамки реляционной модели".) В примерах, приведенных в этой книге, первичный ключ  иногда указан, а иногда — нет. Но в них всегда определен по меньшей мере один потенциальный ключ.

Внешние ключи

Неформально выражаясь, внешний ключ представляет собой множество атрибутов некоторой переменной отношения R2, значения которых должны совпадать со значениями некоторого  потенциального  ключа  некоторой  переменной  отношения  R1.  Например, рассмотрим множество атрибутов {S#} переменной отношения SP. Должно быть ясно, что заданное значение {S#} может присутствовать в переменной отношения SP, только если такое же значение присутствует и в переменной отношения S в качестве значения единственного потенциального ключа {S#} (поскольку поставка не может быть выполнена несуществующим поставщиком). Аналогичным образом, любое конкретное значение для множества атрибутов {Р#} может присутствовать в переменной отношения SP, только если такое же значение присутствует в переменной отношения Р в качестве значения единственного потенциального ключа {Р#} (поскольку не может быть также выполнена поставка несуществующей детали). На основании этих примеров может быть сформулировано приведенное ниже определение15.

■   Допустим, что R2 — переменная отношения. В таком случае внешним ключом в R2 является множество атрибутов R2, скажем, FK, такое что выполняются следующие требования:

а)   существует переменная отношения Rl (R1 и R2 не обязательно должны быть разными) с потенциальным ключом ск;

б)   существует возможность переименования некоторого подмножества атрибутов FK, такое что FK преобразуется (скажем) в FK ■, a FK’ и ск относятся к одному и тому же типу (кортежу);

в)   в любое время каждое значение FK в текущем значении R2 приводит к получе нию значения для FK’, которое идентично значению СК в некотором кортеже в текущем значении R1.

Из этого следуют приведенные далее выводы.

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

2.         Следует отметить, что каждое значение FK должно присутствовать в качестве зна чения CK, но обратное требование не предъявляется; это означает, что R1 может

15  Обратите внимание на то, что это определение также базируется на понятии равенства кортежей.

Глава 9. Целостность данных     361

содержать значение ск, которое в настоящее время не присутствует в R2 в качестве значения FK. Например, а случае поставщиков и деталей (примеры значений в этой базе данных приведены на рис. 3.8 на стр. 119) номер поставщика S5 присутствует в переменной отношения S, но не в переменной отношения SP, поскольку поставщик S5 в настоящее время не поставляет каких-либо деталей.

3.         Внешний ключ FK является простым или составным в зависимости от того, являет ся ли простым или составным потенциальный ключ CK.

4.         Любое значение FK представляет собой ссылку на кортеж, содержащий соответст вующее значение СК (он называется кортежем, упомянутым в ссылке). Ограничение, согласно которому значения FK должны соответствовать значениям СК, называет ся ограничением ссылочной целостности. Переменная отношения R2 называется ссылающейся переменной отношения, а переменная отношения R1 — переменной отношения, указанной в ссылке. Задача обеспечения того, чтобы база данных не включала каких-либо недопустимых значений внешнего ключа, называется зада чей поддержки ссылочной целостности (см. п. 12).

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

S ← SP Р

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

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

s#                                             Р# S   ←  SP  Р

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

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

R3  R2   →  R1

Вообще говоря, допустим, что существуют переменные отношения Rn, R (n-1) ,

…, R2, R1, такие что имеется ограничение ссылочной целостности, связывающее Rn с R(n-l), ограничение ссылочной целостности,  связывающее R(n-l) с R(n-2) , …, и ограничение ссылочной целостности,  связывающее R2 с R1 следующим образом.

Rn→   R(n-l)    →  R(n-2)    →  … → R2  →  R1

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

В таком случае цепочка стрелок, проходящая от Rn до R1, представляет собой ссылочный путь от Rn до R1.

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

VAR EMP BASE RELATION

{ ЕМР# ЕМР#, …, MGR_EMP# EMP#, … }

KEY { ЕМР# } FOREIGN KEY { RENAME MGR_EMP# AS EMP# }

REFERENCES EMP ;

Здесь атрибут MGR_EMP# обозначает табельный номер руководителя того служащего, который обозначен атрибутом ЕМР#; например, кортеж ЕМР для служащего Е4 может включать значение MGR_EMP# ЕЗ, равное ЕЗ, которое представляет собой ссылку на кортеж ЕМР для служащего ЕЗ. (Как было обещано в п. 1, здесь показан пример, в котором требуется  некоторое  явное переименование атрибута.) Переменные отношения, подобные ЕМР, иногда называют ссылающимися сами на себя (или самоссылающимися).

Упражнение. Подготовьте данные, которые могли бы использоваться в  качестве примера значения переменной отношения ЕМР.

8.          Самоссылающиеся переменные отношения фактически представляют частный случай более общей ситуации, а именно, они показывают, что могут существовать ссылочные циклы. Переменные отношения Rn,   R(n-l),   R(n-2),   …,   R2,   Rl образуют такой цикл, если Rn содержит внешний ключ, ссылающийся на R(n-l), a R(n-l) содержит внешний ключ, ссылающийся на R(n-2) ,   …, и т.д., нако нец, R1 содержит внешний ключ, снова ссылающийся на Rn. Кратко можно сформулировать это определение таким образом, что ссылочный цикл существует, если имеется ссылочный путь от некоторой переменной отношения Rn к ней са мой, как показано ниже.

Rn R(n-l)  R(n-2)  →  R2 → Rl Rn

9.          Иногда встречается такое  небеспочвенное утверждение,  что согласованность внешних и потенциальных ключей представляет собой своего рода "клей", кото рый скрепляет воедино всю базу данных. Еще один способ формулировки той же идеи состоит в том, что подобные согласования представляют собой определенные связи. Но необходимо учитывать важное замечание, что не все такие связи опреде лены лишь ключами, которые применяются указанным способом. Например, мо жет существовать некоторая связь между поставщиками и деталями ("нахождение в одном городе"), для представления которой применяются атрибуты CITY пере менных отношения S и Р; некоторый поставщик и некоторая деталь считаются на ходящимися в одном городе, если данный поставщик находится в том же городе, где хранится данная деталь. Но эта связь не определена с помощью ключей.

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

11.          В определении реляционной модели первоначально предъявлялось требование, чтобы внешние ключи ссылались именно лишь на первичные ключи, а не просто на любые потенциальные ключи (например, еще раз рекомендуем ознакомиться с [9.9]). Автор в целом отвергает это ограничение как ненужное и вообще нежела тельное, хотя на практике оно может часто служить хорошей рекомендацией [9.14].

12.          Наряду с понятием внешнего ключа в реляционной модели определено приведен ное ниже правило (правило ссылочной целостности).

Ссылочная целостность. База данных не должна содержать каких-либо несогласованных значений внешнего ключа17.

В этом определении термин "несогласованное значение внешнего ключа" обозначает значение внешнего ключа в некоторой ссылающейся переменной отношения, для которого не существует согласованного значения соответствующего потенциального ключа в соответствующей переменной отношения, указанной в ссылке. Иными словами, это ограничение можно сформулировать просто как следующее требование: "Если значение в ссылается на А, то А должно существовать".

Ниже показан синтаксис определения внешнего ключа.

FOREIGN KEY   {   <item  commalist>   }   REFERENCES  <relvar name>

Эта конструкция присутствует в определении ссылающейся переменной отношения; здесь <relvar name> обозначает переменную отношения, указанную в ссылке, а каждый элемент <item> представляет собой либо имя атрибута <attribute name> в ссылающейся переменной отношения, либо выражение в следующей форме.

RENAME  <attribute name>  AS  <attribute name>

(Пример   применения   варианта   с   использованием   ключевого   слова   RENAME приведен в определении самоссылающейся переменной отношения ЕМР в п. 7.) Примеры объявлений внешнего ключа были приведены выше во многих разделах данной книги (в частности,  см.  рис.  3.9  в  главе  3).  Безусловно,  как  было  указано  в  разделе  9.2, определение внешнего ключа фактически  представляет собой просто сокращение для некоторого ограничения базы данных (или для некоторого ограничения переменной отношения, в

17    Обратите  внимание  на   то,   что   это   правило  ссылочной  целостности  может   рассматриваться   как "метаограничение" (сверхограничение), поскольку в нем подразумевается, что любая отдельно взятая база данных должна быть объектом действия некоторых конкретных ограничений, свойственных рассматриваемой базе данных и совместно гарантирующих, чтобы в этой определенной базе данных не нарушалась ссылочная целостность. Кстати, следует  отметить,  что  реляционная  модель   обычно   рассматривается  как  включающая  еще  одно  подобное "метаограничение" — правило целостности сущностей. Отложим обсуждение этого правила до главы 19.

случае самоссылающейся переменной отношения), за исключением той ситуации, когда определение внешнего ключа распространяется на некоторые "ссылочные  действия"; тогда оно представляет собой нечто большее, чем просто ограничение ссылочной целостности как таковое. Эта тема рассматривается в следующем  подразделе, "Ссылочные действия".

Ссылочные действия

Рассмотрим следующий оператор на языке Tutorial D.

DELETE S WHERE S# = S# (‘S1′) ;

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

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

VAR SP BASE RELATION { … } …

FOREIGN KEY { S# } REFERENCES S

ON DELETE CASCADE ;

Спецификация ON DELETE CASCADE определяет правило удаления для данного конкретного внешнего ключа, а спецификация CASCADE является ссылочным действием для этого правила удаления. Смысл данных спецификаций состоит в том, что выполнение операции DELETE на переменной отношения поставщиков "каскадно" приводит к удалению также соответствующих кортежей (если они имеются) в переменной отношения поставок.

Еще  одним  широко  применяемым  вариантом  ссылочного  действия  является RESTRICT (оно не имеет ничего общего с операцией сокращения реляционной алгебры). В данном случае использование ключевого слова  RESTRICT означает, что операции DELETE должны "ограничиваться" теми  ситуациями, в которых отсутствуют согласованные поставки (в противном случае они будут отвергнуты). Если же в определении конкретного внешнего ключа ссылочное действие не указано, это эквивалентно применению ключевого слова NO ACTION, которое означает именно то, что в нем сказано: операция DELETE выполняется точно так же, как в ней указано, не больше и не меньше. (Если в рассматриваемой ситуации задано ключевое слово NO ACTION, а с удаляемыми данными о поставщике связаны согласованные данные о  поставках, то в дальнейшем возникает нарушение ограничения ссылочной целостности, поэтому конечный результат

становится аналогичным такому, как при использовании ключевого слова RESTRICT.)

Из этого следуют приведенные ниже выводы.

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

■     CASCADE. Действие операции UPDATE распространяется каскадно для обнов ления внешнего ключа также и в этих согласованных поставках.

■     RESTRICT. Действие операции UPDATE ограничивается тем случаем, когда от сутствуют такие согласованные поставки (в противном случае эта операция от вергается).

■     NO ACTION. Операция UPDATE выполняется в точном соответствии с указани ем (но в дальнейшем может произойти нарушение ссылочной целостности).

2.  Безусловно, CASCADE, RESTRICT и NO ACTION не являются единственными воз можными ссылочными действиями; они просто относятся к таким типам, которые часто требуются на практике. А в принципе может существовать произвольное ко личество допустимых ответов (например) на попытку удалить данные о некотором поставщике. Ниже приведено несколько примеров.

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

■     Информация может быть записана в некоторую архивную базу данных.

■     Поставки, относящиеся к рассматриваемому поставщику, могут быть переданы некоторому другому поставщику.

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

3.  Предположим, что R2 и R1, соответственно, — ссылающаяся переменная отноше ния и связанная с ней переменная отношения, указанная в ссылке, как показано ниже.

R2  R1

Допустим, что в применяемом правиле удаления задано действие CASCADE. В таком случае выполнение операции DELETE над указанным кортежем R1 влечет за собой (в общем) выполнение операции DELETE над некоторыми кортежами переменной отношения R2. Если же теперь предположить, что на переменную отношения R2, в

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

R3   →  R2   →   R1

Это означает, что результаты выполнения последней операции зависят от того, какое правило удаления определено для ограничения ссылочной  целостности, направленного от R3 к R2. Если эта подразумеваемая операция DELETE завершается неудачей (согласно правилу удаления, которое связывает R3 с R2, или по какойлибо иной причине), то окончится неудачей вся операция и база данных остается неизменной. Подобная процедура распространяется рекурсивно на любое количество уровней.

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

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

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии