Главная » SQL, Базы данных » ВНЕШНЕЕ СОЕДИНЕНИЕ (ОТСТУПЛЕНИЕ ОТ ОСНОВНОЙ ТЕМЫ)

0

В этом разделе делается некоторое отступление от основной темы главы в целях обсуждения часто используемой операции внешнего соединения [19.3], [19.4], [19.7], [19.14], [19.15].  Внешнее  соединение—  это  расширенная  форма  обычного  или  внутреннего соединения. Внешнее соединение отличается от внутреннего тем, что кортежи одного из

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

( S JOIN SP ) UNION

( EXTEND ( ( S { S# } MINUS SP { S# } )

JOIN S ) j ADD { NULL AS P#, NULL AS QTY )

)

Результат будет содержать кортежи и для поставщиков, не выполнивших ни  одной поставки. В этих кортежах будут содержаться неопределенные значения (NULL) в позициях атрибутов P# и QTY.

Исследуем данный пример более подробно. Рассмотрим рис. 19.3. На нем вверху показаны значения данных в исходных переменных отношения S и SP, в  средней части показан результат обычного внутреннего соединения, а в нижней части — результат соответствующего внешнего соединения. Как следует из  этого рисунка, во внутреннем соединении (выражаясь очень неформально!) "теряется информация" о поставщиках, не выполнивших ни одной поставки деталей (в данном примере это поставщик с номером S5), в то время как внешнее соединение "сохраняет" ее. Действительно, имеющееся различие и является причиной использования внешнего соединения.

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

■     Прежде всего, безусловно, операция внешнего соединения использует неопреде ленные значения (NULL), а автор настоящей книги всегда выступает против этого по целому ряду описанных ранее основательных причин.

■     Кроме того, обратите внимание на то, что существует несколько разновидностей операции внешнего соединения — левое, правое и полное внешнее в-соединение, а также левое, правое и полное внешнее естественное соединение. (Левое соедине ние сохраняет в результирующем отношении информацию из левого операнда, правое — из правого операнда, а полное — из обоих операндов.) На рис. 19.3 пока зан пример левого соединения, точнее, левого внешнего естественного соедине ния. Более того, обратите внимание на то, что не существует достаточно простого способа формирования внешнего естественного соединения на основе внешнего в-соединения [19.7]. В результате не ясно, какой именно оператор внешнего со единения должна явно поддерживать система.

■   Далее, вопрос о внешнем соединении ни в коем случае нельзя считать  столь же тривиальным, как можно полагать на основании простого примера, который приведен на рис. 19.3. На практике, как показано в [19.7], операции внешнего соединения присущ ряд "неприятных свойств",  которые в своей совокупности не позволяют эффективно реализовать ее поддержку в существующих языках, в частности в языке SQL. Предпринятые в некоторых коммерческих СУБД попытки решить эту проблему оказались  неудачными, т.е. в них так и не удалось справиться с "неприятными свойствами" (см. [19.7], где данный вопрос описан подробнее).

Рис. 19.3. Сравнение внутреннего и внешнего соединений (пример)

■  Наконец, уже было высказано мнение о том, что атрибуты со значениями в виде отношений представляют собой альтернативный подход, позволяющий радикально устранить все эти проблемы. Такой подход исключает необходимость использования неопределенных значений (NULL) И  операций внешнего соединения и в целом, по мнению автора, представляет собой более изящное решение (не говоря уже о том, что это — реляционное решение, которое не приводит к нарушению реляционной модели). Например, для показанных на рис. 19.3 данных приведенное ниже выражение позволяет получить результат, представленный на рис. 19.4.

WITH ( S RENAME S# AS X ) AS Y :

( EXTEND Y ADD ( SP WHERE S# = X ) AS PQ ) RENAME X AS S#

В частности, пустое множество деталей, поставляемых поставщиком с номером S5, на рис. 19.4 представлено именно в виде пустого множества, а не в виде каких-то странных неопределенных значений (NULL), как это было в случае, показанном на рис. 19.3. Представление пустого множества в виде  пустого множества, похоже, является удачной идеей. Действительно, при должной поддержке атрибутов, значениями которых могут быть  отношения, операция внешнего соединения может оказаться совершенно излишней.

При более внимательном изучении этого вопроса можно заметить, что имеет место проблема интерпретации неопределенных значений (NULL), которые появляются в результирующем отношении операции внешнего  соединения.  Например, что представляют собой неопределенные значения,  показанные на рис. 19.3? Несомненно, они не означают, что "значение не известно" или "значение не применимо". На самом деле, единственная  логически обоснованная интерпретация их смысла состоит в следующем:  "Значением является пустое множество". Более подробно эта проблема также обсуждается в [19.7].

Рис. 19.4. Сохранение информации о поставщике с номером S5 (лучший способ)

В заключение раздела отметим, что существует возможность определить "внешние" версии других операторов реляционной алгебры, в частности операторов объединения, пересечения и разности [14.7]. Например, в [6.2] по меньшей мере один из них {внешнее объединение) рассматривается как  неотъемлемая часть реляционной модели. Подобные версии операторов позволяют выполнять объединение двух отношений и другие операции, даже если данные отношения не совместимы по типу. Основной принцип работы таких операторов  состоит в расширении каждого из операндов за счет добавления атрибутов, свойственных другому операнду, с помещением неопределенных значений (NULL) в каждый такой атрибут каждого кортежа (после чего операнды становятся совместимыми по типу). Затем выполняется обычная операция объединения, пересечения или разности8. Тем не менее, мы не будем подробно обсуждать эти операции по приведенным ниже причинам.

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

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

Основными проблемами, характерными для операции внешнего объединения, яв ляются проблемы интерпретации; причем они даже сложнее проблем интерпрета ции., имеющих место в случае операции внешнего соединения.. (См..[1.9.2, для. более детального изучения.)

8 Данное объяснение относится к исходным определениям этих операций в [14.6]; в работе [6.2] эти определения немного изменились.

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

По теме:

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