Введение в системы БД (542480), страница 183
Текст из файла (страница 183)
Возможность присутствия неопределенных значений (ИОЬЬ) во внешних ключах требует введения нового типа ссылочного действия, ЯЕТ ИОЬЬ, которое можно будет указывать в правилах ОЕЬЕТЕ и ОРОАТЕ при определении внешних ключей. ЧАЕ ЯР ВАЯЕ ЕЕ1АТ1ОИ ( ... ) ГОИЕ1ОИ КЕУ ( 8$ ) ИЕГЕЕЕКОЕЯ Я ОИ ОЕЬЕТЕ ЯЕТ ИОЬЬ ОИ ОРОАТЕ ЯЕТ ИОЬЬ При использовании этих спецификаций операция ОЕЬЕТЕ в переменной-отношении поставщиков приведет к помещению неопределенных значений (ИОЬЬ) в атрибут внешнего ключа всех кортежей с данными о соответствующих поставках, и только после этого сведения об указанных поставщиках будут удалены.
Аналогично операция ОРОАТЕ для атрибута Я() в переменной-отношении поставщиков вызовет помешение неопределенных значений (ИОЬЬ) в атрибут внешнего ключа всех кортежей с данными о соответствуюших поставках, и только после этого сведения об указанных поставшиках будут обновлены. Замечание. Спецификация ЯЕТ ИОЬЬ может быть указана только для тех внешних ключей, в которых допускается наличие неопределенных значений (ИОЬЬ). 3. Наконец, следует отметить, что "необходимости" разрешить присутствие неопределенных значений (ИОЬЬ) во внешних ключах вполне можно избежать за счет соответствуюшего проектирования базы данных 118.20]. Еше раз обратимся к примеру с отделами и сотрудниками. Возможна ситуация, когда некоторые сотрудники действительно не относятся ни к одному из отделов.
Но тогда, как уже предполагалось в конце предыдушего раздела, логичнее было бы не включать атрибут номера отдела ОЕРТ() в переменную-отношение ЕМР, а создать отдельную переменную- отношение ЕО с атрибутами ЕИР) и ОЕРТ8, предназначенную для представления того факта, что указанный сотрудник работает в данном отделе. Если некоторый сотрудник не о~носится ни к одному отделу, ситуацию легко можно представить, исключив кортеж для этого сотрудника из переменной-отношения ЕО.
18.5. Внешнее соединение В этом разделе делается некоторое отступление от основной темы главы с целью обсуждения часто используемой операции внешнего соединения 118.3], 1! 8.4], (18.7], 118.14], [18.15]. Внешнее соединение — это расширенная форма обычного или внутреннего соеди- 707 Глава 18. Отсутствующая информация пения. Внешнее соединение отличается от внутреннего тем, что кортежи одного из отношений, не имеющие соответствия среди кортежей другого отношения, появляются в результирующем о~ношении с неопределенными значениями (МОЕТЕ) во всех позициях атрибутов второго отношения, вместо того чтобы быть просто проигнорированными, как в обычном соединении. Этот оператор не является примитивным. Например, для построения внешнего естественного соединения по номеру поставщика переменных-отношений поставщиков и поставок можно использовать приведенное ниже выражение (в демонстрационных целях предположим, что МЖЬ является корректным скалярным выражением).
( Я 001М ЯР ) 0М10М ( ЕХТЕМ0 ( ( Я ( Б)) ) М1МЯЯ БР ( Я)) ) ) Б01М Я ) й00 МОИ ХБ Р(), МОБ1 ХБ 0ТХ ) Результат будет содержать кортежи и лля поставщиков, не выполнивших ни одной поставки. В этих кортежах будут содержаться неопределенные значения (БАБ) в позициях атрибутов Р)) и 0ТУ. Исследуем этот пример более подробно. Взгляните на рис. 18.3. На нем вверху показаны значения данных в исходных переменных-отношениях, ниже — результат нх внутреннего естественного соединения, а еше ниже — результат их внешнего естественного соединения.
Как следует из рисунка, внутреннее соединение, попросту говоря, утрачивает информацию о поставщиках, не выполнивших ни одной поставки (в данном примере это поставщик с номером 'Б5'), в то время как внешнее соединение сохраняет ее. Действительно, имеющееся различие и является причиной использования внешнего соединения. ЯР еннее) соединение: Информация для поставщика с номером '85' "теряется" Внешнее соединение: Информация для поставщика с номером '35' "сохраняется" Рис. !8.3, Внутреннее и внеизнее соединения (пример) Таким образом, внешнее соединение предназначено для решения весьма важной проблемы, заключающейся в потере информации при внутреннем соединении.
Некоторые авторы высказывают мнение, что система должна обеспечивать прямую и явную поддержку внешних соединений, вместо того чтобы требовать от пользователя при построении запроса прибегать к различным ухищрениям для достижения желаемого результата. 708 Часть Р. Дополнительные аспекты В частности, Кодд рассматривает внешнее соединение как неотъемлемую часть реляционной модели [5.2].
Тем не менее в этой книге мы не будем высказываться за явную поддержку внешних соединений по приведенным ниже причинам. ° Прежде всего, конечно, операция внешнего соединения использует неопределенные значения (НЯТЬ), а автор настоящей книги всегда выступает против этого по целому ряду описанных ранее причин. ° Кроме того, обратите внимание, что существует несколько разновидностей операции внешнего соединения — левое, правое и полное внешнее О-соединение, а также левое, правое и полное внешнее естественное соединение.
(Левое соединение сохраняет в результирующем отношении информацию из левого операнда, правое — из правого операнда, а полное — с обеих сторон.) На рис. 18.3 показан пример левого соединения, точнее, левого внешнего естественного соединения. Более того, обратите внимание, что не существует достаточно простого способа порождения внешнего естес~венного соединения из внешнего Я-соединения [18.7]. В результате не ясно, какой именно оператор внешнего соединения должна явно поддерживать система.
° Далее, вопрос о внешнем соединении ни в коем случае нельзя считать столь же тривиачьным, как тот простой пример, который приведен на рис. 18.3. На практике, как показано в [18.7], операции внешнего соединения присущ ряд "неприятных свойств", которые в своей совокупности не позволяю~ эффективно реачизовать ее поддержку в существующих языках, в частности в языке Я(3) . Предпринятые в некоторых коммерческих СУБД попытки решить эту проблему оказались неудачными, т.е. в них так и не удалось справиться с "неприятными свойствами" (см.
[18.7], где данный вопрос описан подробнее). ° И наконец, уже было высказано мнение о том, что атрибуты, значениями которых могут былин отношения, представляют собой альтернативный подход, позволяющий радикально устранить все эти проблемы (глава 19). Такой подход исключает необходимость использования неопределенных значений (Нцьь) и операций внешнего соединения и в действительности, по мнению автора, является более элегантным решением.
Например, для показанных на рис. 18.3 данных приведенное ниже выражение позволяет получить результат, представленный на рис. 18.4. 81ТН ( Я ЕЕНАНЕ Я() АЯ Х ) АЯ У ех7880 х А00 ( яР инеее я() = х ) Ая Рб Рис. (В.4. Сохранение информации а поставщике с номером 'Я5' (балее эффективный способ) 709 Глава 18. Отсутствующая информация В частности, пустое множество деталей, поставляемых поставщиком с номером '85', на рис. 18.4 представлено именно в виде пустого множества, а не в виде каких-то неопределенных значений (ИИЬЬ), как это было в случае, показанном на рис. 18.3. Представление пустого множества в виде пустого множества, похоже, является удачной идеей. Действительно, при должной поддержке атрибутов, значениями которых могут быть отношения, операция внешнего соединения может оказаться совершенно излишней.
При более внимательном изучении этого вопроса можно заметить, что имеет место проблема интерпретации неопределенных значений (ИИЬЬ), которые появляются в результирующем отношении операции внешнего соединения. Например, что представляют собой неопределенные значения, показанные на рис.!8.3? Несомненно, они не означают "значение неизвестно" или "значение неприменимо".
На самом деле единственная логически обоснованная интерпретация их смысла следующая: "Значение является пустым множеством". Более подробно эта проблема обсуждается в [18.7]. В заключение раздела заметим, что существует возможность определить "внешние" версии других операторов реляционной алгебры, в частности операторов объединения, пересечения и вычитания [13.6]. И вновь Кодл рассматривает по крайней мере один из таких операторов, а именно — внешнее объединение, как неотъемлемую часть его реляционной модели [5.2].
Подобные версии операторов позволяют выполнять объединение двух отношений и другие операции, даже если данные отношения несовместимы по типу. Основной принцип работы таких операторов состоит в расширении каждого из операндов за счет добавления атрибутов, свойственных другому операнду, с помещением неопределенных значений (ИУЬЬ) в каждый такой атрибут каждого кортежа (после чего операнды становятся совместимыми по типу). Затем выполняется обычное объединение, пересечение или вычитаниев.
Тем не менее мы не будем подробно обсуждать эти операции по следующим причинам. ° Внешнее пересечение гарантированно возвращает пустое отношение, за исключением специального случая, когда исходные отношения совместимы по типу. Однако в такой ситуации внешнее пересечение вырождается до обычного пересечения. ° Внешнее вычитание гарантированно возвращает первый операнд, за исключением специального случая, когда исходные отношения совместимы по типу.