Главная » SQL, Базы данных » УПАКОВКА И РАСПАКОВКА ОТНОШЕНИЙ

0

В данном разделе рассматриваются два новых (и чрезвычайно важных) реляционных оператора, называемых PACK и UNPACK. Но в качестве промежуточного этапа на пути к определению этих операторов вначале  необходимо  сделать краткое отступление и рассмотреть два более простых их аналога, которые называются, соответственно, COLLAPSE и EXPAND. Кроме того, для упрощения изложения эти последние операторы будут описаны в обратном порядке.

Операторы EXPAND и COLLAPSE

Оба оператора, EXPAND И COLLAPSE, в том виде, в каком они описаны в этом разделе7, принимают в качестве единственного операнда унарное отношение,  кортежи которого содержат интервалы, и вырабатывают в качестве результата другое отношение такого же типа. Например, предположим, что отношение r выглядит примерно следующим образом.

PACK

( ( EXTEND NHW { HEIGHT, WEIGHT }     ADD INTERVAL_HEIGHT ( [ HEIGHT : HEIGHT ] ) AS HR )

{ WEIGHT, HR }

) ON HR

Пояснение. Начнем с формирования проекции NHW по атрибутам HEIGHT и WEIGHT, получив тем самым все пары значений роста и веса из первоначального отношения (т.е. все такие пары роста и веса, что имеется по меньшей мере одно лицо с таким ростом и весом). Затем эта проекция расширяется путем введения еще одного атрибута, HR, значением которого в любом заданном кортеже является единичный интервал в форме [h:h], где h — значение атрибута HEIGHT в том же кортеже (обратите внимание на вызов селектора интервала INTERVAL_HEIGHT). После этого с помощью операции проекции удаляется атрибут HEIGHT и результат упаковывается по атрибуту HR. Окончательным результатом становится отношение с двумя атрибутами WEIGHT И HR, которое имеет следующий предикат.

Для всех значений роста h в HR (но не для h = PRE (HR) или h = POST (HR)) существует по меньшей мере одно лицо р, такое что р имеет вес WEIGHT и рост h.

В качестве второго примера снова рассмотрим переменную отношения SP_DURING. В любой конкретный момент времени (при условии, что в это время вообще выполнялись какие-либо поставки) существует некоторый номер детали ртах, такой что ни один поставщик не способен поставлять в это время  какую-либо деталь с номером больше ртах. (Безусловно, при этом предполагается, что для значений типа Р# определен оператор ">".) Поэтому рассмотрим запрос: "Для каждого номера детали, который когда-либо был таким значением ртах, получить этот номер детали вместе с интервалом (интервалами), на протяжении которого он фактически был таким значением рmах". Ниже приведена одна из возможных формулировок подобного запроса.

WITH ( UNPACK SP_DURING ON DURING ) AS SP_UNPACKED , ( SUMMARIZE SP_UNPACKED

BY { DURING }

ADD MAX ( P# ) AS PMAX ) AS SUMMARY

: PACK SUMMARY ON DURING

Заключительные замечания

По поводу операторов PACK И UNPACK может быть сказано гораздо больше, чем было отведено места в этой главе. Их подробное описание можно найти в [23.4]; ниже просто перечислены без доказательства или дополнительных комментариев некоторые наиболее важные свойства этих операторов.

■    Упаковка или распаковка любого отношения r вообще без указания каких-либо атрибутов приводит просто к получению отношения r.

■    Распаковка отношения r по двум или нескольким атрибутам, притом что все эти атрибуты имеют значения в виде интервала8, осуществляется очень просто; если рас сматриваемыми атрибутами являются А1,  А2,  . . .,  An (в некотором порядке), то желаемый результат может быть получен путем распаковки г по атрибуту А1, затем распаковки результата этой первой распаковки по атрибуту А2,    . . ., наконец, распаковки результата предпоследней распаковки по атрибуту An.

■    Упаковка отношения r по двум или нескольким атрибутам, притом что все эти атрибуты имеют значения в виде интервала, становится немного более сложной задачей. Но неформально можно утверждать, что если рассматриваемыми атрибу тами являются А1,   А2,   . . .,   An (в указанном порядке), то желаемый результат можно получить, вначале распаковав r по всем указанным атрибутам, а затем упа ковав полученный результат распаковки по атрибуту А1, упаковав результат пер вой упаковки по атрибуту А2,    . . ., наконец, упаковав результат предпоследней упаковки по атрибуту An.

■    Предположим, что rl и г2 — отношения одного и того же типа и атрибуты А1,

А2,    . . .,   An этих двух отношений имеют значения в виде интервала. Тогда

8 Из этого следует, что такая операция идеально подходит для обработки отношений, имеющих два или несколько атрибутов со значениямиввидеинтервала.

отношения   rl   и   r   2   являются   эквивалентными    (применительно    к атрибутам  А1,  А2,  .  .  .,  An)  тогда  и  только  тогда,  когда  результаты операций UN P A C K rl ON (Al,    A2,     …,     An) И UNPACK  r2    ON    (Al, A2,,, .,.,    An) равны.     :t.t Й

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии