|
Программирование >> Хронологические базы данных
а) развернуть оба операнда; б) получить разность; в) свернуть полученный результат. Кроме того, подобное сокращение имеет дополнительное преимущество - появляется возможность повышения производительности. Если используются длинные интервалы с мелкой зернистостью, то результат развертывания отнощения может быть очень больщим по сравнению с ее операндом. Если система будет реально материализовать оба развертывания, вычислять разность и затем путем свертывания получать результат, то такой запрос может выполняться вечно или же приводить к переполнению доступного дискового пространства. Выражение хронологической разности в виде одной операции может помочь оптимизатору понять , что именно требуется, и, возможно, избежать реального выполнения каких-либо развертываний. Ниже предлагается такое дополнительное сокращение. 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 допустимы, например, два таких кортежа.
Как видите, в этих кортежах имеется определенная избыточность, поскольку данные о наличии договора с поставщиком с номером S2 в дни 7 и 8 представлены дважды. Данный вариант предложения KEY имеет и другой недостаток: оно не исключает возможности появления в переменной-отношении S DURING, например, таких двух кортежей.
В этом случае уже нет избыточности данных, однако имеется излишнее многословие, поскольку два кортежа используются для того, чтобы сказать то, что можно выразить в одном кортеже. 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 все еше не полностью отвечают необходимым требованиям. Например, по-прежнему возможно появление таких двух кортежей.
В этом случае поставшик с номером 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 ) }
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |