Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
101
Добавлен:
15.06.2014
Размер:
1.7 Mб
Скачать

3.6.2 Реляционное исчисление, основанное на кортежах

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

Описательную часть исчисления можно представить в виде:

RANGE OF <переменная> IS <список>,

где прописными буквами записаны ключевые слова языка, <переменная> - идентификатор переменной кортежа (области значений), а <список> — последовательность одного или более элементов, разделенных запятыми, т. е. конструкция вида: х1[, х2[...,xn ] ...].

Вся конструкция RANGE указывает идентификатор переменной и об­ласть ее допустимых значений. Список элементов х1[, х2[..,xn ]...] содержит элементы, каждый из которых является либо отношением, либо выражением над отношением (порядок записи выражений описывается далее). Все элементы списка должны быть совместимы по типу, т. е. соответствующиеэлементам отношения должны иметь идентичные заголовки. Область допустимых значений <переменной> образуется путем объединения значений всех элементов списка. Так, запись вида RANGE OF Т IS X1,X2 означает, что область определения переменной Т включает в себя все значения изотношения, которое является объединением отношений XI и Х2.

Пример 1. Варианты описаний.

RANGEOFSXISS;

RANGE OF SPX IS SP;

RANGE OF SY IS (SX) WHERE SХ.Город_П = 'Москва',

(SX) WHERE EXISTS SPX (SРХ.П# = SХ. П# AND SРХ.Д# = 'P1');

Переменные SX и SPX в первых двух примерах определены на отношениях S и SP соответственно (рис. 3.7). Третий пример иллюстрирует запись выражений при определении переменной кортежа. Переменная SY здесь может принимать значения из множества кортежей отношения Sдля поставщиков из Москвы или поставщиков, которые поставляют деталь Р1 (или для тех и других).

Синтаксис выражений исчисления рассматривается ниже. Запись выражения, формулирующего запрос на языке исчисления кортежей с помощьюформы Бэкуса-Наура, упрощенно можно представить следующим образом:

<выражение> ::= (y1[, у2[..., уn]...]) [WHEREwff]

у ::= {<перемениая> | <переменная>.<атрибут> } [ AS <атрибут> ]

wff ::= <условие> |

NOT wff |

<условие> ANDwff|

<условие> OR wff |

IF <условие> THEN wff |

EXISTS<переменная> (wff) |

FORALL<переменная> (wff) |

(wff)

Общий смысл записи выражения состоит в перечислении атрибутов результирующего (целевого) отношения, атрибуты которого должны удовлетворять условию истинности формулы wff(wellformulatedformula— правильно построенная формула). Список атрибутов целевого отношения, илицелевой список, в терминах реляционной алгебры по существу определяет операцию проекции, а формулаwff— селекцию кортежей.

В паре <переменная>.<атрибут> первая составляющая служит для ука­зания переменной кортежа (определенной конструкцией RANGE), а вторая — для определения атрибута отношения, на котором изменяется переменная кортежа. Необязательная часть "AS <атрибут>" используется для переименования целевого отношения. Если она отсутствует, то имя атрибу­та целевого отношения наследуется от соответствующего имени атрибута исходного отношения.

Употребление в качестве элемента целевого отношения просто имени переменной Т равносильно перечислению в списке всех соответствующих атрибутов, т. е. Т.А1 , Т.А2, ..., Т.Аn , где Аi, А2,..., Аn — атрибуты отношения, сопоставляемого с переменной Т.

Пример 2. Варианты записи пары <переменная>.<атрибут>.

sx.П#

SХ.П#ASГород_Поставщика

SX

SX.П#, SХ.Город_П AS Город_Поставщика, РХ.Д#, РХ.Город_Д# AS Город_Детали

В приведенном определении wff <условие> представляет собой либо формулуwff, заключенную в скобки, либо простое сравнение вида:

<операнд1> Θ <операнд2>,

где в качестве любого операнда выступает переменная или скалярная кон­станта, а символ Θ обозначает операцию сравнения =, ≠, >, ≥, <, ≤ и т. д.

Ключевые слова NOT, AND и OR обозначают логические операции соответственно: И, НЕ и ИЛИ. Ключевые словаIFиTHENпереводятся соответственно «если» и «то». И наконец, ключевые слова EXISTS и FORALL называются кванторами. Первый из них — квантор существования, а второй -квантор всеобщности. Рассмотрим эти кванторы несколько подробнее.

Формула wffвида:EXISTSx(f) означает; «Существует по крайнеймере одно такое значение переменной х, что вычисление формулы f дает значение истина». Выражение вида: FORALL x (f) интерпретируется как высказывание: «Для всех значений переменной х вычисление формулы f дает значение истина». В общем случае переменные кортежей в формулах могут быть свободными или связанными. В формулах EXISTS x (f) и FORALL x (f) переменные кортежей х всегда являются связанными.

Пример 3. Запись выражения.

Приведем запись выражения, соответствующего запросу: "Получить имена поставщиков, которые поставляют все детали".

SХ.Город_П WHERE FORALL PX (EXISTS SPX

(SРХ.П# = SХ.П# AND SРХ.Д# = SХ.Д#))

Равносильное этому выражение выглядит так:

SХ.Город_П WHERE NOT EXISTS PX (NOT EXISTS SPX

(SРХ.П# = SХ.П# AND SРХ.Д# = SХ.Д# ))

Описанное исчисление не обладает вычислительной полнотой, так как не позволяет выполнять вычисления, связанные с обработкой данных в базах. Добавление вычислительных функций в это исчисление можно реализовать путем расширения определения операндов сравнения и элементов целевого списка таким образом, чтобы они допускали использование скалярных выражений с литералами, ссылками на атрибуты и итоговыми функциями. В качестве итоговых могут выступать следующие функции:COUNT (количество), SUM (сумма), AVG (среднее), МАХ (максимальное), MIN (минимальное). Для целевых элементов целесообразно использовать спецификацию вида "AS <имя атрибута>", позволяющую явно задать имя результирующему атрибуту, если нет очевидного наследуемого имени.

Пример 4. Запись запроса.

Пусть требуется получить информацию о каждой поставке с полными данными о деталях и общем весе поставки. Запрос на дополненном функ­циями языке реляционного исчисления кортежей может выглядеть следу­ющим образом:

(SРХ.П#, SРХ.Количество, РХ, РХ.Вес * SРХ.Количество AS Общий_Вес) WHERE РХ.Д# = SРХ.Д#