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

Базы данных. Лекции по курсу. В 4 частях. Ч.1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
ЩИЕ_В_ПРОЕКТЕ_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) и операция естественного соединения (NA­TURAL 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]