- •Глава 13. Семантическое моделирование
- •Часть III Проектирование базы данных
- •Часть IV
- •14.1. Введение
- •14.2. Транзакции
- •14.3. Восстановление транзакции
- •14.4. Восстановление системы
- •14.5. Восстановление носителей
- •14.6. Двухфазная фиксация
- •14.7. Поддержка языка sql
- •14.8. Резюме
- •15.1. Введение
- •15.2. Три проблемы параллельности
- •15.3. Блокировка
- •15.4. Устранение трех проблем параллельности
- •15.5. Взаимная блокировка
- •15.6. Упорядочиваемость
- •15.7. Уровни изоляции
- •15.8. Блокировка намерения
- •15.9. Средства языка sql
- •15.10. Резюме
- •Часть V
- •16.1. Введение
- •16.2. Избирательная схема управления доступом
- •16.3. Мандатная схема управления доступом
- •16.4. Статистические базы данных
- •16.5. Шифрование данных
- •16.6. Средства языка sql
- •16.7. Резюме
- •17.1. Введение
- •17.2. Пример выполнения оптимизации
- •17.3. Оптимизация запросов
- •17.4. Преобразование выражений
- •17.5. Статистические показатели базы данных
- •17.6. Стратегия по принципу "разделяй и властвуй"
- •17.7. Реализация реляционных операторов
- •17.8. Резюме
- •18.1. Введение
- •18.2. Обзор концепции трехзначной логики
- •18.3. Некоторые следствия изложенной схемы
- •18.4. Отсутствующие значения и ключи
- •18.5. Внешнее соединение
- •18.6. Специальные значения
- •18.7. Поддержка неопределенных значений в языке sql
- •18.8. Резюме
- •Глава 19
- •19.1. Введение
- •19.2. Иерархия типов
- •19.3. Полиморфизм и заменимость
- •19.4. Переменные и операция присвоения
- •19.5. Специализация по ограничениям
- •19.6. Операции сравнения
- •19.7. Операторы, версии и сигнатуры
- •19.8. Является ли окружность эллипсом
- •19.9. Пересмотр специализации ограничением
- •19.10. Резюме
- •20.1. Введение
- •20.2. Предварительные сведения
- •20.3. Двенадцать основных целей
- •1. Локальная независимость
- •2. Отсутствие опоры на центральный узел
- •3. Непрерывное функционирование
- •4. Независимость от расположения
- •5. Независимость от фрагментации
- •6. Независимость от репликации
- •7. Обработка распределенных запросов
- •8. Управление распределенными транзакциями
- •9. Аппаратная независимость
- •10. Независимость от операционной системы
- •11. Независимость от сети
- •12. Независимость от типа субд
- •20.4. Проблемы распределенных систем
- •Транзакция т1х
- •20.5. Системы "клиент/сервер"
- •20.6. Независимость от субд
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] для бо- лее детального изучения.)