Введение в системы БД (542480), страница 59
Текст из файла (страница 59)
Принципиальное различие между ними следующее. Реляционная алгебра в явном виде предоставляет набор операций (соединение, объединение, проекция и т.д.), которые можно использовать, чтобы сообщить системе, как в базе данных из определенных отношений построить некоторое требуемое отношение, а реляционное исчисление просто представляет систему обозначений для определения требуемого отношения в терминах данных отношений. Например, рассмотрим запрос "Выбрать номера поставщиков и названия городов, в которых находятся поставщики детали с номером 'Р2'".
Алгебраическая версия этого запроса выглядит приблизительно так (мы умышленно не используем формальный синтаксис, приведенный в главе 6). ° Сначала выполнить соединение отношения поставщиков Б и отношения поставок БР по атрибуту Б$. ° Далее выбрать из результата этого соединения кортежи с номером детали 'Р2'. ° И наконец выполнить для результата этой выборки операцию проекции по атрибутам Б$ и С1ТУ. Этот же запрос в терминах реляционного исчисления формулируется приблизительно так.
° Получить атрибуты Б$ и С1ТУ для таких поставщиков, для которых в отношении БР существует запись о поставке с тем же значением атрибута Б$ и со значением атрибута РК равным 'Р2'. В этой формулировке пользователь лишь указывает определенные характеристики требуемого результата, оставляя системе решать, что именно н в какой последовательности соединять, проецировать и т.д., чтобы получить необходимый результат. Итак, можно сказать, что по крайней мере внешне формулировка запроса в терминах реляционного исчисления носит описательный характер, а в терминах реляционной алгебры — предписывающий.
В реляционном исчислении просто описывается, в чем заключается проблема, тогда как в реляционной алгебре задается процедура решения этой проблемы. Или, говоря очень неформально, алгебра имеет процелурный характер (пусть на высоком уровне, ио все же процедурный, поскольку задает необходимые для выполнения процедуры), а исчисление — непроцедурный. 243 Глана 7. Реляционнпе исчисление Подчеркнем, однако, что упомянутые отличия существуют только внешне. На самом леле реляционная алгебра и реляционное исчисление логически эквивалентны.
Каждому выражению в алгебре соответствует эквивалентное выражение в исчислении, и точно так каждому выражению в исчислении соответствует эквивалентное выражение в алгебре. Это означает, что между ними существует взаимно- однозначное соответствие, а различия связаны лишь с разными стилями выражения: исчисление ближе к естественному языку, а алгебра — к языку программирования. Но, повторим еще раз, эти различия только кажущиеся, а не реальные.
В частности, ни один из подходов нельзя назвать "более непроцедурным" по сравнению с другим. Подробнее вопрос эквивалентности этих двух подходов будет рассматриваться в разделе 7гй настоящей главы. Реляционное исчисление основано на разделе математической логики, который называется исчислением предикатов.
Идея использования исчисления предикатов в качестве основы языка баз данных впервые была высказана в статье Кунса (Кпппз) [7.6]. Понятие реляционного исчисления, т.е. специального применения исчисления предикатов в реляционных базах данных, впервые было предложено Коддом в [6.1], а в [7.1] Кодд представил язык, основанный непосредственно на реляционном исчислении и названный "подъязык данных АЬРНА". Сам язык АЬРНА никогда не был реализован, однако язык ООЕЬ [7.5], [7.10] — [7.12], который действительно был реализован и некоторое время серьезно конкурировал с языком ЯОЬ, очень походил на язык АЬРНА, оказавший заметное влияние на построение языка ОЫЕЬ. Основным средством реляционного исчисления является понятие переменной кортежа (также называемой переменной области значений).
Коротко говоря, переменная кортежа — это переменная, "изменяющаяся на" некотором заданном отношении, т.е. переменная, допустимыми значениями которой являются кортежи заданного отношения. Другими словами, если переменная кортежа Ч изменяется в пределах отношения г, то в любой заданный момент переменная Ч представляет некоторый кортеж с отношения г. Например, запрос "Получить номера поставщиков из числа тех, которые находятся в Лондоне" может быть выражен на языке фЗЕЬ так. ВЛАСЕ ОЕ ЯХ 1Б Я; ВЕТВ1ЕЧЕ ( ЯХ.Я)) ) ))НЕВЕ ЯХ.С1ТУ = "Еопдоп"1 Переменной кортежа здесь является переменная БХ, которая изменяется на отношении, представляющем собой текущее значение переменной-отношения Б (оператор ВВВБŠ— оператор определения этой переменной).
Оператор ВЕТВ1ЕЧЕ означает следующее: "Для каждого возможного значения переменной ЯХ выбирать компонент Б() этого значения тогда н только тогда, когда его компонент С1ТУ имеет значение 'Еопдоп'". В связи с тем, что реляционное исчисление основано на переменных кортежа, его первоначальную версию (для отличия от исчисления доменов, речь о котором пойдет ниже) называют также исчислением кортежей. Исчисление кортежей подробно описано в разделе 7.2. Замечание.
Для удобства примем следующее соглашение: далее в этой книге термины исчисление и реляционное исчисление, приведенные без уточнения "кортежей" или "доменов*', будут означать именно исчисление кортежей (там где это играет какую-то роль). 244 Часть 11. Реляционная модель В статье Лакруа (Еасго(х) и Пиротте (Р(гогге) [7.7] предлагается альтернативная версия исчисления, называемая исчислением доменов, в которой переменные кортежа изменяются иа доменах„т.е. являются переменными, изменяемыми иа доменах, а ие иа отношениях'.
В литературе предлагается множество языков исчисления доменов. Наиболее известный из иих — пожалуй, Опегу-Ву-Ехашр]е, или ОВЕ [7.14] (в действительности ои является смешанным, так как в языке ОВЕ присутствуют и элементы исчисления кортежей). Существует несколько коммерческих реализаций этого языка. В общих чертах исчисление доменов будет описано в разделе 7.6, а язык ОВЕ вкратце рассматривается в комментариях к [7.14]. Замечание. Пытаясь сделать эту главу короче, мы умышленно опускаем подробное описание некоторых вопросов, рассмотренных в главе 6, а именно: траизитивиое замыкание, группироваиие, разгруппирование и реляционные сравнения.
Мы также опускаем рассмотрение соответствующих версий реляционных операторов обновления. Все эти элементы можно перенести "иа почву" реляционного исчисления (в версии кортежей или доменов) вполне очевидным способом. Кратко эти вопросы обсуждаются в [3.3]. 7.2. Исчисление кортежей Как и при описании реляционной алгебры в главе 6, сначала введем для реляциоииого исчисления конкретный синтаксис, взяв за образец (хотя умышленно ие совсем точно) версию исчисления языка Тп1опа1 В, определенного в [3.3], а затем перейдем к обсуждению семантики.
В следующих ниже подразделах обсуждаются синтаксис и семантика. Синтаксис Замечание. Многие из приведенных здесь синтаксических правил ие будут понятны вам до тех пор, пока вы ие изучите семантический материал, следующий далее. Однако мы все же решили собрать все правила вместе для удобства ссылок. Начнем с повторения синтаксиса параметра <реляцлоллое выражение>, приведенного в главе 6. <реляцлоллое вирашелле> ЕЕЬАТ10й ( < сллсок вмрашелий картелей > ) ~ < лмл перемеллой-отлошелля > <реляцлоллал операция> ( <реляцволлое вмрашелве> ) Иными словами, синтаксис параметра <реляцлоллое вмрашелле> остается прежним, однако один из наиболее важных его подпараметров, <реллцлолная олерацлл>, теперь будет иметь совершенно иное определение.
<олределелле переменной кортежа> РАйбЕчлй <лмл переменной кортежа> ЕАЕСЕЯ ОУЕЕ <сллсох реллцлоллшх вврвшеляй> З Донный термин нелогичен: если исчисление доменов называется так по указанной причине, то исчисление кортежей следовало бы назвать исчислением отношений. 245 Глава 7. Реляционное исчисление Параметр <нмя леремеввой кортежа> может использоваться как <выражение кортежа>з, однако лишь в определенном контексте, а именно: ° перед точкой н последукнцим уточнением в параметре <ссылка на атрибут кортежа>; ° сразу после квантора в параметре <логическое выражение с квавтором>; ° как операнд в параметре <логвческое выражение>; ° как параметр <лрототип кортежа> нли как (операнд) подпараметр <выражение> в параметре <лрототил кортежа>.