Программирование >>  Хронологические базы данных 

1 ... 281 282 283 [ 284 ] 285 286 287 ... 348


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

R1 I MINUS R2 ON А

Здесь R1 и R2- реляционные выражения, обозначающие отнощения rl и г2 одного и того же типа, а Л - атрибут некоторого интервального типа, общего для обоих отнощений (префикс 1 , конечно же, указывает на интервал ). Из сказанного выще должно быть более или менее ясно, что определяемое выражение будет семантически равносильно следующему выражению.

( ( R1 UNFOLD А ) MINUS ( R2 UNFOLD А ) ) COALESCE А

Дальнейщее обсуждение операторов вида 1 , подобных оператору I MINUS, будет продолжено в упр. 22.2.

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

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

VAR S DURING BASE RELATION

{ S# S#, SNAME NAME, STATUS INTEGER, CITY CHAR,

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

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

Jones

Paris

[d02.d08]

Jones

Paris

[d07.dl0]

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



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

Jones

Paris

[d02,d06]

Jones

Paris

[d07,dl0]

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

S2 I Jones 10 I Paris \[d02.dl0]

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

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

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

VAR S DURING BASE RELATION

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

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

COALESCED DURING ;

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

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



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

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

Jones

Paris

[d02,d08]

Jones

Paris

[d07.dlO]

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

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

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

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

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

Следовательно, никакие два отдельных кортежа не могли бы иметь одно и то же значение атрибута S# и перекрываюшиеся значения атрибута DURING, поскольку в форме S DURING UNFOLD DURING все значения атрибута DURING являются единичными интервалами, и два кортежа с одним и тем же значением атрибута S# и перекрываюшимися значениями атрибута DURING являлись бы дубликатами (фактически они были бы одним и тем же кортежем).

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

VAR S DURING BASE RELATION

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



1 ... 281 282 283 [ 284 ] 285 286 287 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика