Главная » SQL, Базы данных » ПОДРОБНЫЕ СВЕДЕНИЯ ОБ ОГРАНИЧЕНИЯХ ЦЕЛОСТНОСТИ

0

В общем, ограничения целостности представляют собой ограничения, налагаемые на значения, которые разрешено принимать некоторой переменной, или комбинации переменных1. Поэтому тот факт, что конкретная переменная относится к некоторому определенному типу, представляет собой априорное ограничение, налагаемое на рассматриваемую переменную (это ограничение состоит в том, что значения, которые может принимать данная переменная, должны, безусловно, быть значениями этого типа). Например, переменная отношения S (поставщики) ограничивается тем, что должна содержать значения, являющиеся  отношениями, в которых каждое значение s# представляет собой номер поставщика (значение типа s#), каждое значение SNAME является именем  (значением типа NAME) и т.д.

Но эти простые априорные ограничения, безусловно, не остаются  единственными возможными;   и   действительно,   в   этом   смысле   ни   один   из   шести   примеров, приведенных  в  разделе  9.1,  не  представлял  собой  априорное  ограничение.  Еще  раз рассмотрим пример 1.

Значение статуса каждого поставщика должно находиться в пределах от 1 до 100

включительно.

Ниже приведена немного более точная формулировка того же ограничения.

Если s — поставщик, то s имеет значение статуса в пределах от 1 до 100 включительно.

А здесь показан еще более точный (или более формальный) способ формулировки этого ограничения2.

1  Как следует из этого замечания, ограничения целостности применяются (по крайней мере, в прин ципе) к переменным всех типов. Но по очевидным причинам основное внимание в данной книге уделе но именно переменным отношения.

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

FORALL s# € S#, sn NAME, st € INTEGER, sc € CHAR (

IF { S# s#, SNAME sn, STATUS St, CITY sc } S  THEN St

≥ 1 AND st ≤ 100 )

Это формальное выражение можно прочитать следующим образом (на довольно ломаном естественном языке).

Для всех номеров поставщиков si, всех имен sn, всех целых чисел st и  всех символьных строк sc, если в переменной отношения поставщиков появляется кортеж: с атрибутами Si si, SNAME sn, STATUS st и CITY sc, то значение st больше или равно 1 и меньше или равно 100.

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

Если (IF) в некоторой переменной отношения присутствует некоторый кортеж, то (‘THEN,) этот кортеж удовлетворяет некоторому условию.

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

IF  p  THEN  q

Здесь р и q — логические выражения, соответственно, называемые посылкой и следствием. Общее выражение (т.е. импликация) является  ложным, если р — истинно, a q — ложно, в противном случае оно является истинным; иными словами, само выражение IF р THEN q является логическим и оно логически эквивалентно выражению (NOT р)   OR q.

Кстати, следует отметить, что показанная выше форма по умолчанию  включает необходимый квантор FORALL, поскольку выражение "Если (IF) … присутствует некоторый кортеж" по сути означает "Для всех (FORALL) присутствующих кортежей, …".

Теперь перейдем к аналогичному анализу примеров 2—6 (но при этом не используя формулировок на естественном языке).

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

2.    Каждый поставщик из Лондона имеет статус 20.

FORALL s# € S#, sn € NAME, st € INTEGER, sc

€ CHAR ( IF { S# s#, SNAME sn, STATUS st,

CITY sc } € S THEN ( IF sc = ‘London’ THEN

st = 20 ) )

В этом примере следствие импликации само является импликацией.

3.     Если вообще имеются какие-либо детали, то по меньшей мере одна из них должна иметь синий цвет.

IF

EXISTS р# е Р#, pn € NAME, p1 € COLOR, pw € WEIGHT, pc € CHAR

( { Р# р#, PNAME pn, COLOR pi, WEIGHT pw, CITY pc } € Р

) THEN

EXISTS p# € P#, pn € NAME, p1 € COLOR, pw € WEIGHT, pc € CHAR

( { P# p#, PNAME pn, COLOR p1, WEIGHT pw, CITY pc }

€ P AND p1 = COLOR (‘Blue’) )

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

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

FORALL р# € P#, pn € NAME, p1 € COLOR, pw € WEIGHT, pc € CHAR ( IF { P# p#, PNAME pn, COLOR p1, WEIGHT pw, CITY pc

} € P THEN EXISTS q# € P#, qn € NAME, ql € COLOR, qw € WEIGHT, qc € CHAR

( { P# q#, PNAME qn, COLOR ql,

WEIGHT qw, CITY qc } G P AND ql = COLOR (‘Blue’) ) )

4.    Разные поставщики не могут иметь одинаковые номера поставщиков,

FORALL x# G S#, xn G NAME, xt G INTEGER, xc G CHAR, y# G S#, yn G NAME, yt G INTEGER, yc G CHAR ( IF

{ S# x#, SNAME xn, STATUS xt, CITY xc } G S AND

{ S# y#, SNAME yn, STATUS yt, CITY yc } G S THEN ( IF x# = y# THEN xn = yn AND xt = yt AND xc = yc ) )

Данное выражение представляет собой просто формальное изложение того факта, что

{S#} является потенциальным ключом (или, во всяком случае,  суперключом)  для поставщиков; таким образом, ограничения ключа представляют собой лишь частный случай  ограничений  как  таковых.  Синтаксическая  конструкция  KEY  {S#}  языка

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

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

Кстати, отметим, что этот пример имеет следующую общую форму.

Если (IF) некоторые кортежи появляются в некоторой переменной отношения, то (THEN)

эти кортежи удовлетворяют некоторому условию.

Сравните между собой примеры 2 и 3, которые оба принимают такую же форму, как и пример 1 (вскоре станет очевидно, что это относится и к примеру 5). В отличие от этого, пример 6 принимает следующую общую форму.

Если (IF) некоторые кортежи появляются в некоторых переменных отношения, то (THEN) эти кортежи удовлетворяют некоторому условию.

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

5.    Каждая поставка выполняется существующим поставщиком.

FORALL  s#  € S#,  р#  €  Р#,  q €e   QTY (  IF  {  S#  s#,  P# p#,  QTY  q  }  €

SP

THEN EXISTS  sn €  NAME,   st  €  INTEGER,   sc  €  CHAR

(   {  S#  S#,   SNAME  sn,   STATUS  st,  CITY  SC  }  € S  )   )

Это выражение представляет собой формальное утверждение того факта, что {S#} является внешним ключом для поставок, который соответствует потенциальному ключу {S#} для поставщиков. Поэтому ограничения внешнего ключа также являются лишь частным случаем ограничений как таковых (дополнительная информация по этой теме также приведена в разделе 9.10). Следует отметить, что в этом примере участвуют две отдельные переменные отношения, SP и S, а во всех примерах 1—4 участвует только одна переменная отношения3.

6.    Ни один поставщик со статусом меньше 20 не поставляет любые детали в количест ве больше 500.

FORALL s# e  S#, sn € NAME, st € INTEGER, sc € CHAR, p# € P#, q € QTY

( IF { S#  s#, SNAME sn, STATUS st, CITY sc } € S AND

{ S# s#, P# p#, QTY q } € SP

THEN st> 20 OR q < QTY ( 500 ) )

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

Примеры на языке Tutorial D

В завершение данного раздела рассмотрим версии примеров 2—6 на языке Tutorial D (на основе исчисления). При этом применяются обычные соглашения, касающиеся имен переменных области значений.

3  В предыдущем издании данной книги для обозначения ограничения, в котором участвует одна и только одна переменная отношения, использовался термин "ограничение переменной отношения", а для ограничения, в котором участвовало больше переменных отношений, — термин "ограничение базы данных". Но, как будет показано в разделе 9.9,  важность  такого  разграничения в  большей  степени  относится к  сфере  практики, чем  логики,  поэтому в дальнейшем изложении эта тема фактически не рассматривается.

1.      Каждый поставщик из Лондона имеет статус 20.

CONSTRAINT SC2

FORALL SX ( IF SX.CITY = ‘London’

THEN SX.STATUS = 2 0 END IF ) ;

Обратите внимание на то, что в языке Tutorial D логические импликации (выражения

IF/THEN) включают обозначение конца выражения "END IF".

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

CONSTRAINT   PC3

IF   EXISTS   PX   (   TRUE   )

THEN  EXISTS   PX   (   PX.COLOR  =   COLOR   ( ‘ B l u e ‘ )                                        ) END   IF   ;

3.           Разные поставщики не могут иметь одинаковые номера поставщиков.

CONSTRAINT SC4

FORALL SX FORALL SY ( IF SX.S#     =   SY.S# THEN SX.SNAME =                                        SY.SNAME AND SX.STATUS =                                        SY.STATUS AND SX.CITY   =

SY.CITY

END IF ) ;

4.           Каждая поставка выполняется существующим поставщиком.

CONSTRAINT SSP5

FORALL SPX EXISTS SX ( SX.S# = SPX.S# ) ;

5.           Ни один поставщик со статусом меньше 20 не поставляет любые детали в количест ве больше 500.

CONSTRAINT SSP6

FORALL SX FORALL SPX

( IF SX.S# = SPX.S#

THEN SX.STATUS ≥ 20 OR SPX.QTY ≤ 500 END IF ) ;

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

По теме:

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