Рассмотренные ранее основные
понятия реляционных баз данных, не опирались на какую-либо конкретную реализацию.
Эти рассуждения в равной степени относились к любой системе, при построении
которой использовался реляционный подход. Другими словами, мы использовали
понятия реляционной модели данных. Модель данных описывает некоторый
набор родовых понятий и признаков, которыми должны обладать все конкретные СУБД
и управляемые ими базы данных, если они основываются на этой модели. Наличие
модели данных позволяет сравнивать конкретные реализации, используя один общий
язык.
Хотя понятие модели данных
является общим, и можно говорить об иерархической, сетевой, семантической и т.д.
моделях данных, нужно отметить, что это понятие было введено в обиход
применительно к реляционным системам и наиболее эффективно используется именно в
этом контексте. Попытки прямолинейного применения аналогичных моделей к
дореляционным организациям показывают, что реляционная модель слишком "велика"
для них, а для постреляционных организаций она оказывается "мала".
4.1. Общая
характеристика
Согласно Дейту реляционная
модель состоит из трех частей, описывающих разные аспекты реляционного подхода:
-
структурной
части,
-
манипуляционной
части,
-
целостной части.
В структурной части
модели фиксируется, что единственной структурой данных, используемой в
реляционных БД, является нормализованное n-арное отношение.
В манипуляционной части
модели утверждаются два фундаментальных механизма манипулирования реляционными
БД – реляционная алгебра и реляционное исчисление. Первый механизм
базируется в основном на классической теории множеств (с некоторыми уточнениями),
а второй – на классическом логическом аппарате исчисления предикатов первого
порядка. Основной функцией манипуляционной части реляционной модели является
обеспечение меры реляционности любого конкретного языка реляционных БД: язык
называется реляционным, если он обладает не меньшей выразительностью и мощностью,
чем реляционная алгебра или реляционное исчисление.
В целостной части
реляционной модели данных фиксируются два базовых требования целостности,
которые должны поддерживаться в любой реляционной СУБД.
Первое требование
называется требованием целостности сущностей. Объекту или сущности реального
мира в реляционных БД соответствуют кортежи отношений. Конкретно требование
состоит в том, что любой кортеж любого отношения отличим от любого другого
кортежа этого отношения, т.е. другими словами, любое отношение должно обладать
первичным ключом. Как мы видели в предыдущем разделе, это требование
автоматически удовлетворяется, если в системе не нарушаются базовые свойства
отношений.
Второе требование
называется требованием целостности по ссылкам и является несколько более сложным.
Очевидно, что при соблюдении нормализованности отношений сложные сущности
реального мира представляются в реляционной БД в виде нескольких кортежей
нескольких отношений.
Например, представим, что нам
требуется представить в реляционной базе данных сущность ОТДЕЛ с атрибутами
ОТД_НОМЕР (номер отдела), ОТД_КОЛ (количество сотрудников) и ОТД_СОТР (набор
сотрудников отдела). Для каждого сотрудника нужно хранить СОТР_НОМЕР (номер
сотрудника), СОТР_ИМЯ (имя сотрудника) и СОТР_ЗАРП (заработная плата сотрудника).
Как мы вскоре увидим, при правильном проектировании соответствующей БД в ней
появятся два отношения: ОТДЕЛЫ (ОТД_НОМЕР, ОТД_КОЛ) (первичный ключ – ОТД_НОМЕР)
и СОТРУДНИКИ (СОТР_НОМЕР, СОТР_ИМЯ, СОТР_ЗАРП, СОТР_ОТД_НОМ) (первичный ключ –
СОТР_НОМЕР).
Таблица 4. Отношение «ОТДЕЛЫ».
ОТД_НОМЕР |
ОТД_КОЛ |
310 |
3 |
313 |
1 |
315 |
1 |
Таблица 5. Отношение «СОТРУДНИКИ».
СОТР_НОМЕР |
СОТР_ИМЯ |
СОТР_ЗАРП |
СОТР_ОТД_НОМЕР |
2934 |
Иванов |
112,000 |
310 |
2935 |
Петров |
144,000 |
310 |
2936 |
Сидоров |
92,000 |
313 |
2937 |
Федоров |
110,000 |
310 |
2938 |
Иванова |
112,000 |
315 |
Как видно, атрибут
СОТР_ОТД_НОМ появляется в отношении СОТРУДНИКИ не потому, что номер отдела
является собственным свойством сотрудника, а лишь для того, чтобы иметь
возможность восстановить при необходимости полную сущность ОТДЕЛ. Значение
атрибута СОТР_ОТД_НОМ в любом кортеже отношения СОТРУДНИКИ должно
соответствовать значению атрибута ОТД_НОМ в некотором кортеже отношения ОТДЕЛЫ.
Атрибут такого рода называется внешним ключом, поскольку его значения
однозначно характеризуют сущности, представленные кортежами некоторого другого
отношения (т.е. задают значения их первичного ключа). Говорят, что отношение, в
котором определен внешний ключ, ссылается на соответствующее отношение, в
котором такой же атрибут является первичным ключом.
Требование целостности по
ссылкам, или требование внешнего ключа состоит в том, что для каждого значения
внешнего ключа, появляющегося в ссылающемся отношении, в отношении, на которое
ведет ссылка, должен найтись кортеж с таким же значением первичного ключа, либо
значение внешнего ключа должно быть неопределенным (т.е. ни на что не указывать).
Для нашего примера это означает, что если для сотрудника указан номер отдела, то
этот отдел должен существовать.
Ограничения целостности
сущности по ссылкам должны поддерживаться СУБД. Для соблюдения целостности
сущности достаточно гарантировать отсутствие в любом отношении кортежей с одним
и тем же значением первичного ключа. С целостностью по ссылкам дела обстоят
несколько более сложно.
Понятно, что при обновлении
ссылающегося отношения (вставке новых кортежей или модификации значения внешнего
ключа в существующих кортежах) достаточно следить за тем, чтобы не появлялись
некорректные значения внешнего ключа. Но как быть при удалении кортежа из
отношения, на которое ведет ссылка?
Здесь существуют три подхода,
каждый из которых поддерживает целостность по ссылкам:
-
Запрещается
производить удаление кортежа, на который существуют ссылки (т.е. сначала нужно
либо удалить ссылающиеся кортежи, либо соответствующим образом изменить значения
их внешнего ключа).
-
При удалении
кортежа, на который имеются ссылки, во всех ссылающихся кортежах значение
внешнего ключа автоматически становится неопределенным.
-
Каскадное
удаление – при удалении кортежа из отношения, на которое ведет ссылка, из
ссылающегося отношения автоматически удаляются все ссылающиеся кортежи.
В развитых реляционных СУБД
обычно можно выбрать способ поддержания целостности по ссылкам для каждой
отдельной ситуации определения внешнего ключа. Конечно, для принятия такого
решения необходимо анализировать требования конкретной прикладной области.
4.2.
Базисные средства манипулирования реляционными
данными
Ранее были подробно
рассмотрены две из трех составляющих реляционной модели данных – структурная и
целостная. Рассмотрим более подробно манипуляционную часть.
В манипуляционной
составляющей определяются два базовых механизма манипулирования реляционными
данными – основанная на теории множеств реляционная алгебра и базирующееся на
математической логике (точнее, на исчислении предикатов первого порядка)
реляционное исчисление. В свою очередь, обычно рассматриваются два вида
реляционного исчисления – исчисление доменов и исчисление предикатов.
Все эти механизмы обладают
одним важным свойством: они замкнуты относительно понятия отношения. Это
означает, что выражения реляционной алгебры и формулы реляционного исчисления
определяются над отношениями реляционных БД и результатом вычисления также
являются отношения. В результате любое выражение или формула могут
интерпретироваться как отношения, что позволяет использовать их в других
выражениях или формулах.
Алгебра и исчисление обладают
большой выразительной мощностью: очень сложные запросы к базе данных могут быть
выражены с помощью одного выражения реляционной алгебры или одной формулы
реляционного исчисления. Именно по этой причине именно эти механизмы включены в
реляционную модель данных. Конкретный язык манипулирования реляционными БД
называется реляционно полным, если любой запрос, выражаемый с помощью
одного выражения реляционной алгебры или одной формулы реляционного исчисления,
может быть выражен с помощью одного оператора этого языка.
Известно, что механизмы
реляционной алгебры и реляционного исчисления эквивалентны, т.е. для любого
допустимого выражения реляционной алгебры можно построить эквивалентную (т.е.
производящую такой же результат) формулу реляционного исчисления и наоборот.
Присутствие в реляционной
модели данных обоих представленных механизмов объясняется тем, что они
различаются уровнем процедурности. Выражения реляционной алгебры строятся на
основе алгебраических операций (высокого уровня), и подобно тому, как
интерпретируются арифметические и логические выражения, выражение реляционной
алгебры также имеет процедурную интерпретацию. Другими словами, запрос,
представленный на языке реляционной алгебры, может быть вычислен на основе
вычисления элементарных алгебраических операций с учетом их старшинства и
возможного наличия скобок. Для формулы реляционного исчисления однозначная
интерпретация, вообще говоря, отсутствует. Формула только устанавливает условия,
которым должны удовлетворять кортежи результирующего отношения. Поэтому языки
реляционного исчисления являются более непроцедурными или декларативными.
Поскольку механизмы
реляционной алгебры и реляционного исчисления эквивалентны, то в конкретной
ситуации для проверки степени реляционности некоторого языка БД можно
пользоваться любым из этих механизмов.
Заметим, что крайне редко
алгебра или исчисление принимаются в качестве полной основы какого-либо языка БД.
Обычно (как, например, в случае языка SQL) язык основывается на некоторой смеси
алгебраических и логических конструкций. Тем не менее, знание алгебраических и
логических основ языков баз данных часто бывает полезно на практике.
4.3. Реляционная алгебра
Реляционная
алгебра представляет собой набор операторов, использующих отношения в качестве
аргументов, и возвращающие отношения в качестве результата. Таким образом,
реляционный оператор f выглядит как функция с отношениями в качестве аргументов:
R = f(R1,R2,…,Rn)
Реляционная алгебра является
замкнутой, т.к. в качестве аргументов в реляционные операторы можно
подставлять другие реляционные операторы, подходящие по типу:
R = f(f1(R11,R12,…,R1n);
f2(R21,R22,…,R2n))
Таким образом, в реляционных
выражениях можно использовать вложенные выражения сколь угодно сложной структуры.
Каждое отношение обязано
иметь уникальное имя в пределах базы данных. Имя отношения, полученного в
результате выполнения реляционной операции, определяется в левой части равенства.
Однако можно не требовать наличия имен от отношений, полученных в результате
реляционных выражений, если эти отношения подставляются в качестве аргументов в
другие реляционные выражения. Такие отношения будем называть неименованными
отношениями. Неименованные отношения реально не существуют в базе данных, а
только вычисляются в момент вычисления значения реляционного оператора.
Традиционно, вслед за Коддом,
определяют восемь реляционных операторов, объединенных в две группы:
Не все они являются
независимыми, т.е. некоторые из этих операторов могут быть выражены через другие
реляционные операторы.
Некоторые реляционные
операторы (например, объединение) требуют, чтобы отношения имели одинаковые
заголовки. Действительно, отношения состоят из заголовка и тела. Операция
объединения двух отношений есть просто объединение двух множеств кортежей,
взятых из тел соответствующих отношений. Но будет ли результат отношением?
Во-первых, если исходные
отношения имеют разное количество атрибутов, то, очевидно, что множество,
являющееся объединением таких разнотипных кортежей нельзя представить в виде
отношения.
Во-вторых, пусть даже
отношения имеют одинаковое количество атрибутов, но атрибуты имеют различные
наименования. Как тогда определить заголовок отношения, полученного в результате
объединения множеств кортежей?
В-третьих, пусть отношения
имеют одинаковое количество атрибутов, атрибуты имеют одинаковые наименования,
но определенны на различных доменах. Тогда снова объединение кортежей не будет
образовывать отношение.
Определение.
Будем называть отношения совместимыми по типу, если они имеют идентичные
заголовки, а именно:
-
Отношения имеют
одно и то же множество имен атрибутов, т.е. для любого атрибута в одном
отношении найдется атрибут с таким же наименованием в другом отношении.
-
Атрибуты с
одинаковыми именами определены на одних и тех же доменах.
Некоторые отношения не
являются совместимыми по типу, но становятся таковыми после некоторого
переименования атрибутов.
Для того чтобы такие
отношения можно было использовать в реляционных операторах, вводится
вспомогательный оператор переименования атрибутов.
Оператор переименования
атрибутов имеет следующий синтаксис:
R RENAME Atr1,Atr2,…AS
NewAtr1,NewAtr2,…,
где R – отношение,
Atr1,Atr2,…
– исходные имена атрибутов,
NewAtr1,NewAtr2,…
– новые имена атрибутов.
Определение.
Объединением двух совместимых по типу отношений A и B называется
отношение с тем же заголовком, что и у отношений A и B, и телом, состоящим из
кортежей, принадлежащих или A, или B, или обоим отношениям.
Синтаксис операции
объединения:
A UNION B
Замечание.
Объединение, как и любое отношение, не может содержать одинаковых кортежей.
Поэтому, если некоторый кортеж входит и в отношение A, и отношение B, то в
объединение он входит один раз.

Рисунок
6.
Объединение множеств
A
и
B
Пример.
Пусть даны два отношения
A
и B с
информацией о сотрудниках.
Таблица 6. Отношение A
Табельный номер |
Фамилия |
Зарплата |
1 |
Иванов |
1000 |
2 |
Петров |
2000 |
3 |
Сидоров |
3000 |
Таблица 7. Отношение B
Табельный номер |
Фамилия |
Зарплата |
1 |
Иванов |
1000 |
2 |
Пушников |
2500 |
4 |
Сидоров |
3000 |
Объединение отношений
A
и
B будет
иметь вид:
Таблица 8. Отношение A UNION
B
Табельный номер |
Фамилия |
Зарплата |
1 |
Иванов |
1000 |
2 |
Петров |
2000 |
3 |
Сидоров |
3000 |
2 |
Пушников |
2500 |
4 |
Сидоров |
3000 |
Замечание.
Потенциальные ключи, которые были в отношениях A и B не наследуются объединением
этих отношений. Поэтому, в объединении отношений A и B атрибут "Табельный номер"
может содержать дубликаты значений. Если бы это было не так, и ключи
наследовались бы, то это противоречило бы понятию объединения как "объединение
множеств". Конечно, объединение отношений A и B имеет, как и любое отношение,
потенциальный ключ, например, состоящий из всех атрибутов.
Определение.
Пересечением двух совместимых по типу отношений A и B называется
отношение с тем же заголовком, что и у отношений A и B, и телом, состоящим из
кортежей, принадлежащих одновременно обоим отношениям A и B.
Синтаксис операции
пересечения:
A INTERSECT B

Рисунок
7.
Пересечение множеств
A
и
B
Пример.
Для тех же отношений
A и
B,
что и в предыдущем примере пересечение имеет вид.
Таблица 9. Отношение A
INTERSECT B
Табельный номер |
Фамилия |
Зарплата |
1 |
Иванов |
1000 |
Замечание.
Казалось бы, что в отличие от операции объединения, потенциальные ключи могли бы
наследоваться пересечением отношений. Однако это не так. Вообще, никакие
реляционные операторы не передают результирующему отношению никаких данных о
потенциальных ключах.
В качестве причины этого
можно было бы привести тривиальное соображение, что так получается более просто
и симметрично – все операторы устроены одинаково. На самом деле причина более
глубока, и заключается в том, что потенциальный ключ – семантическое понятие,
отражающее различимость объектов предметной области. Наличие потенциальных
ключей не выводится из структуры отношения, а явно задается для каждого
отношения, исходя из его смысла. Реляционные же операторы являются формальными
операциями над отношениями и выполняются одинаково, независимо от смысла данных,
содержащихся в отношениях. Поэтому, реляционные операторы ничего не могут
"знать" о смысле данных. Трактовка результата реляционных операций – дело
пользователя.
Определение. Вычитанием
двух совместимых по типу отношений A и B называется отношение с тем же
заголовком, что и у отношений A и B, и телом, состоящим из кортежей,
принадлежащих отношению A и не принадлежащих отношению B.
Синтаксис операции вычитания:
A MINUS B

Рисунок
8.
Разность множеств
A
и
B
Пример.
Для тех же отношений
A
и
B,
что и в предыдущем примере вычитание имеет вид.
Таблица
10.
Отношение A MINUS B
Табельный номер |
Фамилия |
Зарплата |
2 |
Петров |
2000 |
3 |
Сидоров |
3000 |
Определение. Декартовым
произведением двух
отношений A(A1,A2,…,AN) и B(B1,B2,…,BM)
называется отношение, заголовок которого является сцеплением заголовков
отношений A и B:
(A1,A2,…,AN,B1,B2,…,BM),
а тело состоит из кортежей,
являющихся сцеплением кортежей отношений A и B:
(a1,a2,…,an,b1,b2,…,bm),
таких,
что
(a1,a2,…,an)
ÎA, (b1,b2,…,bm)
Î B.
Синтаксис операции
декартового произведения:
A TIMES B
Пример.
Пусть даны два отношения A и
B
с информацией о поставщиках и деталях.
Таблица 11. Отношение A
(Поставщики)
Номер поставщика |
Наименование поставщика |
1 |
Иванов |
2 |
Петров |
3 |
Сидоров |
Таблица 12. Отношение B
(Детали)
Номер
детали |
Наименование детали |
1 |
Болт |
2 |
Гайка |
3 |
Винт |
Декартово
произведение отношений
A
и B
будет иметь вид.
Таблица 13. Отношение A TIMES
B
Номер поставщика |
Наименование поставщика |
Номер детали |
Наименование детали |
1 |
Иванов |
1 |
Болт |
1 |
Иванов |
2 |
Гайка |
1 |
Иванов |
3 |
Винт |
2 |
Петров |
1 |
Болт |
2 |
Петров |
2 |
Гайка |
2 |
Петров |
3 |
Винт |
3 |
Сидоров |
1 |
Болт |
3 |
Сидоров |
2 |
Гайка |
3 |
Сидоров |
3 |
Винт |
Замечания:
-
Мощность
произведения A TIMES B равна произведению мощностей отношений A и B, т.к. каждый
кортеж отношения A соединяется с каждым кортежем отношения B.
-
Если в
отношениях A и B имеются атрибуты с одинаковыми наименованиями, то перед
выполнением операции декартового произведения такие атрибуты необходимо
переименовать.
-
Перемножать
можно любые два отношения, совместимость по типу при этом не требуется.
-
Сама по себе
операция декартового произведения не очень важна, т.к. она не дает никакой новой
информации, по сравнению с исходными отношениями. Для реальных запросов эта
операция почти никогда не используется. Однако операция декартового произведения
важна для выполнения специальных реляционных операций, о которых речь пойдет
далее.
Определение. Выборкой
(ограничением, селекцией)
на отношении A с условием
C
называется отношение с тем же
заголовком, что и у отношения A, и телом, состоящем из кортежей, значения
атрибутов которых при подстановке в условие
C
дают значение ИСТИНА. C
представляет собой логическое выражение, в которое могут входить атрибуты
отношения A и (или) скалярные выражения.
В простейшем случае условие
C
имеет вид XθY, где θ-один из
операторов сравнения (=, >, <и т.д.), а X и Y – атрибуты отношения A или
скалярные значения. Такие выборки называются θ-выборки (тэта-выборки) или
θ-ограничения, θ-селекции.
Синтаксис операции выборки:
A
WHERE
C,
или A
WHERE
XθY
Пример.
Пусть дано отношение
A с
информацией о сотрудниках:
Таблица 14. Отношение A
Табельный номер |
Фамилия |
Зарплата |
1 |
Иванов |
1000 |
2 |
Петров |
2000 |
3 |
Сидоров |
3000 |
Результат выборки A WHERE Зарплата < 3000 будет иметь вид:
Таблица 15. Отношение A WHERE
Зарплата<3000
Табельный номер |
Фамилия |
Зарплата |
1 |
Иванов |
1000 |
2 |
Петров |
2000 |
Смысл операции выборки очевиден – выбрать кортежи отношения,
удовлетворяющие некоторому условию. Таким образом, операция выборки дает
"горизонтальный срез" отношения по некоторому условию.
Определение.
Проекцией отношения A по атрибутам X,Y,…Z, где каждый из атрибутов
принадлежит отношению A, называется отношение с заголовком (X,Y,…Z) и телом,
содержащим множество кортежей вида (x,y,…,z), таких, для которых в отношении A
найдутся кортежи со значением атрибута X равным x, значением атрибута Y равным
y, …, значением атрибута Z равным z.
Синтаксис операции проекции:
A[X,Y,…,Z]
Замечание.
Операция проекции дает "вертикальный срез" отношения, в котором удалены все
возникшие при таком срезе дубликаты кортежей.
Пример.
Пусть дано отношение A с информацией о поставщиках, включающих наименование и
месторасположение.
Таблица 16. Отношение A
(Поставщики)
Номер поставщика |
Наименование поставщика |
Город
поставщика |
1 |
Иванов |
Уфа |
2 |
Петров |
Москва |
3 |
Сидоров |
Москва |
4 |
Сидоров |
Челябинск |
Проекция
A[Город
поставщика] будет иметь вид.
Таблица 17. Отношение A[Город
поставщика]
Город поставщика |
Уфа |
Москва |
Челябинск |
Операция соединения
отношений, наряду с операциями выборки и проекции, является одной из наиболее
важных реляционных операций. Обычно рассматривается несколько разновидностей
операции соединения:
Наиболее важным из этих
частных случаев является операция естественного соединения. Все разновидности
соединения являются частными случаями общей операции соединения.
Определение. Соединением
отношений A и
B
по условию
C
называется отношение
(A
TIMES B)
WHERE C
где,
C
представляет собой логическое
выражение, в которое могут входить атрибуты отношений A и
B
и (или) скалярные выражения.
Таким образом, операция
соединения есть результат последовательного применения операций декартового
произведения и выборки. Если в отношениях
A
и
B
имеются атрибуты с
одинаковыми наименованиями, то перед выполнением соединения такие атрибуты
необходимо переименовать.
Определение.
Пусть отношение
A
содержит атрибут
X,
отношение
B
содержит атрибут
Y,
а θ
– один из операторов сравнения (= ≠ < ≤ > ≥ и т.д.). Тогда
θ-соединением
отношения
A
по атрибуту
X
с отношением
B
по атрибуту
Y
называют отношение
(A TIMES B)
WHERE X θ
Y
Это частный случай операции
общего соединения.
Иногда, для операции
θ-соединения
применяют следующий, более короткий синтаксис:
A
[X
θ
Y]
B
Пример.
Рассмотрим некоторую компанию, в которой хранятся данные о поставщиках и
поставляемых деталях. Пусть поставщикам и деталям присвоен некий статус. Пусть
бизнес компании организован таким образом, что поставщики имеют право поставлять
только те детали, статус которых не выше статуса поставщика (смысл этого может
быть в том, что хороший поставщик с высоким статусом может поставлять больше
разновидностей деталей, а плохой поставщик с низким статусом может поставлять
только ограниченный список деталей, важность которых (статус детали) не очень
высока).
Таблица 18. Отношение A
(Поставщики)
Номер поставщика |
Наименование поставщика |
X
(Статус поставщика) |
1 |
Иванов |
4 |
2 |
Петров |
1 |
3 |
Сидоров |
2 |
Таблица 19. Отношение B
(Детали)
Номер детали |
Наименование детали |
Y
(Статус детали) |
1 |
Болт |
3 |
2 |
Гайка |
2 |
3 |
Винт |
1 |
Ответ на
вопрос
"какие поставщики имеют право поставлять какие детали?" дает θ-соединение
A[X≥Y]
B.
Таблица 20. Отношение "Какие
поставщики поставляют какие детали"
Номер поставщика |
Наименование поставщика |
X (Статус
поставщика) |
Номер детали |
Наименование детали |
Y (Статус
детали) |
1 |
Иванов |
4 |
1 |
Болт |
3 |
1 |
Иванов |
4 |
2 |
Гайка |
2 |
1 |
Иванов |
4 |
3 |
Винт |
1 |
2 |
Петров |
1 |
3 |
Винт |
1 |
3 |
Сидоров |
2 |
2 |
Гайка |
2 |
3 |
Сидоров |
2 |
3 |
Винт |
1 |
Наиболее
важным частным случаем θ-соединения является случай, когда θ есть просто
равенство. Синтаксис экви-соединения:
A[X
=
Y]
B
Пример.
Пусть имеются отношения
P,
D
и
PD,
хранящие информацию о поставщиках, деталях и поставках соответственно (для
удобства введем краткие наименования атрибутов).
Таблица 21. Отношение P
(Поставщики)
Номер поставщика
PNUM |
Наименование поставщика
PNAME |
1 |
Иванов |
2 |
Петров |
3 |
Сидоров |
Таблица 22. Отношение D
(Детали)
Номер детали
DNUM |
Наименование детали
DNAME |
1 |
Болт |
2 |
Гайка |
3 |
Винт |
Таблица 23. Отношение PD
(Поставки)
Номер поставщика PNUM |
Номер детали DNUM |
Поставляемое количество VOLUME |
1 |
1 |
100 |
1 |
2 |
200 |
1 |
3 |
300 |
2 |
1 |
150 |
2 |
2 |
250 |
3 |
1 |
1000 |
Ответ на вопрос, какие детали
поставляются поставщиками, дает экви-соединение
P[PNUM
=
PNUM]
PD.
На самом деле, т.к. в отношениях имеются одинаковые атрибуты, то требуется
сначала переименовать атрибуты, а потом выполнить экви-соединение, хотя обычно
такой сложной формой записи не пользуются.
Запись становится более громоздкой:
(P RENAME PNUM
AS PNUM1)[PNUM1=PNUM2] (PD RENAME PNUM AS PNUM2)
В результате получаем отношение (таблица 24).
Таблица 24 Отношение "Какие
детали поставляются какими поставщиками".
Номер поставщика
PNUM1 |
Наименование поставщика
PNAME |
Номер поставщика
PNUM2 |
Номер детали
DNUM |
Поставляемое количество
VOLUME |
1 |
Иванов |
1 |
1 |
100 |
1 |
Иванов |
1 |
2 |
200 |
1 |
Иванов |
1 |
3 |
300 |
2 |
Петров |
2 |
1 |
150 |
2 |
Петров |
2 |
2 |
250 |
3 |
Сидоров |
3 |
1 |
1000 |
Недостатком экви-соединения является то, что если соединение
происходит по атрибутам с одинаковыми наименованиями (а так чаще всего и
происходит), то в
результирующем отношении
появляется два атрибута с одинаковыми значениями. В нашем примере атрибуты PNUM1
и PNUM2 содержат дублирующие данные. Избавиться от этого недостатка можно, взяв
проекцию по всем атрибутам, кроме одного из дублирующих. Именно так действует
естественное соединение.
Определение.
Пусть даны отношения
A(A1,A2,…,An,X1,X2,…Xp)
и B(X1,X2,…,Xp,B1,B2,…Bm),
имеющие
одинаковые атрибуты
X1,X2,…,Xp
(т.е. атрибуты с одинаковыми именами и определенные на одинаковых доменах).
Тогда естественным соединением отношений
A
и
B
называется отношение с заголовком (A1,A2,…,An,X1,X2,…Xp,B1,B2,…Bm)
и телом, содержащим множество кортежей (a1,a2,…,an,x1,x2,…xp,b1,b2,…bm),
таких, что (a1,a2,…,an,x1,x2,…xp)
Î
A
и (x1,x2,…xp,b1,b2,…bm)
ÎB.
Естественное соединение настолько важно, что для него
используют специальный синтаксис:
A
JOIN
B
Замечание.
В синтаксисе
естественного соединения не указываются, по каким атрибутам производится
соединение. Естественное соединение производится по всем одинаковым
атрибутам.
Замечание.
Естественное соединение эквивалентно следующей
последовательности
реляционных операций:
-
Переименовать
одинаковые атрибуты в отношениях.
-
Выполнить
декартово произведение отношений.
-
Выполнить выборку
по совпадающим значениям атрибутов, имевших одинаковые имена.
-
Выполнить
проекцию, удалив повторяющиеся атрибуты.
-
Переименовать
атрибуты, вернув им первоначальные имена.
Замечание.
Можно
выполнять последовательное естественное соединение нескольких отношений.
Естественное соединение (как и соединение общего вида) обладает свойством
ассоциативности, т.е.
(A JOIN B) JOIN
C = A JOIN (B JOIN C)
поэтому такие соединения можно
записывать,
опуская скобки:
A JOIN B JOIN C
Пример.
В предыдущем примере
ответ на вопрос "какие детали поставляются
поставщиками",
более просто записывается в виде естественного
соединения
трех отношений
P
JOIN
PD
JOIN
D
(для удобства просмотра порядок атрибутов изменен, это является допустимым по
свойствам отношений).
Таблица 25. Отношение P JOIN
PD JOIN D
Номер поставщика
PNUM |
Наименование поставщика
PNAME |
Номер детали
DNUM |
Наименование детали
DNAME |
Поставляемое количество
VOLUME |
1 |
Иванов |
1 |
Болт |
100 |
1 |
Иванов |
2 |
Гайка |
200 |
1 |
Иванов |
3 |
Винт |
300 |
2 |
Петров |
1 |
Болт |
150 |
2 |
Петров |
2 |
Гайка |
250 |
3 |
Сидоров |
1 |
Болт |
1000 |
Определение.
Пусть даны отношения
A(X1,X2,…,Xn,Y1,Y2,…,Ym)
и B(Y1,Y2,…,Ym),
причем атрибуты
Y1,Y2,…,Ym –
общие для двух отношений. Делением отношений
A на
B
называется отношение с
заголовком (X1,X2,…,Xn)
и телом, содержащим множество кортежей (x1,x2,…,xn),
таких, что для всех кортежей (y1,y2,…,ym)
Î
B в
отношении
A
найдется кортеж (x1,x2,…,xn,y1,y2,…,ym)
Отношение
A
выступает в роли делимого, отношение
B
выступает в роли делителя.
Деление
отношений аналогично делению чисел с остатком. Синтаксис операции деления:
A
DEVIDBY
B
Замечание.
Типичные
запросы, реализуемые с помощью операции деления, обычно в своей формулировке
имеют слово "все". Например, "какие поставщики поставляют все детали?".
Пример.
В примере с поставщиками, деталями и поставками ответим на вопрос, "какие
поставщики поставляют все детали?".
В
качестве делимого возьмем
проекцию X=PD[PNUM,DNUM], содержащую номера поставщиков и номера
поставляемых ими деталей.
Таблица 26. Проекция
X=PD[PNUM,DNUM]
Номер поставщика
PNUM |
Номер детали
DNUM |
1 |
1 |
1 |
2 |
1 |
3 |
2 |
1 |
2 |
2 |
3 |
1 |
В
качестве делителя возьмем
проекцию Y=D[DNUM], содержащую список номеров всех деталей (не
обязательно поставляемых кем-либо):
Таблица 27. Проекция
Y=D[DNUM]
Деление
X
DEVIDEBY
Y дает
список номеров поставщиков, поставляющих все детали.
Таблица 28. Отношение X
DEVIDEBY Y
Оказалось,
что
только поставщик с номером 1 поставляет все детали.
Пример.
Рассмотрим еще один пример
деления. Предположим, что в базе данных сотрудников поддерживаются два
отношения: СОТРУДНИКИ (ИМЯ, ОТД_НОМЕР) и ИМЕНА (ИМЯ), причем унарное отношение
ИМЕНА содержит все фамилии, которыми обладают сотрудники организации. Тогда
после выполнения операции реляционного деления отношения СОТРУДНИКИ на отношение
ИМЕНА будет получено унарное отношение, содержащее номера отделов, сотрудники
которых обладают всеми возможными в этой организации именами.
Не все операторы реляционной алгебры являются независимыми –
некоторые из них выражаются через другие реляционные операторы.
Оператор соединения
определяется через операторы декартового произведения и выборки. Для оператора
естественного соединения добавляется оператор проекции.
Оператор пересечения
выражается через вычитание следующим образом:
A INTERSECT B =
A MINUS (A MINUS B)
Оператор деления
выражается через операторы вычитания, декартового произведения и проекции
следующим образом:
A DEVIDEBY B =
A[X] MINUS ((A[X] TIMES B) MINUS A) [X]
Оставшиеся реляционные операторы (объединение, вычитание,
декартово произведение, выборка, проекция) являются примитивными операторами –
их нельзя выразить друг через друга.
Оператор декартового
произведения – это
единственный оператор, увеличивающий количество атрибутов, поэтому его нельзя
выразить через объединение, вычитание, выборку, проекцию.
Оператор проекции
– единственный оператор, уменьшающий количество атрибутов, поэтому его нельзя
выразить через объединение, вычитание, декартово произведение, выборку.
Оператор выборки
– единственный оператор, позволяющий проводить сравнения по атрибутам отношения,
поэтому его нельзя выразить через объединение, вычитание, декартово
произведение, проекцию.
4.4.
Реляционное исчисление
Предположим, что мы работаем
с базой данных, обладающей схемой СОТРУДНИКИ (СОТР_НОМ, СОТР_ИМЯ, СОТР_ЗАРП,
ОТД_НОМ) и ОТДЕЛЫ (ОТД_НОМ, ОТД_КОЛ, ОТД_НАЧ), и хотим узнать имена и номера
сотрудников, являющихся начальниками отделов с количеством сотрудников больше
50.
Если бы для формулировки
такого запроса использовалась реляционная алгебра, то мы получили бы
алгебраическое выражение, которое читалось бы, например, следующим образом:
-
выполнить
соединение отношений СОТРУДНИКИ и ОТДЕЛЫ по условию СОТР_НОМ = ОТД_НАЧ;
-
ограничить
полученное отношение по условию ОТД_КОЛ > 50;
-
спроецировать
результат предыдущей операции на атрибут СОТР_ИМЯ, СОТР_НОМ.
Мы четко сформулировали
последовательность шагов выполнения запроса, каждый из которых соответствует
одной реляционной операции. Если же сформулировать тот же запрос с
использованием реляционного исчисления, то мы получили бы формулу, которую можно
было бы прочитать, например, следующим образом:
Выдать СОТР_ИМЯ и СОТР_НОМ
для сотрудников таких, что существует отдел с таким же значением ОТД_НАЧ и
значением ОТД_КОЛ большим 50.
Во второй формулировке мы
указали лишь характеристики результирующего отношения, но ничего не сказали о
способе его формирования. В этом случае система должна сама решить, какие
операции и в каком порядке нужно выполнить над отношениями СОТРУДНИКИ и ОТДЕЛЫ.
Обычно говорят, что алгебраическая формулировка является процедурной, т.е.
задающей правила выполнения запроса, а логическая – описательной (или
декларативной), поскольку она всего лишь описывает свойства желаемого
результата. Как мы указывали в начале лекции, на самом деле эти два механизма
эквивалентны и существуют не очень сложные правила преобразования одного
формализма в другой.
Реляционное исчисление
является прикладной ветвью формального механизма исчисления предикатов первого
порядка. Базисными понятиями исчисления являются понятие переменной с
определенной для нее областью допустимых значений и понятие правильно
построенной формулы, опирающейся на переменные, предикаты и кванторы.
В зависимости от того, что
является областью определения переменной, различаются исчисление кортежей и
исчисление доменов. В исчислении кортежей областями определения
переменных являются отношения базы данных, т.е. допустимым значением каждой
переменной является кортеж некоторого отношения.
В исчислении доменов
областями определения переменных являются домены, на которых определены атрибуты
отношений базы данных, т.е. допустимым значением каждой переменной является
значение некоторого домена.
Для определения кортежной
переменной используется оператор RANGE. Например, для того, чтобы определить
переменную СОТРУДНИК, областью определения которой является отношение
СОТРУДНИКИ, нужно употребить конструкцию
RANGE СОТРУДНИК IS
СОТРУДНИКИ
Из этого определения следует,
что в любой момент времени переменная СОТРУДНИК представляет некоторый кортеж
отношения СОТРУДНИКИ. При использовании кортежных переменных в формулах можно
ссылаться на значение атрибута переменной. Например, для того, чтобы сослаться
на значение атрибута СОТР_ИМЯ переменной СОТРУДНИК, нужно употребить конструкцию
СОТРУДНИК.СОТР_ИМЯ.
Правильно построенные
формулы (WFF – Well-Formed Formula)
служат для выражения условий, накладываемых на кортежные переменные. Основой WFF
являются простые сравнения (comparison), представляющие собой операции
сравнения скалярных значений (значений атрибутов переменных или литерально
заданных констант). Например, конструкция "СОТРУДНИК.СОТР_НОМ = 140" является
простым сравнением. По определению, простое сравнение является WFF, а WFF,
заключенная в круглые скобки, является простым сравнением.
Более сложные варианты WFF
строятся с помощью логических связок NOT, AND, OR и IF ...
THEN.
Так,
если
form – WFF, а
comp – простое
сравнение,
то
NOT form, comp AND form, comp OR form
и
IF comp THEN form
являются
WFF.
Наконец, допускается
построение WFF с помощью кванторов. Если form – это WFF, в которой
участвует переменная var, то конструкции EXISTS var (form) и FORALL var (form)
представляют wff.
Переменные, входящие в WFF,
могут быть свободными или связанными. Все переменные, входящие в WFF, при
построении которой не использовались кванторы, являются свободными. Фактически,
это означает, что если для какого-то набора значений свободных кортежных
переменных при вычислении WFF получено значение true, то эти значения кортежных
переменных могут входить в результирующее отношение. Если же имя переменной
использовано сразу после квантора при построении WFF вида EXISTS var (form) или
FORALL var (form), то в этой WFF и во всех WFF, построенных с ее участием, var –
это связанная переменная. Это означает, что такая переменная не видна за
пределами минимальной WFF, связавшей эту переменную. При вычислении значения
такой WFF используется не одно значение связанной переменной, а вся ее область
определения.
Пусть СОТР1 и СОТР2 – две
кортежные переменные, определенные на отношении СОТРУДНИКИ. Тогда, WFF EXISTS
СОТР2 (СОТР1.СОТР_ЗАРП > СОТР2.СОТР_ЗАРП) для текущего кортежа переменной СОТР1
принимает значение true в том и только в том случае, если во всем отношении
СОТРУДНИКИ найдется кортеж (связанный с переменной СОТР2) такой, что значение
его атрибута СОТР_ЗАРП удовлетворяет внутреннему условию сравнения. WFF FORALL
СОТР2 (СОТР1.СОТР_ЗАРП > СОТР2.СОТР_ЗАРП) для текущего кортежа переменной СОТР1
принимает значение true в том и только в том случае, если для всех кортежей
отношения СОТРУДНИКИ (связанных с переменной СОТР2) значения атрибута СОТР_ЗАРП
удовлетворяют условию сравнения.
На самом деле, правильнее
говорить не о свободных и связанных переменных, а о свободных и связанных
вхождениях переменных. Легко видеть, что если переменная var является связанной
в WFF form, то во всех WFF, включающих данную, может использоваться имя
переменной var, которая может быть свободной или связанной, но в любом случае не
имеет никакого отношения к вхождению переменной var в WFF form. Например:
EXISTS СОТР2
(СОТР1.СОТР_ОТД_НОМ = СОТР2.СОТР_ОТД_НОМ) AND FORALL СОТР2 (СОТР1.СОТР_ЗАРП >
СОТР2.СОТР_ЗАРП)
Видно два связанных вхождения
переменной СОТР2 с совершенно разным смыслом.
Итак, WFF обеспечивают
средства формулировки условия выборки из отношений БД. Чтобы можно было
использовать исчисление для реальной работы с БД, требуется еще один компонент,
который определяет набор и имена столбцов результирующего отношения. Этот
компонент называется целевым списком (target_list).
Целевой список строится из
целевых элементов, каждый из которых может иметь следующий вид:
-
var.attr, где
var – имя свободной переменной, соответствующей WFF, а attr – имя атрибута
отношения, на котором определена переменная var;
-
var, что
эквивалентно наличию подсписка var.attr1, var.attr2, ...,
var.attrn, где attr1, attr2, ..., attrn
включает имена всех атрибутов определяющего отношения;
-
new_name =
var.attr; new_name – новое имя соответствующего атрибута результирующего
отношения.
Последний вариант требуется в
тех случаях, когда в WFF используются несколько свободных переменных с
одинаковой областью определения.
Выражением реляционного
исчисления кортежей называется конструкция вида target_list WHERE wff. Значением
выражения является отношение, тело которого определяется WFF, а набор атрибутов
и их имена - целевым списком.
В исчислении доменов
областью определения переменных являются не отношения, а домены. Применительно к
базе данных СОТРУДНИКИ-ОТДЕЛЫ можно говорить, например, о доменных переменных
ИМЯ (значения – допустимые имена) или НОСОТР (значения – допустимые номера
сотрудников).
Основным формальным отличием
исчисления доменов от исчисления кортежей является наличие дополнительного
набора предикатов, позволяющих выражать так называемые условия членства. Если R
– это n-арное отношение с атрибутами a1, a2, ..., an,
то условие членства имеет вид
R (ai1:vi1,
ai2:vi2, ..., aim:vim) (m <= n),
где vij – это либо
литерально задаваемая константа, либо имя кортежной переменной.
Условие членства принимает
значение true в том и только в том случае, если в отношении R существует кортеж,
содержащий указанные значения указанных атрибутов. Если vij –
константа, то на атрибут aij задается жесткое условие, не зависящее
от текущих значений доменных переменных. Если vij – имя доменной
переменной, то условие членства может принимать разные значения при разных
значениях этой переменной.
Во всех остальных отношениях
формулы и выражения исчисления доменов выглядят похожими на формулы и выражения
исчисления кортежей. В частности, конечно, различаются свободные и связанные
вхождения доменных переменных.
Для примера, сформулируем с
использованием исчисления доменов запрос "Выдать номера и имена сотрудников, не
получающих минимальную заработную плату" (будем считать для простоты, что мы
определили доменные переменные, имена которых совпадают с именами атрибутов
отношения СОТРУДНИКИ, а в случае, когда требуется несколько доменных переменных,
определенных на одном домене, мы будем добавлять в конце имени цифры):
СОТР_НОМ, СОТР_ИМЯ WHERE
EXISTS СОТР_ЗАРП1
(СОТРУДНИКИ (СОТР_ЗАРП1)
AND
СОТРУДНИКИ (СОТР_НОМ,
СОТР_ИМЯ, СОТР_ЗАРП) AND
СОТР_ЗАРП > СОТР_ЗАРП1)
Реляционное исчисление
доменов является основой большинства языков запросов, основанных на
использовании форм. В частности, на этом исчислении базировался известный язык
Query-by-Example, который был первым (и наиболее интересным) языком в
семействе языков, основанных на табличных формах.
|