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

6.5.6. Получить имена поставщиков, которые не поставляют деталь с номером 'р2'

( ( S { Si } MINUS ( SP WHERE Pi = Pi ( 'P2' ) ) { Si } )

JOIN S ) { SNAME }

В результате получаем единственный атрибут SNAME.

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

WITH S { St } AS Tl,

SP WHERE P# = Pi ( 'P2' ) AS T2,

T2 { St } AS T3,

Tl MINOS T3 AS T4,

T4 JOIN S AS T5,

T5 { SNAME } AS T6 :

T6

Отношение Тб содержит требуемый результат.

Пояснение. Предполагается, что имена, которые вводятся с помощью предложения WITH, т.е. имена вида Ti, в этом примере локальны по отношению к содержащему их вы- ражению. Затем, если система поддерживает возможность отсрочки вычислений (как, например, это делает система PRTV [6.9]), разбиение запроса на последовательность не- больших шагов предложенным способом абсолютно не будет связано с какими-либо не- желательными издержками в плане производительности. В действительности весь запрос можно будет выполнить следующим образом.

  • Выражения, предшествующие двоеточию, не требуют немедленного вычисления; система просто должна помнить о них вместе со всеми именами, введенными с помощью соответствующих операторов AS.

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

  • Для того чтобы вычислить значение Тб, которое является проекцией отношения Т5 по атрибуту SNAME, система должна сначала вычислить значение отношения Т5. Но чтобы вычислить значение отношения Т5, которое является соединением от- ношений Т4 и S, система должна предварительно вычислить значение отношения Т4 и т.д. Иными словами, система должна эффективно вычислять исходные вло- женные выражения точно так, как пользователь, в первую очередь, должен эффек- тивно писать такие вложенные запросы.

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

6.6. Зачем нужна реляционная алгебра

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

тов RENAME. (За исключением RENAME, эти операторы составляют набор, впервые опреде- ленный Коддом в [6.1].) Для этих операций также был представлен конкретный синтак- сис, который и использовался в нескольких приведенных выше примерах.

Как уже отмечалось, восемь операторов Кодда не представляют минимального набора операторов (они задумывались не с этой целью), так как не все из них примитивны и часть из них можно определить в терминах других операторов. В действительности три операции из этого набора, а именно — соединение, пересечение и деление, можно опре- делить через остальные пять (упр. 6.2). Пять данных операций (выборка, проекция, про- изведение, объединение и вычитание)4 можно рассматривать как примитивные в том смысле, что ни одна из них не выражается через другие. Поэтому минимальный набор (безусловно, необязательно единственно возможный) будет состоять из этих пяти при- митивных операций. Однако на практике остальные три операции (в особенности опера- ция соединения) используются настолько часто, что имеет смысл обеспечить их непо- средственную поддержку, несмотря на то что они не являются примитивными.

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

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

  • Определение области обновления, т.е. данных, которые должны быть вставлены, изменены или удалены в результате выполнения операции обновления (глава 5).

  • Определение правил поддержки целостности данных, т.е. некоторых особых требований, которым должна удовлетворять база данных (глава 8).

  • Определение производных переменных-отношений, т.е. тех данных, которые должны быть включены в представления или "моментальные снимки" состояния базы данных (глава 9).

  • Определение требований устойчивости, т.е. данных, которые должны быть включены в контролируемую область для некоторых операций управления парал- лельным доступом к информации (глава 15).

  • Определение ограничений защиты, т.е. данных, для которых осуществляется тот или иной тип контроля доступа (глава 16).

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

символическими высокоуровневыми правилами преобразования. Например, рассмот- рим следующее выражение ("Получить имена поставщиков детали с номером 'Р2'"; пример 6.5.1).

( ( SP JOIN S ) WHERE Р# = Pi ( 'Р2' ) ) { SNAME }

Его можно преобразовать в логически эквивалентное, но, вероятно, более рациональ- ное выражение следующего вида.

( ( SP WHERE Pi = Pi ( 'Р2' ) ) JOIN S ) { SNAME }

(Упражнение. В каком смысле последнее выражение можно считать более рацио- нальным? Почему только "вероятно"?)

Таким образом, реляционная алгебра может служить хорошим основанием для вы- полнения оптимизации (чтобы вспомнить, что такое оптимизация, обратитесь к разде- лу 3.5 главы 3). Следовательно, если пользователь выразил свой запрос с помощью пер- вого из двух приведенных выше выражений, то перед выполнением оптимизатор должен преобразовать его во второе выражение (в идеальном случае производительность не должна зависеть от формы, в которой пользователь выражает свой запрос). К этой теме мы еще вернемся в главе 17.

В заключение отметим, что благодаря своей фундаментальной природе реляционная алгебра часто используется в качестве критерия возможностей выражения пользова- тельских намерений для некоторого определенного реляционного языка (например, та- кого, как язык SQL). В общем случае язык называют реляционно полным [6.1], если его возможности, по крайней мере, соответствуют возможностям, обеспечиваемым ал- гебраическими операциями; иначе говоря, если выражения этого языка позволяют опре- делить каждое отношение, которое может быть определено с помощью алгебраических выражений (первоначальной алгебры, т.е. выражений, описанных в предыдущих разде- лах). Понятие реляционной полноты подробнее обсуждается в следующей главе.

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