Операции реляционной алгебры

Проекция

Пусть r отношение со схемой R, A – атрибут, принадлежащий схеме R. Результатом выполнения операции проекции pA(r) является новое отношение, схема которого будет состоять только из одного атрибута A. Кортежами этого отношения будут отличные друг от друга значения атрибута A из исходного отношения r:

pA(r) = { d Î dom(A) | $ t Î r: t(A) = d }.

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

Например, требуется узнать все года рождения студентов. Для этого достаточно выполнить операцию проекции отношения Студент на атрибут Год_рождения: pГод_рождения(Студент). Результатом операции будет новое отношение с одним атрибутом и тремя кортежами.

pГод_рождения(Студент)

Год_рождения

Операцию проекции можно выполнять и для нескольких атрибутов. Например, требуется информация о том, в каких годах поступали студенты и на каких курсах они сейчас учатся. Эту информацию можно получить, выполнив операцию проекции отношения Студент на атрибуты Год_поступления и Курс_обучения: pГод_поступления, Курс_обучения(Студент). Результатом операции будет отношение с двумя атрибутами и двумя кортежами. (Последний кортеж этого отношения полностью совпадал с предпоследним кортежем, и поэтому был удален.)

pГод_поступления, Курс_обучения(Студент)

Год_поступления Курс_обучения

Селекция

Пусть r отношение со схемой R, A – атрибут, принадлежащий схеме R, a – значение из домена атрибута A (a Î dom(A)). Результатом выполнения операции селекции sA=a(r) является новое отношение с той же схемой, которое представляет собой подмножество кортежей отношения r, каждый из которых имеет значение a на атрибуте A:

sA=a(r) = { t Î r | t(A)=a }.

Операция селекции – это операция выбора только тех кортежей, которые имеют заданное значение на заданном атрибуте. Пример: найдем тех студентов, которые учатся на 4 курсе. Для этого необходимо выполнить операцию селекции для отношения Студент, при этом условием отбора будет: Курс_обучения = 4: sКурс_обучения=4 (Студент). В результате получим новое отношение с двумя кортежами.

sКурс_обучения=4 (Студент)

Фамилия Год_рож-дения Год_пос-тупления Номер_ билета Курс_ обучения Стипендия
Иванов 0.00
Соколов 90.00

В условии отбора операции селекции кроме сравнения на равенство можно использовать и другие операции сравнения. Например, если требуется найти всех студентов, родившихся не ранее 1979 года, то в качестве условия можно записать Год_рождения>1978, тогда будут выбраны кортежи, соответствующие студентам с годом рождения 1979, 1980, 1981 и т. д.

Также можно составить и более сложное условие с использованием логических операций and, or, not для одного или нескольких атрибутов. Например, (Год_рождения > 1978)and(Год_рождения <= 1980)and(Стипендия = 100.50).

Соединение

Эта операция предназначена для соединения двух отношений с разными схемами. Пусть r отношение со схемой R, s отношение со схемой S, T – множество атрибутов, входящих и в схему R, и в схему S (T=R Ç S ¹ Æ). Результатом выполнения операции соединения r(R) >< s(S) является новое отношение, схема которого состоит из всех атрибутов схемы R и всех атрибутов схемы S, при этом одинаковые атрибуты не дублируются. Каждый кортеж этого отношения является комбинацией кортежа из отношения r и кортежа из отношения s с равными значениями атрибутов, входящих во множество T:

r(R) >< s(S) = { t Î RÈS | $ tr Î r, $ ts Î s, tr=t(R), ts=t(S), tr (R Ç S) = ts(R Ç S)}.

Для примера рассмотрим отношение Материальная помощь с атрибутами Курс_обучения и Сумма.

Материальная помощь

Курс_обучения Сумма
100.00
120.00
140.00
130.00

Требуется для каждого студента определить сумму материальной помощи. Для этого выполним соединение двух отношений Студент и Материальная помощь. Общим атрибутом, входящим и в схему отношения Студент, и в схему отношения Материальная помощь, является атрибут Курс_обучения. По этому атрибуту и будет выполнено соединение. Новое отношение, которое получится в результате операции соединения, будет иметь в своей схеме семь атрибутов и три кортежа.

Студент >< Материальная помощь

Фамилия Год_рож-дения Год_пос-тупления Номер_ билета Курс_ обучения Сти-пендия Сумма
Петров 100.00 130.00
Иванов 0.00 140.00
Соколов 90.00 140.00

Если бы отношение Материальная помощь состояло из следующих кортежей:

Материальная помощь

Курс_обучения Сумма
100.00  
120.00 ,

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

Студент >< Материальная помощь

Фамилия Год_рож-дения Год_пос-тупления Номер_ билета Курс_ обучения Сти-пендия Сумма
Иванов 0.00 100.00
Иванов 0.00 120.00
Соколов 90.00 100.00
Соколов 90.00 120.00

Если бы отношение Материальная помощь состояло из следующих кортежей:

Материальная помощь

Курс_обучения Стипендия Сумма
0.00 100.00  
0.00 120.00 ,

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

Студент >< Материальная помощь

Фамилия Год_ рож-дения Год_пос-тупления Номер_ билета Курс_обу-чения Сти-пендия Сумма
Иванов 0.00 100.00

Эквисоединение

Эта операция предназначена для соединения двух отношений с абсолютно разными схемами. Пусть r – отношение со схемой R, s – отношение со схемой S, R Ç S = Æ, т. е. схемы не содержат одинаковых атрибутов. Пусть A – атрибут схемы R, а B – атрибут схемы S (AÎR, BÎS). Эти атрибуты определены на одинаковых доменах dom(A)=dom(B). Результатом выполнения операции эквисоединения r(R) [A=B] s(S) является новое отношение, схема которого состоит из всех атрибутов схемы R и всех атрибутов схемы S. Каждый кортеж этого отношения является комбинацией кортежа из отношения r и кортежа из отношения s с равными значениями атрибутов A и B:

r(R) [A=B] s(S) = { t Î RÈS | $ tr Î r, $ ts Î s : tr=t(R), ts=t(S), tr (A) = ts(B)}.

Операция эквисоединения используется вместо операции соединения, которую также называют естественным соединением, когда атрибуты, по которым необходимо выполнить соединение, имеют разные имена. Например, пусть, отношение Материальная помощь содержит атрибуты Курс (вместо Курс_обучения) и Сумма. В этом случае операцию соединения выполнить нельзя, так как пересечение схем отношений Студент и Материальная помощь пусто. Но атрибуты Курс и Курс_обучения по смыслу содержат одинаковую информацию и формально их домены совпадают, поэтому вместо операции соединения выполняется операция эквисоединения Студент [ Курс_обучения = Курс ] Материальная помощь.

Материальная помощь

Курс Сумма
100.00
120.00
140.00
130.00

Студент [ Курс_обучения = Курс ] Материальная помощь

Фамилия Год_рож-дения Год_пос-тупления Номер_ билета Курс_ обучения Сти-пендия Курс Сумма
Петров 100.00 130.00
Иванов 0.00 140.00
Соколов 90.00 140.00

Деление

Пусть, r – отношение со схемой R, s – отношение со схемой S и SÍR, тогда r, разделенное на s, – это отношение, содержащее такие значения атрибутов R–S кортежей из отношения r, для которых соответствующие значения атрибутов S включают все значения из отношения s:

r¸s = { t |для" ts Î s $ tr Î r : tr( R - S ) = tиtr(S) = ts }.

В качестве примера рассмотрим отношение Зачет(ФИО, Название), содержащее информацию о студентах, сдавших зачеты по различным дисциплинам, и отношение Дисциплины(Название), содержащее некоторый список названий дисциплин. Тогда операция деления отношения Зачет на отношение Дисциплины будет содержать фамилии только тех студентов, которые получили зачеты по всем дисциплинам, перечисленным в отношении Дисциплины.

Зачет

ФИО Название
Иванов И. И. Алгебра
Петров В. В. Алгебра
Иванов И. И. История
Дубов С. С. Физика
Петров В. В. Физика
Иванов И. И. Физика
Дубов С. С. Топология

Дисциплины

Название
Алгебра
Физика

Зачет¸Дисциплины

ФИО
Иванов И. И.
Петров В. В.

Только два студента сдали оба зачета и по Алгебре, и по Физике.

Ограничения целостности

Отношения реляционной модели данных должны удовлетворять следующим правилам:

1) Запрещается дублирование кортежей в отношении. Это означает, что каждое отношение имеет, по крайней мере, один ключ, состоящий из всех атрибутов.

2) Порядок кортежей в отношении не определен. Каждый кортеж идентифицируется значениями ключевых атрибутов.

3) Порядок атрибутов в отношении не определен. Каждый атрибут имеет уникальное в пределах отношения имя, которое можно использовать для идентификации атрибута.

4) Два правила целостности:

a) Целостность по сущностям. Не допускаются неопределенные значения ключевых атрибутов. Это означает, что каждый кортеж обязательно должен содержать значения в атрибутах, входящих в ключ. Соблюдение этого правила должно отслеживаться при выполнении операций обновления отношения (добавление, удаление, изменение).

b) Целостность по ссылкам. Значения внешних ключей должны либо соответствовать значениям первичных ключей, либо быть неопределенными.

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

Нормализация отношений

Аномалии схемы отношения

После того как построена схема отношений, являющаяся моделью данных, при ее использовании могут возникнуть некоторые нежелательные эффекты. Например, мы построили отношение Поставка(Товар, Поставщик, Адрес, Цена, Склад, Объем). Это отношение содержит информацию о наличии различных товаров, поставляемых несколькими поставщиками в некоторый магазин, и размещении их на складах магазина. Для каждого поставщика хранится его адрес, а для каждого склада – его объем. Цена товара зависит от поставщика. Один и тот же товар, поставленный одним поставщиком, целиком хранится на одном складе.

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

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

Такая же ситуация характерна для информации о складе и его объеме: если склад опустошается, то теряются данные о его объеме.

Эти проблемы называются аномалиями обновления.

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

Решением этих проблем было бы разделение отношения Поставка на несколько других отношений: Склад(Номер, Объем), Поставщик(Название, Адрес), Товар(Наименование, Поставщик, Цена, Склад). В отношении Товар атрибут Поставщик будет внешним ключом, ссылающимся на отношение Поставщик, а атрибут Склад будет внешним ключом, ссылающимся на отношение Склад.

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

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

1. По каким правилам проводить декомпозицию?

2. Как оценить, хорошая получилась схема или плохая?

Наши рекомендации