Скачиваний:
82
Добавлен:
02.05.2014
Размер:
2.28 Mб
Скачать

18.5. Внешнее соединение

В этом разделе делается некоторое отступление от основной темы главы с целью обсу- ждения часто используемой операции внешнего соединения [18.3], [18.4], [18.7], [18.14], [18.15]. Внешнее соединение — это расширенная форма обычного или внутреннего соеди-

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

( S JOIN SP ) UNION

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

ADD NULL AS P#, NULL AS QTY )

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

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

S

s#

SNAME

STATUS

CITY

SP

S#

P#

QTY

S2

Jones

10

Paris

S2

PI

300

S5

Adams

30

Athens

S2

P2

400

Обычное

(внутреннее) соединение:

S#

SNAME

STATUS

CITY

P#

QTY

Информация

S2

Jones

10

Paris

PI

300

для поставщика с номером

S2

Jones

10

Paris

P2

400

'S5' "теряется"

Внешнее соединение:

S#

SNAME

STATUS

CITY

P#

QTY

Информация

S2

Jones

10

Paris

PI

300

для поставщика с номером

S2

Jones

10

Paris

P2

400

'S5' "сохраняется"

S5

Adams

30

Athens

UNK

UNK

Рис. 18.3. Внутреннее и внешнее соединения (пример)

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

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

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

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

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

  • И наконец, уже было высказано мнение о том, что атрибуты, значениями кото- рых могут быть отношения, представляют собой альтернативный подход, позво- ляющий радикально устранить все эти проблемы (глава 19). Такой подход исклю- чает необходимость использования неопределенных значений (NULL) и операций внешнего соединения и в действительности, по мнению автора, является более элегантным решением. Например, для показанных на рис. 18.3 данных приведен- ное ниже выражение позволяет получить результат, представленный на рис. 18.4. WITH ( S RENAME S# AS X ) AS У :

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

S#

SNAME

STATUS

CITY

PQ

S2

Jones

10

Paris

p#

QTY

PI

P2

300 400

S5

Adams

30

Athens

P#

QTY

Рис. 18.4. Сохранение информации о поставщике с номером 'S5' (более эффек- тивный способ)

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

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

В заключение раздела заметим, что существует возможность определить "внешние" версии других операторов реляционной алгебры, в частности операторов объединения, пересечения и вычитания [13.6]. И вновь Кодд рассматривает по крайней мере один из таких операторов, а именно — внешнее объединение, как неотъемлемую часть его реля- ционной модели [5.2]. Подобные версии операторов позволяют выполнять объединение двух отношений и другие операции, даже если данные отношения несовместимы по типу. Основной принцип работы таких операторов состоит в расширении каждого из операндов за счет добавления атрибутов, свойственных другому операнду, с помещени- ем неопределенных значений (NULL) в каждый такой атрибут каждого кортежа (после че- го операнды становятся совместимыми по типу). Затем выполняется обычное объедине- ние, пересечение или вычитание6. Тем не менее мы не будем подробно обсуждать эти операции по следующим причинам.

6 Данное объяснение относится к исходным определениям этих операций [13.6]. В работе [5.2] они в некоторой степени изменены, и читателю предлагается самостоятельно рассмот- реть эти подробности.


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

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

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

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]