|
Программирование >> Хронологические базы данных
функция вычисляется только один раз и для всего отношения sp в целом. Следовательно, вычисление представленного выше выражения SUMMARIZE даст в результате отношение с одним атрибутом (с именем GRANDTOTAL) и одним кортежем, причем единственное скалярное значение в единственном результирующем кортеже является общим итогом по всем значениям атрибута QTY в исходном отношении sp. Если, с другой стороны, исходное отношение sp совсем не имеет кортежей, то нет и групп, а следовательно, нет и результирующих кортежей, т.е. результирующее отношение также будет пустым. Однако приведенное ниже выражение, напротив, будет работать (т.е. будет возвращать корректное значение, а именно - нуль), даже если отношение sp пустое . SUMMARIZE SP PER RELATION { TUPLE { } } ADD SUM ( QTY ) AS GRANDTOTAL Точнее, это выражение будет возвращать отношение с одним лишь атрибутом GRANDTOTAL и одним кортежем, в котором значение GRANDTOTAL будет равно нулю. Поэтому автор предлагает разрешить опускать предложение PER в выражении SUMMARIZE, как это сделано в следующем примере. SUMMARIZE SP ADD SUM ( QTY ) AS GRANDTOTAL Подразумевается, что пропуск предложения PER эквивалентен определению этого предложения в следующей форме. PER RELATION { TUPLE { } } Транзитивное замыкание Операция транзитивного замыкания упоминается здесь, в основном, для полноты изложения. Ее детальное обсуждение выходит за рамки данной главы. Тем не менее мы дадим здесь определение этой операции. Пусть А - произвольное бинарное отношение с атрибутами X и Y, принадлежащими одному типу Т. Тогда транзитивным замыканием отношения А (что записывается как TCLOSE А) называется отношение А, заголовок которого такой же, как заголовок отношения А, а тело является супермножеством отношения А. Супермножество отношения А определяется следующим образом. Кортеж { Х:х, Y:y } принадлежит отношению А тогда и только тогда, когда он принадлежит отношению А или когда существует последовательность значений zl, z2, ... , zn (принадлежащих типу Т), такая, что все кортежи { Х:х, Y:zl }, { X:zl, Y:z2 }, ... , { X:zn, Y:y } принадлежат отношению A. Иначе говоря, кортеж (х,у) принадлежит отношению А только тогда, когда (нестрого говоря) в представляющем отношение А графе есть линия, соединяющая точку х с точкой у. Обратите внимание на то, что тело отнощения А всегда содержится в теле отношения А как подмножество. Обсуждение этого вопроса будет продолжено в главе 23. Выражение RELATION { TUPLE { } } в предложении PER этого примера обозначает отношение (в действителыюсти единственное в своем роде отношение), которое не имеет атрибутов, но имеет один кортеж (а именно - 0-кортеж). Это выражение можно сокращенно называть TABLE DEE[3.3], [5.5], [6.2]. 6.8. Группирование и разгруппирование Поскольку значениями атрибутов отношений могут быть другие отношения, было бы желательным наличие дополнительных реляционных операторов, называемых операторами группирования и разгруппирования [3.3]. Рассмотрим сначала пример операции группирования. SP GROUP ( Pi, QTY ) AS PQ Результат выполнения этого выражения будет выглядеть так, как показано на рис. 6.12. Замечание. Этот рисунок наверняка будет очень полезен при разборе последующих пояснений, поскольку они, к сожалению (но неизбежно), несколько абстрактны. Puc. 6.12. Группирование отношения SP no атрибуту Si Начнем с того, что исходное выражение SP GROUP ( Pi, QTY ) AS PQ можно прочесть как сгруппировать отношение SP по атрибуту Si , поскольку атрибут Si является единственным атрибутом отношения SP, не упомянутым в предложении GROUP. В результате получится отношение, заголовок которого выглядит так. { Si Si, PQ RELATION { Pi Pi, QTY QTY } } Другими словами, он состоит из атрибута PQ, принимающего в качестве значений отношения (PQ, в свою очередь, имеет атрибуты Р# и QTY), а также из всех остальных атрибутов отношения SP (в нашем случае все остальные атрибуты - это атрибут S#). Тело этого отношения содержит ровно по одному кортежу для всех различных значений атрибута S# исходного отношения SP (и никаких других кортежей). Каждый кортеж в теле содержит соответствующее значение атрибута S# (обозначим его через s), а также значение атрибута PQ (обозначим его через pq), полученное следующим образом. Каждый кортеж отношения SP концептуально заменяется кортежем (обозначим его через х), в котором компоненты Р# и QTY как бы упакованы в один компонент, принимающий в качестве значений кортежи (обозначим его через у). Компоненты у всех кортежей х, значение S# которых равно s, группируются в отношение pq, и таким образом получается результирующий кортеж, в котором значение S# равно s, а значение PQ равно pq. Окончательный результат будет выглядеть так, как показано на рис. 6.12. Перейдем теперь к операции разгруппирования. Пусть SPQ- это отношение, показанное на рис. 6.12. Тогда выражение SPQ UNGROUP PQ возвращает нас к отношению SP (как и следовало ожидать). Точнее, оно выдает в качестве результата отношение, заголовок которого выглядит так. { S# S#, Р# Р#, QTY QTY } Иными словами, его заголовок состоит из атрибутов Р# и QTY (полученных из атрибута PQ), а также из всех остальных атрибутов отношения SPQ (в нашем случае это только атрибут S#). Тело полученного отношения содержит ровно по одному кортежу для каждой комбинации кортежа отношения SPQ с кортежем значения PQ, являющегося элементом кортежа SPQ (других кортежей в нем нет). Каждый такой кортеж содержит соответствующее значение атрибута S# (обозначим его через s), а также значения атрибутов Р# и QTY (обозначим их через р и q), которые получены следующим образом. Каждый кортеж отношения SPQ мысленно заменяется множеством кортежей, которое содержит по одному кортежу (обозначим его через х) для каждого кортежа из значения PQ. Каждый кортеж х содержит компонент S# (обозначим его через s), равный компоненту S# рассматриваемого кортежа SPQ, а также компонент (обозначим его через у), равный некоторому кортежу из компонента PQ рассматриваемого кортежа SPQ. Компоненты у каждого такого кортежа х, значение S# которых равно s, разворачиваются в отдельные компоненты Р# и QTY (обозначим их через р и q). В результате получается кортеж, значение компонента S# которого равно s, значение компонента Р# равно р и значение компонента QTY равно q. Таким образом, в результате разгруппирования получилось отношение SP. Глава 6. Реляционная алгебра 223
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |