Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Реляционная_алгебра.doc
Скачиваний:
2
Добавлен:
22.11.2019
Размер:
2.61 Mб
Скачать

6.2. Замкнутость

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

Другими словами, можно записывать вложенные выражения, т.е. выражения, в которых операнды сами представлены выражениями вместо простых имен отношений. В этой главе приводится много примеров таких вложенных выражений (фактически они будут встречаться на протяжении всей книги).

Замечание. Есть явная аналогия между возможностями использования вложенных реляционных выражений в реляционной алгебре и вложенных арифметических выражений в обычной арифметике. Действительно, тот факт, что отношения замкнуты, важен в алгебре по тем же причинам, по которым в обычной арифметике важно, что числа замкнуты. При обсуждении свойства замкнутости в главе 3 сознательно умалчивался один существенный момент. Как уже разъяснялось в главе 4, отношение имеет две части — заголовок и тело; нестрого говоря, заголовок — это множество атрибутов, а тело — это данные. Заголовок для базового отношения, очевидно, вполне конкретен и известен системе, поскольку он определяется как часть соответствующего оператора create base relation (см. главу 4). Ну а как же для производных отношений? Рассмотрим, например, выражение

S JOIN P,

которое представляет соединение отношения поставщиков и отношения деталей по соответствующим городам (значение атрибута CITY общее для двух отношений). Что будет заголовком для результата этого соединения? Обязательное наличие заголовка диктуется замкнутостью, а системе должно быть известно, что это такое (это в равной степени необходимо и пользователю, как мы скоро увидим).

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

(S JOIN P) WHERE WEIGHT > 18,

если бы не знали, что результат вычисления выражения s join p имеет атрибут WEIGHT. Другими словами, необходим такой набор правил наследования имен атрибутов, встроенный в алгебру, чтобы можно было предсказывать имена атрибутов на выходе произвольной реляционной операции, зная имена атрибутов на входе этой операции. Задав такие правила для всех операций, можно гарантировать, что для выражения любой сложности будет вычисляться результат, имеющий вполне определенный набор атрибутов.

Прежде чем двигаться дальше, отметим, что этот аспект алгебры, как правило, недооценивается в литературе, кроме двух заметных работ — Холла (Hall) и др. [6.9] и Дарвена (Darwen) [4.7]. Версия алгебры, представленная в этой главе, была выбрана в значительной мере под влиянием работы Дарвена. (В более ранних изданиях этой книги, обращаясь к проблеме наследования имен атрибутов, мы использовали подход, который был значительно хуже предложенного Дарвеном.)

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

S RENAME CITY AS SCITY

С помощью этого выражения (обратите внимание, что рассматриваемая запись является выражением, а не командой или оператором, а значит, может быть вложена в другие выражения) вычисляется отношение, имеющее то же самое тело, что и отно­шение S, но с именем атрибута SCITY вместо CITY:

S#

SNAME

STATUS

SCITY

S1

S2

S3

S4

S5

Smith

Jones

Black

Clark

Adams

20

10

30

20

30

London

Paris

Paris

London

Athens

Другие атрибуты этого отношения наследуют имена своих эквивалентов в отношении S без изменения. Само отношение безымянное. (Напоминаем читателю, что мы нача­ли использовать переменную RENAME в синтаксисе для определения внешних клю­чей. Если нужно освежить этот материал в памяти, обратитесь к главе 5.)

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