|
Программирование >> Хронологические базы данных
в действительности это определение можно оставить в неизменном виде, если соответствующим образом расширить определение термина несогласованные значения внешнего ключа . А именно, назовем несогласованным значением внешнего ключа такое его непустое (т.е. NONNULL) значение в ссылающейся переменной-отношении, для которого не существует согласованного значения потенциального ключа в соответствующей ссылочной переменной-отношении. Здесь следует отметить такие важные особенности. 1. Запрет или разрешение на присутствие неопределенных значений (NULL) в данном внешнем ключе должно задаваться в определении базы данных. (Конечно, в действительности это требование справедливо в отношении всех атрибутов в целом, независимо от того, являются ли они частью некоторого внешнего ключа.) 2. Возможность присутствия неопределенных значений (NULL) во внешних ключах требует введения нового типа ссылочного действия, SET NULL, которое можно будет указывать в правилах DELETE и UPDATE при определении внешних ключей. VAR SP BASE RELATION { ... } ... FOREIGN KEY { S# } REFERENCES S ON DELETE SET NULL ON UPDATE SET NULL ; При использовании этих спецификаций операция DELETE в переменной-отношении поставщиков приведет к помещению неопределенных значений (NULL) в атрибут внешнего ключа всех кортежей с данными о соответствующих поставках, и только после этого сведения об указанных поставщиках будут удалены. Аналогично операция UPDATE для атрибута S# в переменной-отношении поставщиков вызовет помещение неопределенных значений (NULL) в атрибут внешнего ключа всех кортежей с данными о соответствующих поставках, и только после этого сведения об указанных поставщиках будут обновлены. Замечание. Спецификация SET NULL может быть указана только для тех внешних ключей, в которых допускается наличие неопределенных значений (NULL). 3. Наконец, следует отметить, что необходимости разрешить присутствие неопределенных значений (NULL) во внешних ключах вполне можно избежать за счет соответствующего проектирования базы данных [18.20]. Еще раз обратимся к примеру с отделами и сотрудниками. Возможна ситуация, когда некоторые сотрудники действительно не относятся ни к одному из отделов. Но тогда, как уже предполагалось в конце предыдущего раздела, логичнее было бы не включать атрибут номера отдела DEPT# в переменную-отношение ЕМР, а создать отдельную переменную-отношение ED с атрибутами ЕМР# и DEPTt, предназначенную для представления того факта, что указанный сотрудник работает в данном отделе. Если некоторый сотрудник не относится ни к одному отделу, ситуацию легко можно представить, исключив кортеж для этого сотрудника из переменной-отношения ED. 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 ) ADD NULL AS P#, NULL AS QTY ) Результат будет содержать кортежи и для поставщиков, не выполнивших ни одной поставки. В этих кортежах будут содержаться неопределенные значения (NULL) в позициях атрибутов Р# и QTY. Исследуем этот пример более подробно. Взгляните на рис. 18.3. На нем вверху показаны значения данных в исходных переменных-отношениях, ниже - результат их внутреннего естественного соединения, а еше ниже - результат их внешнего естественного соединения. Как следует из рисунка, внутреннее соединение, попросту говоря, утрачивает информацию о поставщиках, не выполнивших ни одной поставки (в данном примере это поставщик с номером S5), в то время как внешнее соединение сохраняет ее. Действительно, имеющееся различие и является причиной использования внешнего соединения.
Обычное (внутреннее) соединение:
Рис. 18.3. Внутреннее и внешнее соединения (пример) Таким образом, внешнее соединение предназначено для решения весьма важной проблемы, заключающейся в потере информации при внутреннем соединении. Некоторые авторы высказывают мнение, что система должна обеспечивать прямую и явную поддержку внешних соединений, вместо того чтобы требовать от пользователя при построении запроса прибегать к различным ухищрениям для достижения желаемого результата. в частности, Кодд рассматривает внешнее соединение как неотъемлемую часть реляционной модели [5.2]. Тем не менее в этой книге мы не будем высказываться за явную поддержку внешних соединений по приведенным ниже причинам. Прежде всего, конечно, операция внешнего соединения использует неопределенные значения (NULL), а автор настояшей книги всегда выступает против этого по целому ряду описанных ранее причин. Кроме того, обратите внимание, что сушествует несколько разновидностей операции внешнего соединения - левое, правое и полное внешнее 0-соединение, а также левое, правое и полное внешнее естественное соединение. (Левое соединение сохраняет в результирующем отношении информацию из левого операнда, правое - из правого операнда, а полное- с обеих сторон.) На рис. 18.3 показан пример левого соединения, точнее, левого внешнего естественного соединения. Более того, обратите внимание, что не сушествует достаточно простого способа порождения внешнего естественного соединения из внешнего ©-соединения [18.7]. В результате не ясно, какой именно оператор внешнего соединения должна явно поддерживать система. Далее, вопрос о внешнем соединении ни в коем случае нельзя считать столь же тривиальным, как тот простой пример, который приведен на рис. 18.3. На практике, как показано в [18.7], операции внешнего соединения присущ ряд неприятных свойств , которые в своей совокупности не позволяют эффективно реализовать ее поддержку в существующих языках, в частности в языке SQL. Предпринятые в некоторых коммерческих СУБД попытки решить эту проблему оказались неудачными, т.е. в них так и не удалось справиться с неприятными свойствами (см. [18.7], где данный вопрос описан подробнее). И наконец, уже было высказано мнение о том, что атрибуты, значениями которых могут быть отношения, представляют собой альтернативный подход, позволяющий радикально устранить все эти проблемы (глава 19). Такой подход исключает необходимость использования неопределенных значений (NULL) и операций внешнего соединения и в действительности, по мнению автора, является более элегантным решением. Например, для показанных на рис. 18.3 данных приведенное ниже выражение позволяет получить результат, представленный на рис. 18.4. WITH ( S RENAME S# AS X ) AS Y : EXTEND Y ADD ( SP WHERE S# = X ) AS PQ SNAME Jones Adams STATUS CITY Paris Athens
Puc. 18.4. Сохранение информации о поставщике с номером S5 (более эффективный способ)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |