Главная » SQL, Базы данных » СХЕМА КЛАССИФИКАЦИИ ОГРАНИЧЕНИЙ

0

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

■     Ограничением базы данных называется ограничение на значения, которые разреше но принимать указанной базе данных.

■     Ограничением переменной отношения называется ограничение на значения, которые разрешено принимать указанной переменной отношения.

■     Ограничением атрибута называется ограничение на значения, которые разрешено принимать указанному атрибуту.

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

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

Ограничения типа

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

11  Обратите также внимание на то, что это производное ограничение фактически является  ограничением внешнего ключа от базовой переменной отношения к представлению! (См. раздел 9.10.)

354     Часть II. Реляционная модель

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

TYPE WEIGHT POSSREP { D DECIMAL (5,1)

CONSTRAINT D > 0.0 AND D < 5000.0 } ;

Он имеет следующий смысл: допустимыми значениями типа WEIGHT ЯВЛЯЮТСЯ такие и только такие значения, которые можно представить десятичными числами с точностью пять цифр и с одной цифрой после десятичной точки, где рассматриваемое десятичное число больше нуля и меньше 5000.

Теперь должно быть очевидно, что единственный способ, благодаря которому любое выражение может принять значение типа WEIGHT, СОСТОИТ В использовании некоторого вызова селектора WEIGHT. Поэтому единственная возможность нарушения в любом таком выражении ограничения типа WEIGHT состоит в том, что это ограничение будет нарушено в вызове селектора. Из этого следует, что  ограничения типа всегда могут рассматриваться (по меньшей мере, концептуально) как проверяемые во время некоторого вызова селектора. Например, рассмотрим следующий вызов селектора для типaWEIGHT.

WEIGHT ( 7500.0 )

Это выражение активизирует исключение во время прогона программы (которое словесно выражается как "нарушение ограничения типа WEIGHT — значение выходит за допустимые пределы").

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

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

Ограничения атрибута

Ограничения атрибута, по сути, состоят в том, что в разделе 9.2 было названо априорными ограничениями; иными словами, ограничением атрибута фактически является просто объявление, которое гласит, что указанный атрибут указанной  переменной отношения имеет указанный тип. Например, снова рассмотрим определение переменной отношения поставщиков, которое приведено ниже.

VAR S BASE RELATION

{ S#    S#,   SNAME

NAME, STATUS INTEGER, CITY CHAR } … ;

В этой переменной отношения на значения атрибутов s#, SNAME, STATUS и CITY наложено ограничение, согласно которому они должны, соответственно, иметь типы S#,

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

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

INSERT или UPDATE) значение атрибута, не имеющее допустимого типа, должна  быть просто отвергнута. Но на практике подобная ситуация не должна даже возникать, если

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

Ограничения переменной отношения и базы данных

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

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

CONSTRAINT TRC1 FORALL SX’

FORALL SX { SX’.S# SX.S# OR SX’.STATUS < SX.STATUS ) ;

Пояснение. Примем такое соглашение, что имя переменной области  значений  со штрихом, такое как SX’ в данном примере, обозначает ссылку на  соответствующую переменную отношения, которой она была до выполнения рассматриваемой операции обновления. Таким образом, ограничение, показанное в этом примере, можно описать следующим образом: "Если SX’ — кортеж поставщика перед выполнением обновления, то не должен существовать кортеж поставщика SX после обновления с таким же номером поставщика, как SX’, и со значением статуса меньше чем SX’".

12 Ограничения, не относящиеся к типу ограничений перехода, иногда называют ограничениями состояния.

Следует отметить, что приведенное выше ограничение TRC1 является офаничением перехода переменной отношения (оно касается только одной переменной отношения — S). Ниже для сравнения приведено ограничение перехода базы данных ("Общее количество деталей любого конкретного типа, имеющихся у всех поставщиков, ни в коем случае не должно уменьшаться").

CONSTRAINT TRC2

FORALL РХ

SUM ( SPX’ WHERE SPX’.P# = РХ.Р#, QTY

) SUM { SPX WHERE SPX .P# = PX.P#, QTY

) ;

Понятие ограничений перехода не распространяется на ограничения типа или атрибута.

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

По теме:

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