Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Базы данных. Лекции по курсу. В 4 частях. Ч.1. Учебное пособие
.pdf
ЩИЕ_В_ПРОЕКТЕ_1) представлен ниже. Он включает список отде-
лов, где работают указанные сотрудники.
СЛУ_ОТД_НОМЕР
310
313
315
Результат выполнения операции
СЛУЖАЩИЕ_В_ПРОЕКТЕ_1 WHERE (СЛУ_ЗАРП > 20000.00
AND (СЛУ_ОТД_НОМ = 310 OR СЛУ_ОТД_НОМ = 315))
(получить данные из отношения СЛУЖАЩИЕ_В_ПРОЕКТЕ_1 о служащих, работающих в отделах 310 и 315 и получающих зарплату, превышающую 20 000 руб.) показан ниже.
СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП СЛУ_ОТД_НОМЕР
2934 Иванов 22 000 310
2935 Петров 30 000 310
2038 Иванова 22 000 315
На интуитивном уровне операцию проекции можно представить
как взятие некоторой «вертикальной» вырезки из отношения-операнда
(выборки некоторых столбцов из таблицы), а операцию ограничения
можно представить как взятие некоторой «горизонтальной» вырезки из
отношения-операнда (выборки некоторых строк из таблицы).
Операция соединения требует наличия двух операндов – соединяемых отношений и третьего операнда
Операция соединения (JOIN) T = R[B
S(B
, C) по атрибутам B1 и B2, определенным на общем домене, есть
2
соединение кортежей из отношения
– простого условия.
B2]S отношений R(A, B1) и
1
R и S, B
- и B2-атрибуты которых
1
находятся в отношении , где – одна из бинарных операций. Бинарные операции могут связываться логическими операциями.
11

Поскольку операция соединения относится к числу дополнительных операций, ее можно выразить через основные операции
T = R[B
B2]S =
1
B1 B2
(R S)
Ниже приведены примеры записи операций соединения отношений
R и S по некоторым условиям:
Ниже приведены тела двух отношений
СЛУЖАЩИЕ
{СЛУ_НОМЕР, СЛУ_ИМЯ, СЛУ_ЗАРП, ПРО_НОМ} и ПРОЕКТЫ
{ПРО_НОМ, ПРОЕКТ_РУК, ПРО_ЗАРП}. Атрибут ПРО_НОМ содержит номера проектов, в которых участвует служащий, атрибут
ПРО_ЗАРП – среднюю заработную плату служащих, участвующих в
проекте.
Отношение СЛУЖАЩИЕ
СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
2934 Иванов 22 400 1
2935 Петров 29 600 1
2936 Сидоров 18 000 1
2937 Федоров 20 000 1
2038 Иванова 22 000 1
2934 Иванов 22 400 2
2935 Петров 29 600 2
2939 Сидоренко 18 000 2
2940 Федоренко 20 000 2
2041 Иваненко 22 000 2
Отношение ПРОЕКТЫ
ПРО_НОМ ПРОЕКТ_РУК ПРО_ЗАРП
1 Иванов 22 400
2 Иваненко 22 400
12

Тогда осмысленной операцией соединения будет запрос на получение данных о служащих, получающих заработную плату, превышающую среднюю заработную плату любого проекта:
СЛУЖАЩИЕ JOIN ПРОЕКТЫ WHERE (СЛУ_ЗАРП > ПРО_ЗАРП)
Результат выполнения операции приведен ниже.
СЛУ_
НОМЕР
2935 Петров 29 600 1 1 Иванов 22 400
2935 Петров 29 600 2 2 Иваненко 22 400
СЛУ_ИМЯ СЛУ_ЗАРП
ПРО_
НОМ
ПРО_
НОМ1
ПРОЕКТ_
РУК
ПРО_
ЗАРП
Имеется два частных случая операции соединения: операция эквисоединения (EQUIJOIN) и операция естественного соединения (NATURAL JOIN). Кроме того имеется расширение операции соединения –
операция внешнего соединения (OUTER JOIN).
Операция эквисоединения (EQUIJOIN) – это операция соедине-
ния с бинарной операцией равенства между атрибутами или множествами атрибутов отношений. Этот случай важен потому, что он чаще
всего встречается на практике, и для него существуют эффективные
алгоритмы реализации.
Недостатком операции эквисоединения является появление двух
атрибутов с одинаковыми значениями. Избавиться от этого можно,
взяв проекцию по всем атрибутам, кроме одного из дублирующих.
Именно так действует операция естественного соединения.
Если через
ab обозначить объединение заголовков отношений A и
B, а c – атрибуты, общие для отношений A и B, то операция естествен-
ного соединения
ции эквисоединения отношений
A и B – это спроецированный на ab результат опера-
A и B по условию A.c = B.c. Иными
13

словами, операция естественного соединения – это операция эквисоединения с удалением одного из двух одинаковых столбцов.
Ниже представлен результат выполнения запроса «Выдать полную
информацию о служащих и проектах, в которых они участвуют».
СЛУЖАЩИЕ NATURAL JOIN ПРОЕКТЫ
СЛУ_
НОМЕР
2934 Иванов 22 400 1 Иванов 22 400
2935 Петров 29 600 1 Иванов 22 400
2936 Сидоров 18 000 1 Иванов 22 400
2937 Федоров 20 000 1 Иванов 22 400
2038 Иванова 22 000 1 Иванов 22 400
2934 Иванов 22 400 2 Иваненко 22 400
2935 Петров 29 600 2 Иваненко 22 400
2939 Сидоренко 18 000 2 Иваненко 22 400
2940 Федоренко 20 000 2 Иваненко 22 400
2041 Иваненко 22 000 2 Иваненко 22 400
СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
ПРОЕКТ_
РУК
ПРО_
ЗАРП
Следует отметить, что в синтаксисе операции естественного соединения не указывается, по каким атрибутам производится соединение;
предполагается, что естественное соединение производится по всем
общим атрибутам. Операция естественного соединения не выделяется
особым образом в составе набора операций реляционной алгебры Кодда, но имеет очень важное практическое значение (настолько важное,
что часто
го соединения, опуская фразу
ТЫ.
под операцией соединения понимают операции естественно-
NATURAL): СЛУЖАЩИЕ JOIN ПРОЕК-
Операция внешнего соединения (OUTER JOIN), применяемая к
паре отношений
R и S, расширяет операцию эквисоединения путем
добавления к обычной операции соединения кортежей, полученных
конкатенацией кортежей одного из отношений с Null-значениями, для
14

которых отсутствуют кортежи второго отношения, связанные по условию соединения. Ниже приведено сравнение операций эквисоединения
и внешнего соединения.
Различают полное, левое и правое внешние соединения. Подробно
эти операции описываются в учебном пособии [6, 10].
Последняя операция реляционной алгебры Кодда – операция деления.
Имеются отношения
где
a, b – некоторые составные атрибуты, причем составной атрибут b
в отношениях
R и P определен на общем домене.
По определению
R(a, b) и P(b) с арностями r и p (r > p, p 0),
операцией деления (DIVIDE BY) отношений
R(a, b) и P(b) является отношение с множеством кортежей v арности
r – p таких, что любой кортеж, будучи объединенным с каждым кор-
тежем отношения
мер операции деления с абстрактными отношениями
P, содержится в отношении R. Ниже приведен при-
R и P.
Теперь рассмотрим содержательный пример. Предполагаем, что
помимо отношения
СЛУЖАЩИЕ, определено унарное отношение
НОМЕРА_ПРОЕКТОВ {ПРО_НОМ}.
Отношение
НОМЕРА_ПРОЕКТОВ
1
2
15

Тогда результат запроса
СЛУЖАЩИЕ DIVIDE BY НОМЕРА_ПРОЕКТОВ
будет иметь следующий вид.
Результат операции СЛУЖАЩИЕ DIVIDE BY НОМЕРА_ПРОЕКТОВ
СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП
2934 Иванов 22 400
2935 Петров 29 600
Содержательно этот запрос выдает сведения о служащих, участвующих во всех проектах.
Как и любая неосновная операция, операция деления может быть
записана через основные операции. Пусть имеются отношения
R{A, B} и P{B}.
Можно убедиться, что результат
R DIVIDE BY P совпадает с ре-
зультатом выражения:
(R PROJECT A) MINUS (((P TIMES (R PROJECT A)) MINUS R) PROJECT A)
Теперь, зная операции реляционной алгебры, еще раз вернемся к
теме «Обработка запросов в серверах баз данных». В контексте этой
темы мы говорили о выборе оптимальных планов выполнения запроса,
говорили, что сервер выбирает наиболее оптимальное представление
запроса, строя его внутреннее представление в терминах операций
реляционной алгебры.
Рассмотрим пример. Пусть
никах,
Branch – отношение с данными об отделениях компании.
Staff – отношение с данными о сотруд-
Запрос «Получить имена всех менеджеров, работающих в лондонских отделениях компании», можно записать следующим образом:
select * from Staff s, Branch b
where s.bno = b.bno and
(s.position = “manager” and b.city = “London”)
16

Исходя из правил эквивалентных преобразований выражений на
языке реляционной алгебры запрос может быть записан в нескольких
вариантах (планы выполнения запроса):
1.
(position = ”manager”) and (city = ”London”) and (ataff.bno = branch.bno)
2.
(position = ”manager”) and (city = ”London”)
3. [(
(position = ”manager”)
(Staff)) EQUIJOIN (
(Staff EQUIJOIN Branch
(city = ”London”)
(Staff Branch)
(ataff.bno = branch.bno)
(Branch))]
(ataff.bno = branch.bno)
)
Будем предполагать, что отношение Staff содержит 1000 кортежей,
отношение
Branch – 50 кортежей, 5 из 50 менеджеров управляют отде-
лениями в Лондоне. Будем также предполагать, что сортировка по
ключам и индексы не используются, а результаты любой операции
записываются на диск.
Сравним затраты при выполнении каждого из приведенных выше
планов выполнения запросов
1. (1000 + 50) – чтение;
1000 * 50 – запись результата операции декартова произведения
на диск и столько же – чтение
для проверки соответствия требуемому
предикату;
(1000 + 50) + 2 * (1000 * 50) = 101 050 операций.
2. (1000 + 50) – чтение;
1000 – запись результата операции соединения (каждый сотрудник
приписан к одному отделению) и столько же – чтение для проверки
соответствия требуемому предикату;
(1000 + 50) + 2 * 1000 = 3050 операций.
3. 1000 – чтение таблицы
Staff для проверки соответствия требуе-
мому предикату;
50 – запись результата операции ограничения;
50 – чтение таблицы
Branch для проверки соответствия требуемому
предикату;
5 – запись результата второй операции ограничения;
50 + 5 – чтение отношений для последней операции соединения;
1000 + 2 * 50 + 5 + (50 + 5) = 1160 операций.
17

Как видим, затраты на выполнение третьего плана выполнения запроса почти на два порядка меньше, чем затраты на выполнение первого плана выполнения запроса.
1.2. РЕЛЯЦИОННОЕ ИСЧИСЛЕНИЕ
Цель языка реляционного исчисления – декларативное описание
запроса, определяющее свойства желаемого результата, т. е. того, что
хотели бы получить, а не как это сделать. В этой связи имеет смысл
сравнить язык реляционной алгебры и язык реляционного исчисления.
Пусть мы имеем отношения
Сотрудники (Таб_номер, Сотр_имя, Сотр_зарпл, Отдел_ном)
Отделы
(Отдел_ном, Отдел_нач, Отдел_Кол)
и задача состоит в том, чтобы получить имена и табельные номера
сотрудников, являющихся начальниками отделов с количеством сотрудников больше пятидесяти.
Ниже приведена формулировка запроса средствами реляционной
алгебры (алгоритм):
выполнить естественное соединение (JOIN) отношений Сотруд-
и Отделы по условию Сотрудники.Отдел_ном = Отделы.От-
ники
дел_ном
;
ограничить (WHERE) полученное отношение по условию
Кол_во > 50;
спроецировать результат предыдущей операции (PROJECT) на
атрибуты
Таб_номер, Отдел_нач.
На языке реляционной алгебры выражение будет иметь вид
Сотрудники JOIN Отделы) WHERE (Сотрудники Кол_во > 50))
((
PROJECT (Таб_номер, Отдел_нач).
Можно предложить несколько другое решение:
выполнить эквисоединение (EQUIJOIN) отношений Сотрудники
и
Отделы по условию Сотрудники.Отдел_ном = Отделы.Отдел_ном;
ограничить (WHERE) полученное отношение по условию
Кол_во > 50 и Сотр_имя = Отдел_нач;
18

спроецировать результат предыдущей операции (PROJECT) на
атрибуты
Таб_номер, Сотр_имя.
Второй алгоритм на языке реляционной алгебры будет иметь вид
Сотрудники EQUNION Отделы) WHERE (Сотрудники Кол_во > 50
((
and Сотр_имя
= Отдел_нач)) PROJECT (Таб_номер, Отдел_нач).
В обоих случаях решение – это алгоритм, т. е. последовательность
действий.
Формулировка запроса средствами языка реляционного исчисления: выдать значения атрибутов
кортежа отношения
ношения
ем
Отделы со значением Отдел_нач, совпадающим со значени-
Сотр_имя этого кортежа отношения Сотрудники и значением
Сотрудники, при котором существует кортеж от-
Сотр_имя и Таб_номер для каждого
Отдел_Кол, большим 50.
В этой формулировке мы указали лишь характеристики результирующего отношения, но ничего не сказали о способе его формирования.
В зависимости от того, что является областью определения переменной, различается исчисление кортежей и исчисление доменов.
В исчислении кортежей области определения переменных – это отношения базы данных и допустимое значение каждой переменной – кор
-
теж некоторого отношения. В исчислении доменов областями определения переменных являются домены, на которых определены атрибуты
отношений базы данных, и допустимым значением каждой переменной
является значение некоторого домена.
1.2.1. РЕЛЯЦИОННОЕ ИСЧИСЛЕНИЕ
С ПЕРЕМЕННЫМИ-КОРТЕЖАМИ
Сначала приведем синтаксис языка реляционного исчисления с переменными-кортежами, который используется в классическом варианте в литературе по реляционной модели данных.
Общий вид формулы реляционного исчисления: {
t | (t)}.
Формула определяет множество кортежей, обладающих некоторыми свойствами.
Слева в записи присутствует свободная переменная-кортеж (терм),
указывающий наименование отношений и (или) атрибутов, определя-
19

ющих выражение-результат. Справа в записи присутствует предикат,
описывающий свойства множества, которые должны удовлетворяться
в результирующем выражении. Предикаты строятся из атомов, операторов (арифметических, логических) и кванторов существования, всеобщности и т. д.
Атомы могут быть трех типов.
1.
R(t), где R – имя отношения. Запись означает: t – кортеж в отно-
шении
R.
2.
S[i] U[j], где S, U – переменные-кортежи;
– арифметический оператор;
i, j – номера или имена компонентов в соответ-
ствующих кортежах.
3.
S[i] const.
В контексте реляционного исчисления (и исчисления кортежей, и
исчисления доменов) предикат (
t) называется правильно построенной
формулой (well-formed formula, wff). Вводится понятие свободной и
связанной переменной.
Вхождение переменной
x в предикате связано, если в оно
находится в подформуле, начинающейся квантором или , за которым непосредственно следует
x, в противном случае x входит в преди-
кат свободно.
(
x)(R(x, y) (y)(U(x, y, z) Q(x, y))).
В отношении
R х связано, у свободно, в отношении U х и y связаны,
z свободно, в отношении Q х и y связаны.
Для того чтобы обеспечить конечность реальных отношений и исключить возможность формирования выражений вида {
t | R(t)},
определяющих бесконечное множество, вводится понятие безопасного
выражения. Безопасное – такое выражение (
что множество кортежей
t, удовлетворяющих (t), является непустым
t), которое обеспечивает,
множеством D().
В теории реляционных баз данных имеют место следующие теоремы.
Теорема 1. Если E – выражение реляционной алгебры, то суще-
ствует эквивалентная формула в реляционном исчислении с переменными кортежами.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
