Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление данными (пособие).pdf
Скачиваний:
280
Добавлен:
21.05.2015
Размер:
5.42 Mб
Скачать

60

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

Деление

Пусть два отношение R1 и R2 имеют заголовки, соответственно {X, Y} и {Y}, где X, Y атрибуты (возможно составные). Атрибут (группа атрибутов) Y – общие для обоих отношений. Отношение R1 имеет, кроме того, дополнительные атрибуты X, а отношение R2 не имеет никаких дополнительных атрибутов. Полагаем, что атрибуты с одинаковыми именами Y обоих отношений определены на одинаковых доменах.

Тогда операцией деления отношения R1 на отношение R2, обозначаемой R1 DIVIDE BY R2, где R1 – делимое, а R2 – делитель, называется отношение с заголовком {X} и телом, содержащим множество всех кортежей {<X:x>} таких, что существует набор кортежей {<X:x>, <Y:y>}, принадлежащий отношению R1, для всех кортежей {<Y:y>}, принадлежащих отношению R2.

Несколько менее строго это можно сформулировать так: результирующее отношение содержит такие значения атрибутов Х отношения R1, для которых соответствующие значения атрибута Y из R1 включают все значения атрибута Y из отношения R2.

Пример 1

Делимое

 

 

Делитель

Частное

 

 

 

1.

 

 

 

 

 

X

 

Y

Y

 

 

X

 

x1

 

y1

 

y1

 

 

x1

 

x1

 

y2

 

 

 

 

x2

 

x1

 

y3

 

 

 

 

 

 

x1

 

y4

 

 

 

 

 

 

x1

 

y5

2.

Y

 

 

X

 

x1

 

y6

 

y2

 

 

x1

 

x2

 

y1

 

y4

 

x4

 

x2

 

y2

 

 

 

 

 

 

x3

 

y2

 

 

 

 

 

 

x4

 

y2

3.

Y

 

 

X

 

x4

 

y4

 

y1

 

 

x1

 

x4

 

y5

 

y2

 

 

 

 

 

 

 

 

y3

 

 

 

 

 

 

 

y4

 

 

 

 

 

 

 

y5

 

 

 

 

 

 

 

y6

 

 

 

61

Пример 2

Пусть даны два отношения: ОТНОШЕНИЕ_1 и ОТНОШЕНИЕ_2.

ОТНОШЕНИЕ_1

 

ОТНОШЕНИЕ_2

РЕЗУЛЬТАТ

СТУДЕНТ

ДИСЦИПЛИНА

 

ДИСЦИПЛИНА

 

 

СТУДЕНТ

Иванов

Физика

 

Математика

 

Иванов

Иванов

Математика

 

История

 

Орлов

Иванов

Информатика

 

 

 

 

 

Иванов

История

 

 

 

 

 

Иванов

Химия

 

 

 

 

 

Иванов

Электроника

 

 

 

 

 

Петрова

Физика

 

 

 

 

 

Петрова

Математика

 

 

 

 

 

Сидоров

Математика

 

 

 

 

 

Орлов

Математика

 

 

 

 

 

Орлов

История

 

 

 

 

 

Орлов

Химия

 

 

 

 

 

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

62

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

Пусть имеются следующие отношения: СТУДЕНТЫ, ДИСЦИПЛИНЫ, УСПЕВАЕМОСТЬ, содержащие данные о студентах, учебных дисциплинах и оценках, полученных студентами по конкретным дисциплинам.

СТУДЕНТ

КОД_СТУД

ИМЯ

ГОРОД

С2

Иванов

Орел

С5

Петрова

Курск

С4

Сидоров

Москва

С7

Кузнецов

Брянск

С8

Зайцева

Липецк

С3

Павлов

Воронеж

С10

Котов

Орел

С15

Лукин

Воронеж

С23

Белкин

Воронеж

ДИСЦИПЛИНЫ

КОД_ДИСЦИПЛ

НАИМЕНОВАНИЕ

Д2

Информатика

Д6

Физика

Д1

Математика

Д5

История

Д7

Английский

Д4

Физкультура

УСПЕВАЕМОСТЬ

КОД_СТУД

КОД_ДИСЦИПЛ

ОЦЕНКА

С2

Д2

5

С4

Д2

4

С8

Д2

5

С7

Д6

3

С7

Д1

4

С3

Д4

5

Пример 1

Запрос: «Получить имена студентов, сдавших дисциплину Д2». В результате выполнения алгебраического выражения

((СТУДЕНТЫ JOIN УСПЕВАЕМОСТЬ) WHERE КОД_ДИСЦИПЛ = Д2’)[ИМЯ]

получится искомое отношение, содержащее один атрибут ИМЯ (имя студента). Вычисление этого составного выражения может быть представлено в виде

последовательности следующих более простых действий.

1) T1:= СТУДЕНТЫ JOIN УСПЕВАЕМОСТЬ

Информация отношения СТУДЕНТЫ дополняется соответствующей информацией из отношения ОЦЕНКА. В результате получится отношение

T1

КОД_СТУД

ИМЯ

ГОРОД

КОД_ДИСЦИПЛ

ОЦЕНКА

С2

Иванов

Орел

Д2

5

С7

Кузнецов

Брянск

Д6

3

С7

Кузнецов

Брянск

Д1

4

С8

Зайцева

Липецк

Д2

5

С3

Павлов

Воронеж

Д4

5

63

2) T2:= T1 WHERE КОД_ДИСЦИПЛ = ‘Д2’

T2

КОД_СТУД

ИМЯ

ГОРОД

КОД _ДИСЦИПЛ

ОЦЕНКА

С2

Иванов

Орел

Д2

5

С8

Зайцева

Липецк

Д2

5

3) T3:= T2[ИМЯ]

T3

ИМЯ

Иванов

Зайцева

Здесь символ “:=” означает оператор присваивания, обозначения Ti используются в качестве имен, временных отношений, являющихся промежуточными результатами вычислений.

Пример 2

Запрос: «Получить имена и города студентов, сдавших информатику».

(((ДИСЦИПЛИНЫ WHERE НАИМЕНОВАНИЕ=‘Информатика’) JOIN УСПЕВАЕМОСТЬ)[КОД_СТУД] JOIN Студенты)[ИМЯ, ГОРОД]

Другой вариант этого запроса

(((ДИСЦИПЛИНЫ WHERE НАИМЕНОВАНИЕ=‘Информатика’)[КОД_СТУД] JOIN УСПЕВАЕМОСТЬ) JOIN СТУДЕНТЫ) [ИМЯ, ГОРОД]

В результате обоих вариантов будут получены одинаковые отношения, содержащие два атрибута ИМЯ и ГОРОД.

ИМЯ ГОРОД

Иванов Орел Сидоров Москва Зайцева Липецк

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

Пример 3

Запрос: «Получить имена студентов, которые не сдавали дисциплину Д6».

((СТУДЕНТЫ[КОД_СТУД] MINUS (УСПЕВАЕМОСТЬ

WHERE КОД_ДИСЦИПЛ = ‘Д6’) [КОД_СТУД]) JOIN Студенты)[ИМЯ]

Это выражение эквивалентно последовательному выполнению действий

64

T1:= СТУДЕНТЫ[КОД_СТУД];

T2:= УСПЕВАЕМОСТЬ WHERE КОД_ДИСЦИПЛ = ‘Д6’; T3:= T2[КОД_СТУД];

T4:= T1 MINUS T2;

T5:= T4 JOIN Студенты;

T6:= T5[ИМЯ]

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

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

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

Например, выражение из примера 1

((СТУДЕНТЫ JOIN УСПЕВАЕМОСТЬ) WHERE КОД_ДИСЦИПЛ = Д2’) [ИМЯ]

(получить имена студентов, сдавших дисциплину Д2) может быть преобразовано к другому эквивалентному ему виду

((УСПЕВАЕМОСТЬ WHERE КОД_ДИСЦИПЛ = ‘Д2’) JOIN СТУДЕНТЫ)[ИМЯ].

Можно обратить внимание, что второе выражение возможно более рационально с точки зрения времени, затрачиваемого на выполнения запроса. Действительно, в нем вначале из отношения УСПЕВАЕМОСТЬ отбираются кортежи, удовлетворяющие заданному условию, благодаря чему уменьшается число кортежей, участвующих в операции соединения с отношением

СТУДЕНТЫ.

Этот пример говорит о том, что реляционная алгебра предоставляет возможность использования тождественных преобразований алгебраических выражений для оптимизации выполнения запросов, например с точки зрения длительности их выполнения. «Хорошая» СУБД должна иметь в своем составе средства, осуществляющие такую оптимизацию и обеспечивающие в идеале независимость времени выполнения запросов от формы его представления пользователем.