Скачиваний:
77
Добавлен:
02.05.2014
Размер:
2.54 Mб
Скачать

22.9. Ограничения, включающие интервалы

Очевидно, что пара атрибутов {Si,DURING} является потенциальным ключом для пе­ременной-отношения S DURING. На рис. 22.4 для данного ключа использовалось подчер­кивание двойной линией, указывающее, что это первичный ключ. Отметим, что атрибут {Si} сам по себе не является потенциальным ключом, поскольку после завершения дей­ствия договора с некоторым поставщиком может быть заключен новый договор, как, на­пример, в случае поставщика с номером 'S2' в базе данных, представленной на рис. 22.4. Таким образом, переменную-отношение S_DURING можно определить так.

VAR S_DURING BASE RELATION

{ Si SI, SNAME NAME, STATUS INTEGER, CITY CHAR,

DURING INTERVAL ( DATE ) } KEY { Si, DURING } ; /* Предупреждение: этого недостаточно! */

Однако определение ключа, как оно здесь представлено, не полностью отвечает не­обходимым требованиям, несмотря на то что оно логически корректно. А именно, со­гласно этому определению в переменной-отношении S DURING допустимы, например, два таких кортежа.

S2

Jones

10

Paris

[d02,d08]

S2

Jones

10

Paris

[d07,dl0]

Как видите, в этих кортежах имеется определенная избыточность, поскольку данные о наличии договора с поставщиком с номером 'S2' в дни 7 и 8 представлены дважды.

Данный вариант предложения KEY имеет и другой недостаток: оно не исключает воз­можности появления в переменной-отношении S DURING, например, таких двух кортежей.

S2

Jones

10

Paris

[d02,d06]

S2

Jones

10

Paris

\d07,dl0]

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

S2 | Jones [10 1 Paris \[d02,dl0]

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

Если два отдельных кортежа переменной-отношения S DURING идентичны, за ис­ключением лишь значений их атрибутов DURING, равных И и /2, то результат опера­ции il MERGES i2 должен иметь значение ложь.

(Напомним, что операция проверки слияния интервалов MERGES представляет собой логическую конъюнкцию (OR) операций перекрытия интервалов OVERLAPS и проверки смежности MEETS. Поэтому операция MERGES может возвращать результат ложь только в том случае, если он будет получен и для обеих операций OVERLAPS и MEETS. Ограничение перекрытия интервалов с помощью операции OVERLAPS служит для предотвращения из­быточности, а ограничение смежности интервалов с помощью операции MEETS использу­ется, чтобы предотвратить излишнее "многословие".) Должно быть ясно, что существует очень простой способ реализации ограничения С1, а именно— посредством постоянной поддержки переменной-отношения SJ3URING в свернутом состоянии по всем значениям времени атрибута DURING. Поэтому добавим к определению этой переменной-отношения предложение COALESCED, которое в общем случае является необязательным.

VAR S DURING BASE RELATION

{ S? Si, SNAME NAME, STATUS INTEGER, CITY CHAR,

DURING INTERVAL ( DATE ) } KEY { St, DURING } ; /* Этого по-прежнему недостаточно! */

COALESCED DURING ;

Ч Отметим, что можно добавить аргумент с целью обеспечения соответствующего специ­ального синтаксиса для решения проблемы избыточности, но не проблемы "многословия".

Уточнение COALESCED DURING в данном случае означает, что переменная-отношение S DURING должна по всем значениям времени быть идентичной результату выражения S_DURING COALESCED DURING (подразумевается, что теперь свертывание переменной-отношения S_DURING по атрибуту DURING в любых выражениях никогда не будет оказы­вать на нее какого-либо влияния). Таким образом, в этом определении проблемы избы­точности и "многословия" по-прежнему остались нерешенными11.

Замечание. Пока подразумевается, что любая попытка обновить переменную-отношение S_DURING так, чтобы она оказалась не полностью свернутой по атрибуту DURING, отвергается. Обсуждение этого вопроса будет продолжено в разделе 22.10.

К сожалению, предложения KEY и COALESCED все еще не полностью отвечают необхо­димым требованиям. Например, по-прежнему возможно появление таких двух кортежей.

S2

Jones

10

Paris

[d02.dOS]

S2

Jones

20

Paris

[d07,dW]

В этом случае поставщик с номером 'S2' в дни 7 и 8 имеет статус 10 и 20 (ясно, что наличие таких кортежей недопустимо). Другими словами, здесь мы имеем дело с противоречием.

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

Если два отдельных кортежа переменной-отношения S_DURING с одним и тем же значением атрибута S# имеют значения атрибута DURING, равные il и i2 соответст­венно, и выражение il OVERLAPS i2 истинно, то эти кортежи должны быть иден­тичны, за исключением, может быть, значений их атрибута DURING.

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

  • Единственный потенциальный ключ для развернутой формы переменной-отношения S_DURING UNFOLD DURING— это все та же комбинация атрибутов {S#,DURING}, поскольку в любое заданное время любой заданный поставщик, с которым в данное время заключен договор, имеет только одно имя, один статус и находится в одном городе.

  • Следовательно, никакие два отдельных кортежа не могли бы иметь одно и то же значение атрибута St и "перекрывающиеся" значения атрибута DURING, поскольку в форме S_DURING UNFOLD DURING все значения атрибута DURING являются еди­ничными интервалами, и два кортежа с одним и тем же значением атрибута St и "перекрывающимися" значениями атрибута DURING являлись бы дубликатами (фактически они были бы одним и тем же кортежем).

Поэтому, если обеспечено такое ограничение, что комбинация атрибутов {St,DURING} является потенциальным ключом для формы S_DURING UNFOLD DURING, ограничение С2 обеспечивается "автоматически". Определим новое предложение I_KEY, которое может ис­пользоваться вместо обычного предложения KEY в переменной-отношении S_DURING.

VAR S_DURING BASE RELATION

{ St St, SNAME NAME, STATUS INTEGER, CITY CHAR, DURING INTERVAL ( DATE ) }

I KEY { St, DURING UNFOLDED} COALESCED DURING ;

Предложение I_KEY здесь означает именно то, что комбинация атрибутов {S#,DURING} является потенциальным ключом для формы S_DURING UNFOLD DURING12. Таким образом, этого специального синтаксиса вполне достаточно для устранения ука­занного противоречия.

Необходимо заметить, что если комбинация атрибутов {Si,DURING} является по­тенциальным ключом для формы S DURING UNFOLD DURING, то она, безусловно, явля­ется потенциальным ключом и для переменной-отношения S_DURING. Это позволяет отказаться от исходного предложения KEY для переменной-отношения S_DURING в пользу предложения I_KEY. Также отметим, что ключ {S#,DURING} может считаться хронологическим потенциальным ключом в смысле, который вкладывался в это понятие в разделе 22.3. Кроме того, как мы уже убедились, этот хронологический по­тенциальный ключ — действительно настоящий потенциальный ключ для содержащей его переменной-отношения, в отличие от "хронологических потенциальных ключей", которые рассматривались в разделе 22.3.

Естественно предположить, что если поддерживается синтаксис предложения I_KEY для потенциальных ключей, то мы вправе ожидать, что имеется соответствующая под­держка и для внешних ключей. Например, определение переменной-отношения SP_DURING может включать приведенное ниже уточнение.

FOREIGN I_KEY { St, DURING UNFOLDED } REFERENCES S_DURING ...

Его смысл заключается в следующем: если в переменной-отношении SP_DURING име­ются сведения о том, что поставщик с номером ' Sx' может поставлять некоторые детали в течение интервала i, то в переменной-отношении S_DURING также должно быть ото­бражено, что с поставщиком с номером 'Sx' заключен договор, действительный в тече­ние всего этого интервала i. Если данное ограничение удовлетворяется, комбинация ат­рибутов {Si,DURING} в переменной-отношении SP_DURING может считаться хронологи­ческим внешним ключом в смысле, оговоренном в разделе 22.3. (Однако это еще не настоящий внешний ключ в классическом смысле.)

12 Некоторые авторы определяют семантику предложения I KEY таким образом, что оно ис­пользуется и для решения проблемы избыточности. Мы же считаем такой подход несколько нелогич­ным и здесь не используем (во всяком случае в этом нет необходимости, поскольку ясно, что для того, чтобы справиться с проблемой избыточности, вполне достаточно и предложения COALESCED).

Следует обратить внимание на одну особенность, касающуюся переменной-отношения S_DURING. Предположим, что она на самом деле постоянно поддерживается в свернутом состоянии по атрибуту DURING. Предположим также, что время от времени мы запускаем процедуру, пересчитывающую статус поставщиков, с которыми в текущее время заключен договор. Конечно, процедура должна также записывать в переменную-отношение S DURING предыдущие значения статуса. Иногда в результате пересчета зна­чения статуса будут оставаться без изменений. В таких случаях процедура будет маши­нально пытаться вставить, запись предыдущего статуса в переменную-отношение S_DURING, в результате чего будет нарушено требование свернутого состояния, выражае­мого предложением COALESCED. Чтобы таких ситуаций не возникало, в процедуре долж­ны быть предусмотрены проверка изменения статуса и выполнение соответствующей операции обновления вместо операции вставки, которая используется в том случае, если статус изменился (см. упр. 22.3). В качестве альтернативного подхода можно было бы не поддерживать переменную-отношение S_DURING в свернутом состоянии по атрибуту DURING. Такое решение, возможно, не подходит для данного конкретного случая, но мо­жет быть подходящим для других случаев.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]