Главная » SQL, Базы данных » ГРУППИРОВАНИЕ И РАЗГРУППИРОВАНИЕ

0

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

SP  GROUP   {   Р#,   QTY   }   AS   PQ

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

Примечание. Рекомендуем читателю следить по данному рисунку за приведенными ниже пояснениями, поскольку они являются довольно отвлеченными (автор выражает свои сожаления, но ничего не может сделать).

Начнем это описание с такого замечания, что первоначальное выражение

SP  GROUP   {   P#,   QTY   }   AS   PQ

можно читать как "группировать SP по s#", где s# — единственный атрибут SP, не упомянутый в спецификации GROUP. Результатом является отношение, которое определено следующим образом.

Во-первых, его заголовок выглядит так, как показано ниже.

{   S#   S#,    PQ  RELATION   {   P#   P#,   QTY  QTY   }    }

Иными словами, он состоит из атрибута PQ со значением в виде отношения (где значения PQ, в свою очередь, имеют атрибуты р# и QTY) наряду со всеми другими атрибутами SP (безусловно, выражение "все другие атрибуты SP" здесь означает просто атрибут s#). Во-вторых, его тело содержит точно по одному кортежу для каждого отдельного значения s# в отношении SP (и никаких других кортежей). Каждый кортеж в этом теле состоит из соответствующего значения s# (скажем, s) наряду со значением PQ (скажем, pq), которые получены, как описано ниже.

■     Каждый кортеж SP заменяется кортежем (скажем, х), в котором компоненты Р# и

QTY "свернуты" в один компонент со значением в виде кортежа (скажем,у).

■    Все  компоненты  у  всех  таких  кортежей  х,  в  которых  значение  S#  равно  s, "группируются" в одно отношение, рq, и тем самым образуется результирующий кортеж со значением s#, равным s, и значением PQ, равным pq.

Рис. 7.12. Группирование отношения SP по атрибуту S#

Тем самым итоговый результат действительно становится таким, как  показано на рис. 7.12. Следует особо подчеркнуть, что этот результат не включает ни одного кортежа для поставщика S5 (поскольку такие кортежи в настоящее время не включает и переменная отношения SP). Отметим, что результат выражения R GROUP { А1, А2, . . ., An } AS в имеет степень, равную nR п + 1, где nR —степень отношения R. Теперь перейдем к рассмотрению операции разгруппирования. Допустим, что SPQ — отношение, показанное на рис. 7.12. В таком случае следующее выражение (что вполне естественно) позволяет снова получить обычное отношение SP, применяемое в данной книге в качестве примера.

SPQ UNGROUP PQ

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

Во-первых, его заголовок выглядит так, как показано ниже.

{   S#   S#,   P#   P#,   QTY  QTY   }

Иными словами, заголовок состоит из атрибутов Р# и QTY (производных от атрибута

PQ), наряду со всеми другими атрибутами SPQ (т.е. в данном примере просто наряду

с атрибутом S#). Во-вторых, тело содержит точно по одному кортежу для каждого сочетания кортежа в SPQ и кортежа в значении PQ, которое входит в данный кортеж SPQ (и больше никаких других кортежей). Каждый кортеж в этом теле состоит из соответствующего значения S# (скажем, s), наряду со значениями Р# и QTY (скажем, р и q), которые получены, как описано ниже.

■     Каждый кортеж SPQ заменяется "разгруппированным" множеством кортежей, в котором имеется по одному кортежу (скажем, х) для каждого кортежа в значении PQ данного кортежа SPQ.

■     Каждый такой кортеж х содержит компонент S# (скажем, s), равный компоненту S# из рассматриваемого кортежа SPQ, и компонент со значением в виде кортежа (скажем, у), равный некоторому кортежу из компонента PQ, который входит в рассматриваемый кортеж SPQ.

■     Компоненты у каждого такого кортежа х, в котором значение S# равно s, "раз ворачиваются" в отдельные компоненты Р# и QTY (скажем, р и q), что приводит к получению результирующего кортежа со значением s#, равным s, значением Р#, равным р, и значением QTY, равным q.

Поэтому конечным результатом, как и было сказано, становится обычное отношение SP, рассматриваемое в данной книге в качестве примера.

Следует отметить, что результат операции R UNGROUP в (где отношения,  которые являются   значениями   атрибута   в   со   значением   в   виде   отношения,   имеют заголовок { Al,    A2,    . . . ,    An  }) приобретает степень, равную nR+n-1, где nR — степень R.

Вполне очевидно, что операции GROUP и UNGROUP при совместном использовании предоставляют возможности, которые принято называть  реляционными операциями "nest" (преобразовать обычную структуру во вложенную) и "unnest" (преобразовать вложенную структуру в обычную). Но автор предпочитает введенную здесь терминологию (группировать/разгруппировать),  поскольку  терминология  nest/unnest  вызывает  ассоциации с понятием отношений NF2 [6.10], а это понятие автор не поддерживает.

Для  полноты  описания  в   завершение  этого   раздела  приведены  некоторые   замечания, касающиеся обратимости операций GROUP и UNGROUP (хотя автор признает, что данные замечания при   первом  чтении  могут  оказаться  не  совсем  понятными).  Если   выполняется  операция группирования некоторого отношения r определенным образом, то всегда существует обратная операция разгруппирования, позволяющая снова получить прежнее отношение r. Но если какимто образом выполняется разгруппирование  некоторого отношения r,  то  обратная операция группирования,  позволяющая  снова   получить  отношение  r,  может  существовать  или  не существовать. Ниже приведен один пример (основанный на том примере, который можно найти в [6.4]). Предположим, что мы начинаем с отношения TWO (рис. 7.13) и разгруппировываем его для получения отношения THREE. Если же теперь будет выполнено группирование отношения THREE по атрибуту А (и результирующему атрибуту RVX со значением в виде отношения снова будет присвоено такое же имя), то будет получено отношение ONE, а не TWO.

Если после этого будет выполнено разгруппирование отношения ONE, МЫ вернемся к отношению THREE,  а  как  уже  было  показано,  отношение  THREE  может  быть  сгруппировано  для  получения отношения ONE; таким образом, операции группирования и разгруппирования

действительно являются обратными друг другу для данной конкретной пары отношений. Следует отметить, что в отношении ONE атрибут RVX является функционально зависимым от атрибута А (это действительно так, поскольку отношение ONE имеет кардинальность один)8. Вообще говоря, фактически можно утверждать, что если отношение r имеет атрибут RVX со значением в виде  отношения, то разгруппирование r применительно к RVX является обратимым, если и только если одновременно удовлетворяются следующие два условия:

▪    ни один из кортежей r не имеет в качестве значения RVX пустое отношение;

атрибут RVX является функционально зависимым от комбинации всех других атрибутов r.

Рис. 7.13. Пример, который показывает, что операции разгруппирования и

(повторного) группирования не всегда являются обратимыми

7.10.  РЕЗЮМЕ

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

Оригинальная алгебра состояла из восьми операций — традиционных  операций с множествами, таких как объединение, пересечение, разность и произведение (все они были немного модифицированы с учетом того, что их операндами являются именно отношения, а не произвольные множества), а также специальных реляционных операций сокращения, проекции, соединения и деления. (Но в случае деления было отмечено, что запросы, требующие применения этой операции, могут быть всегда сформулированы в терминах реляционных  операций сравнения, и многие находят, что такие формулировки интуитивно проще для понимания.) К этому первоначальному набору операций были добавлены операции RENAME (как уже было сказано), SEMI JOIN, SEMIMINUS, EXTEND  И

8  Рекомендуем читателю обратиться к главе 11 и, в частности, отметим, что в этой  формулировке речь идет о той форме функциональной зависимости, которая касается  значений отношений (а не о более обычной форме, которая касается переменных отношения).

SUMMARIZE, а также была упомянута операция TCLOSE и описаны операции  GROUP и UNGROUP. В частности, следует отметить чрезвычайную важность описанной в этой главе операции EXTEND (В определенном смысле она является такой же важной, как и соединение).

Затем было отмечено, что не все рассматриваемые алгебраические операции являются

примитивными (т.е. многие из них могут быть определены в терминах других); по мнению автора, такая ситуация является исключительно благоприятной. По этому поводу в [7.3]

сказано: "Процесс определения языка должен начинаться с немногих  тщательно  выбранных примитивных операций … Последующее его развитие должно по мере возможности осуществляться путем определения новых  операций в  терминах … операций, определенных ранее"; иными словами,  развитие языка происходит по пути определения полезных сокращенных форм. Если рассматриваемые сокращенные формы выбраны успешно, они не только позволяют значительно уменьшить объем работы по программированию, но и дают возможность перейти фактически на более высокий уровень абстракции, поскольку служат в качестве своего рода "наборов" концепций, которые естественным образом сочетаются друг с другом. (Кроме того, подобные сокращенные формы открывают путь к более эффективной реализации.) В этой связи следует отметить, что (как отмечено в разделе 7.6) в [3.3] описана своего  рода алгебра "с сокращенным набором

команд", называемая алгеброй А,  которая специально предназначена для  поддержки процесса систематического определения все более мощных операций в  терминах очень небольшого набора примитивов; фактически в этой работе показано, что все функциональные возможности описанной в этой главе  оригинальной алгебры, наряду с операциями RENAME, EXTEND, SUMMARIZE, GROUP, И UNGROUP, МОГуТ быть ДОСТИГНУТЫ С ПОМОЩЬЮ всего лишь двух примитивов, называемых remove и nor.

Вернемся к нашему резюме. Далее в настоящей главе было показано, как можно объединять алгебраические операции в выражения, которые служат для многих целей, в том числе для выборки, обновления и некоторых других. Кроме того, очень кратко была описана идея преобразования таких выражений в целях оптимизации (но эта идея рассматривается гораздо более подробно в главе 18).

Кроме того, было показано, что использование конструкции WITH позволяет  упростить процесс составления сложных выражений; эта конструкция, по сути, дает возможность вводить имена для подвыражений и тем самым формулировать сложные  выражения поэтапно, не нарушая при этом фундаментального свойства  непроцедурности рассматриваемой здесь алгебры.

В настоящей главе было также указано, что некоторые операции являются ассоциативными и коммутативными, и приведены некоторые формулы эквивалентности (например, было показано, что любое отношение R эквивалентно некоторому сокращению R и некоторой проекции R). Кроме того, был рассмотрен вопрос о том, что означает выполнение операций соединения, объединения и пересечения только на одном отношении и вообще ни на одном отношении.

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

По теме:

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