|
Программирование >> Хронологические базы данных
Наконец разгруппируем это отношение (опять же, см. главу 6). ТЗ UNGROUP Y Это выражение служит для получения отношения, которое ранее было названо нами RESULT. Иными словами, объединив все шаги и сделав небольшие упрошения, получим окончательное выражение, которое в результате даст отношение RESULT. WITH SP DURING { S#, DURING } AS Tl, ( Tl GROUP ( DURING ) AS X ) AS T2, ( EXTEND T2 ADD COALESCE ( X ) AS Y ) { ALL BUT X } AS T3 : T3 UNGROUP Y Очевидно, было бы лучше, если бы можно было получить результирующее отношение RESULT из отношения Т1 с помощью единственной операции. С этой целью введем новый оператор реляционного свертывания со следующим синтаксисом. R COALESCE А Здесь R - реляционное выражение, а А - некоторый атрибут некоторого интервального типа, и этот атрибут принадлежит отношению, которое данное выражение обозна-чает. Семантика этих операторов определяется очевидными обобщениями операций группирования, расширения, проекции и разгруппирования, с помощью которых было получено отношение RESULT из отношения Tl. Замечание. Стоит отметить, что свертывание отношения R по атрибуту А предусматривает его группирование по всем атрибутам, кроме атрибута А (напомним, что, как указывалось в главе 6, например выражение Tl GROUP (DURING)... может читаться как сгруппировать отношение Т1 по атрибуту S# , где S# - единственный атрибут отношения Tl, не указанный в предложении GROUP). Суммируя все сказанное выше, теперь можно предложить более приемлемую и достаточно простую формулировку запроса 4.1. SP DURING { S#, DURING } COALESCE DURING В целом, операция, которая обозначается этим выражением, является примером того, что некоторыми авторами называется хронологической проекцией. А точнее, это хронологическая проекция отношения SP DURING по атрибутам S# и DURING. (Напомним, что в первоначальной версии этого запроса {запрос 1.1) использовалась обычная проекция отношения SP по атрибуту St.) Заметим, что хронологическая проекция- это не совсем проекция как таковая; скорее, это хронологический аналог обычной проекции. Теперь перейдем к запросу 3.2. Исходя из содержимого базы данных, представленного на рис. 22.4, этот запрос можно переформулировать следующим образом. Запрос 4.2. Получить пары атрибутов Si, DURING для тех поставщиков, которые не могут поставить ни одной детали в определенное время, где атрибут DURING представляет максимально продолжительный период, в течение которого поставщик St фактически не мог поставить ни одной детали. При желании операнд А мог бы быть расширен, чтобы можно было задать список имен атрибутов. Аналогичное замечание относится также к оператору реляционного развертывания (см. ниже). Именно такая семантика приведена в упр. 22.8. Напомним, что в исходной версии этого запроса {запрос 1.2) использовалась операция получения реляционной разности. Поэтому вы не ошибетесь, если предположите, что в данном случае нам потребуется новая операция, которая будет называться хронологическая разность . Также можно рассчитывать на то, что как хронологическая проекция требует реляционного свертывания , так хронологическая разность потребует реляционного развертывания . Операция получения хронологической разности , как и обычная операция вычитания, включает два операнда типа отношений. Сначала рассмотрим левый операнд. Если мы развернем результат обычной проекции S DURING {St,DURING} по атрибуту DURING, то получим отношение (скажем, Т1), которое будет выглядеть следующим образом.
При использовании данных, представленных на рис. 22.4, отношение Tl будет содержать всего 23 кортежа. (Упражнение. Проверьте достоверность этого утверждения.) Если определить версию унарного отношения для оператора UNFOLD по аналогии с версией унарного отношения для оператора COALESCE, то отношение Tl можно будет получить таким образом. ( EXTEND { S DURING { SI, DURING } GROUP ( DURING ) AS X ) ADD UNFOLD ( X ) AS Y { ALL BUT X } UNGROUP Y Однако, как уже указывалось, это выражение можно упростить, если ввести оператор реляционного развертывания со следующим синтаксисом. R UNFOLD А Теперь можно записать следующее. WITH ( S DURING { SI, DURING } UNFOLD DURING ) AS Tl : Правый операнд хронологической разности мы представляем следующим образом. WITH { SP DURING { St, DURING } UNFOLD DURING ) AS T2 : Воспользуемся обычной операцией реляционного вычитания. WITH { Tl MINUS Т2 ) AS ТЗ : Отношение ТЗ выглядит так.
И наконец, чтобы получить требуемый результат, свернем отношение ТЗ по атрибуту DURING.
Теперь сформулируем запрос 4.2 в виде одного вложенного выражения. { ( S DURING { S#, DURING } UNFOLD DURING ) MINUS { SP DURING { St, DURING } UNFOLD DURING ) ) COALESCE DURING Как уже отмечалось, всю операцию, обозначаемую этим выражением, часто называют хронологической разностью (точнее, хронологической разностью между проекциями S DURING и SP DURING по атрибутам St и DURING). Замечание. Как и хронологическая проекция, хронологическая разность не является, строго говоря, разностью как таковой, а представляет собой хронологический аналог обычной разности. Однако это еще не все. Выражения, подобные приведенному выше и использующие хронологическую разность , настолько часто встречаются на практике, что, пожалуй, стоит определить еще одно дополнительное сокращение. А именно, целесообразно представить в виде единой операции приведенную ниже последовательность действий: Обратите внимание, что для операции временной проекции явного сокращения мы не определяли.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |