В. В. Воронин информационное обеспечение систем управления

Вид материалаДокументы

Содержание


Операция соединения
Операция пересечения.
А devidby В = A[X] minus ((A[X] times B) minus A) [X].
Операция проекции
Операции объединения и вычитания.
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   14
ПОСТАВКИ[ №П, №Д ], содержащую номера поставщиков и номера поставляемых ими деталей:

П

Д

П1

Д1

П1

Д2

П1

Д3

П2

Д1

П2

Д2

П3

Д2

В качестве делителя возьмем проекцию Y=ДЕТАЛИ[№Д], содержащую список номеров всех деталей:

Д

Д1

Д2

Д3

Деление отношения X на Y дает список номеров поставщиков, поставляющих все детали:

П

П1

Оказалось, что только поставщик с номером П1 поставляет все детали.

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

Таблица 3.1

Операция

Синтаксис

1. Переименование атрибутов

R rename At1, At2, … as NewAt1, NewAt1, …

2. Объединение

A union B

3. Пересечение

A intersect B

4. Вычитание

A minus B

5. Декартово произведение

A times B

6. Фильтрация

A where c (XQY)

7. Проекция

A[X,Y, …,Z]

8. Cоединение

(A times B) where c (XQY)

9. Естественное соединение

A join B

10. Деление

A devidby B

Приведем примеры использования реляционных операций.

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

((ПОСТАВКИ join ПОСТАВЩИКИ) where №Д=Д2)[ФИО].

Пример 2. Получить имена всех поставщиков, реализовавших поставку хотя бы одной гайки.

(((ДЕТАЛИ where Наимен="Гайка") join ПОСТАВКИ) join ПОСТАВЩИКИ) [ФИО]

Ответ на этот запрос можно получить и иначе:

(((ДЕТАЛИ join ПОСТАВКИ) join ПОСТАВЩИКИ) where Наимен="Гайка") [ФИО]

Пример 3. Получить имена поставщиков, поставляющих все детали.

((ПОСТАВКИ[№П, №Д] devidby ДЕТАЛИ[№Д]) join ПОСТАВЩИКИ)[ФИО].

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

((ПОСТАВЩИКИ[№П] minus ((ПОСТАВЩИКИ join ПОСТАВКИ)
where №Д=2) [№П]) join ПОСТАВЩИКИ) [ФИО].


Ответ на данный запрос можно также получить по шагам.
  1. Х1=ПОСТАВЩИКИ[№П]   получить список номеров всех поставщиков.
  2. X2=ПОСТАВЩИКИ join ПОСТАВКИ   соединить данные о поставщиках и поставках.
  3. X3=X2 where №Д=Д2   в данных о поставщиках и поставках оставить только данные о поставках детали Д2.
  4. Х43[№П]   получить список номеров поставщиков, поставляющих деталь Д2.
  5. X5=X1minus X4   получить список номеров поставщиков, не поставляющих деталь Д2.
  6. X6=X5 join ПОСТАВЩИКИ   соединить список номеров поставщиков, не поставляющих деталь Д2 с данными о поставщиках (получатся полные данные о поставщиках, не поставляющих Д2).
  7. X7=X6[ФИО]   искомый ответ.

Как было сказано в начале данного подраздела, не все операции реляционной алгебры являются независимыми – часть из них выражаются через другие. Прокомментируем данное утверждение.

Операция соединения. Она определяется через операции декартового произведения и выборки. Для операции естественного соединения добавляется операция проекции.

Операция пересечения. Она выражается через вычитание как
А intersect В = А minusminus В).

Операция деления. Она выражается через операцию вычитания, декартового произведения и проекции как
А devidby В = A[X] minus ((A[X] times B) minus A) [X].

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

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

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

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

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

Операции объединения и вычитания. Доказательства их примитивности более сложны и мы их здесь не приводим.

Несмотря на мощь языка реляционной алгебры, имеется ряд типов запросов, которые принципиально нельзя выразить только при помощи операторов реляционной алгебры. Это вовсе не означает, что ответы на эти запросы нельзя получить вообще. Просто, для получения ответов на подобные запросы приходится применять базовые языки СУБД. Приведем три примера.

Пример 1. Пусть имеется отношение, в котором хранятся данные о заработной плате сотрудников по месяцам года. Рассмотрим запрос "Найти все месяцы, в которых заработная плата какого-либо сотрудника превышает заданный уровень (скажем, 10000 руб.)".

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

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

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

Пример 2. Невыразимость транзитивного замыкания реляционными операторами. Рассмотрим отношение, описывающее сотрудников некоего предприятия. Отношение содержит данные о табельном номере сотрудника, фамилии, должности и табельном номере руководителя сотрудника.

Т_НОМ

ФИО

ДОЛЖНОСТЬ

Т_НОМ_РУК

1

Иванов

Директор

1

2

Петров

Глав.бухгалтер

1

3

Сидоров

Бухгалтер

2

4

Васильев

Начальник цеха

1

5

Сухов

Мастер

4

6

Шарипов

Рабочий

5









Рассмотрим запрос "Перечислить всех руководителей (прямых и непрямых) данного сотрудника".

Ответом на запрос может быть получен при помощи понятия транзитивного замыкания. Однако транзитивное замыкание не может быть выражено операторами реляционной алгебры.

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

ТОВАР

МЕСЯЦ

КОЛИЧЕСТВО

Компьютеры

Январь

100

Принтеры

Январь

200

Сканеры

Январь

300

Компьютеры

Февраль

150

Принтеры

Февраль

250

Сканеры

Февраль

350







Требуется представить эти данные в виде таблицы, по строкам которой идут наименования товаров, по столбцам   месяцы, а в ячейках содержатся объемы продаж. Это и будет кросс-таблицей.

Товар

Январь

Февраль



Компьютеры

100

150



Принтеры

200

250



Сканеры

300

350