Программирование >>  Хронологические базы данных 

1 ... 68 69 70 [ 71 ] 72 73 74 ... 348


Т7 { SA, SB } AS T17,

/* T17 {SA,SB} : некоторая деталь поставляется как поставщиком SA, так и поставщиком SB */

( Т17 MINUS Т16 ) AS Т18,

/* TIB {SA,SB} : некоторая деталь поставляется как поставщиком SA, так и поставщиком SB, ни одна деталь, поставляемая SA, не поставляется поставщиком SB, и ни одна деталь, поставляемая SB, не поставляется поставщиком SA - таким образом, SA и SB поставляют в точности одни и те же детали */

( Т18 WHERE SA < SB ) AS T19 : /* завершающий шаг */

Во втором решении, которое является более прямолинейным, используются реляционные сравнения, рассмотренные в разделе 6.9.

WITH ( S RENAME S# AS SA ) { SA } AS RA , ( S RENAME S# AS SB ) { SB } AS RB : ( RA TIMES RB)

WHERE ( SP WHERE S# = SA ) { P# } =

{ SP WHERE S# = SB ) { P# } AND SA < SB

6.49. SPJ GROUP ( J#, QTY ) AS JQ

6.50. Обозначим через SPQ результат выполнения выражения, полученного в ответе к упр. 6.49. Тогда имеем следующее.

SPQ UNGROUP JQ



Глава 7

Реляционное исчисление

7.1. Введение

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

Сначала выполнить соединение отношения поставщиков S и отношения поставок SP по атрибуту SI.

Далее выбрать из результата этого соединения кортежи с номером детали Р2.

И наконец выполнить для результата этой выборки операцию проекции по атрибутам S# и CITY.

Этот же запрос в терминах реляционного исчисления формулируется приблизительно так.

Получить атрибуты Si и CITY для таких поставщиков, для которых в отношении SP существует запись о поставке с тем же значением атрибута Si и со значением атрибута Pi, равным Р2.

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

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



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

Реляционное исчисление основано на разделе математической логики, который называется исчислением предикатов. Идея использования исчисления предикатов в качестве основы языка баз данных впервые была высказана в статье Кунса (Kuhns) [7.6]. Понятие реляционного исчисления, т.е. специального применения исчисления предикатов в реляционных базах данных, впервые было предложено Коддом в [6.1], а в [7.1] Кодд представил язык, основанный непосредственно на реляционном исчислении и названный подъязык данных ALPHA . Сам язык ALPHA никогда не был реализован, однако язык QUEL [7.5], [7.10]-[7.12], который действительно был реализован и некоторое время серьезно конкурировал с языком SQL, очень походил на язык ALPHA, оказавший заметное влияние на построение языка QUEL.

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

RANGE OF SX IS S;

RETRIEVE ( SX.Si ) WHERE SX.CITY = London ;

Переменной кортежа здесь является переменная SX, которая изменяется на отнр-шении, представляющем собой текущее значение переменной-отношения S (оператор RANGE - оператор определения этой переменной). Оператор RETRIEVE означает следующее: Для каждого возможного значения переменной SX выбирать компонент Si этого значения тогда и только тогда, когда его компонент CITY имеет значение London .

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

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



1 ... 68 69 70 [ 71 ] 72 73 74 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика