
- •Isbn 5-8459-0138-3 (рус) isbn 0-201-38590-2 (англ)
- •Глава 2. Архитектура системы баз данных 65
- •Глава 6. Реляционная алгебра 192
- •Глава 7. Реляционное исчисление 243
- •Глава 8. Целостность данных 301
- •Глава 9. Представления 350
- •Часть 111
- •Часть IV
- •Глава 14. Восстановление 544 14.1. Введение 544
- •Глава 15. Параллельность 566
- •Часть V
- •Глава 16. Защита данных 602
- •Глава 17. Оптимизация 639
- •Глава 18. Отсутствующая информация 693
- •Глава 19. Наследование типов 725
- •Глава 20. Распределенные базы данных 767
- •Глава 21. Поддержка принятия решений 813
- •Глава 22. Хронологические базы данных 853
- •Глава 23. Логические системы управления базами данных 899
- •Часть VI
- •Глава 24. Объектные базы данных 944
- •Глава 25. Объектно-реляционные базы данных 999
- •Часть I (четыре главы) — это обширное введение в теорию баз данных вообще и реляционных баз данных в частности. Здесь также излагаются основы стандартно- го языка баз данных sql.
- •Часть IV. Две главы данной части — это несколько пересмотренные и расширен- ные версии глав 13 и 14 предыдущего издания.
- •Часть VI. Глава 24 является полностью переписанной и значительно улучшенной версией глав 22-24. Глава 25 почти полностью обновлена.
- •Часть I
- •Часть I состоит из четырех вводных глав.
- •1.1. Вводный пример
- •1.2. Что такое система баз данных
- •1.3. Что такое база данных Перманентные данные
- •1.4. Назначение баз данных
- •1.5. Независимость данных
- •1.6. Реляционные и другие системы
- •1.7. Резюме
- •2.1. Введение
- •2.2. Три уровня архитектуры
- •Внешний уровень (представления отдельных пользователей)Концептуальный уровень (обобщенное представление пользователей)
- •2.3. Внешний уровень
- •Отображение "внешний/концептуальный" схемы
- •Определение структур хранения (внутренняя схема)
- •Внешнее представление а Концептуальная схема
- •2.4. Концептуальный уровень
- •2.5. Внутренний уровень
- •2.6. Отображения
- •2.7. Администратор базы данных
- •2.8. Система управления базой данных
- •2.9. Система управления передачей данных
- •2.10. Архитектура "клиент/сервер"
- •2.11. Утилиты
- •2.12. Распределенная обработка
- •2.13. Резюме
- •3.1. Введение
- •3.2. Реляционная модель
- •3.3. Отношения и переменные-отношения
- •3.4. Смысл отношений
- •3.5. Оптимизация
- •3.6. Каталог
- •3.7. Базовые переменные-отношения и представления
- •3.8. Транзакции
- •3.9. База данных поставщиков и деталей
- •3.10. Резюме
- •Глава 4
- •4.1. Введение
- •4.2. Обзор языка sql
- •4.3. Каталог
- •4.4. Представления
- •4.5. Транзакции
- •4.6. Внедрение sql-операторов
- •4.7. Несовершенство языка sql
- •4.8. Резюме
- •Часть 9. Управление внешними данными (sql/med) Часть 10. Связь с объектным языком (sql/olb)
- •Часть II
- •Глава 5
- •5.1. Введение
- •5.2. Домены
- •5.3. Значения отношений
- •5.4. Переменные-отношения
- •5.5. Средства sql
- •5.6. Резюме
- •6.1. Введение
- •6.2. Реляционная замкнутость
- •6.3. Синтаксис
- •6.4. Семантика
- •6.5. Примеры
- •6.5.1. Получить имена поставщиков детали с номером 'р2'
- •6.5.2. Получить имена поставщиков по крайней мере одной красной детали
- •6.5.3. Получить имена поставщиков всех типов деталей
- •6.5.4. Получить номера поставщиков по крайней мере тех типов деталей, которые поставляет поставщик с номером 's2'
- •6.5.5. Получить все пары номеров поставщиков, находящихся в одном городе
- •6.5.6. Получить имена поставщиков, которые не поставляют деталь с номером 'р2'
- •6.6. Зачем нужна реляционная алгебра
- •6.7. Дополнительные операторы
- •6.8. Группирование и разгруппирование
- •6.9. Реляционные сравнения
- •6.10. Резюме
- •7.1. Введение
- •7.2. Исчисление кортежей
- •7.3. Примеры
- •7.3.5. Найти имена поставщиков по крайней мере одной детали, поставляемой поставщиком с номером 's2'
- •7.3.6. Выбрать имена поставщиков всех типов деталей
- •7.3.7. Определить имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.3.8. Определить номера поставщиков по крайней мере всех типов деталей, поставляемых поставщиком с номером *s2'
- •7.4. Сравнительный анализ реляционного исчисления и реляционной алгебры
- •7.5. Вычислительные возможности
- •7.5.1. Определить номера и вес в граммах всех типов деталей, вес которых превышает 10 ооо г
- •7.6.1. Выбрать номера поставщиков из Парижа со статусом, большим 20
- •7.7.1. Указать цвета деталей и названия городов, в которых находятся детали "не из Парижа" с весом, превышающим 10 фунтов
- •7.7.2. Для всех деталей указать номер и вес в граммах
- •7.7.3. Выбрать информацию обо всех парах поставщиков и деталей, находящихся в одном городе
- •7.7.4. Найти все пары названий городов, таких, что поставщик из первого города поставляет деталь, находящуюся во втором городе
- •7.7.5. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся
6.4. Семантика
В этом разделе мы дадим толкование приведенного в разделе 6.3 синтаксиса и обсудим некоторые конкретные примеры. Операторы будут рассматриваться в такой последовательности: объединение, пересечение, вычитание, произведение, выборка, проекция, естественное соединение и деление (оператор RENAME уже рассматривался в разделе 6.2).
Объединение
В математике объединением двух множеств называется множество, состоящее из всех элементов, принадлежащих хотя бы одному из исходных множеств. Поскольку от- ношение является множеством (точнее, содержит множество), а именно — множеством кортежей, очевидно, что можно получить объединение двух таких множеств. Результа- том выполнения этой операции будет множество, состоящее из всех кортежей, которые принадлежат хотя бы одному из исходных отношений. Например, объединение множе- ства кортежей описания поставщиков переменной-отношения S и множества кортежей описания деталей переменной-отношения Р, определенно, будет множеством.
Однако, хотя результатом объединения является множество, оно не всегда будет от- ношением, поскольку в отношении не может быть кортежей разных типов. Нам же, без- условно, требуется, чтобы результатом операции объединения обязательно было отно- шение, поскольку необходимо соблюдать свойство реляционной замкнутости. Поэтому объединение в реляционной алгебре — это не обычное математическое объединение, а, скорее, специальный вид объединения, требующий, чтобы отношения на входе были со- вместимы по типу, т.е. чтобы, например, оба отношения содержали кортежи поставщи- ков или кортежи деталей, но не комбинацию этих типов кортежей. Если два исходных отношения совместимы по типу, то результат их объединения также будет отношением и свойство замкнутости будет сохранено2.
Теперь дадим точное определение оператора реляционного объединения. Для задан- ных отношений А и В одного и того же типа объединением этих двух отношений (что за- писывается как A UNION В) называется новое отношение того же типа с телом, состоя- щим из множества всех кортежей t, которые принадлежат либо отношению А, либо от- ношению В, либо обоим отношениям одновременно.
Пример. Пусть отношения А и В будут такими, как показано на рис. 6.2 (отношение А представляет поставщиков из Лондона, а отношение В — поставщиков, которые, скажем, поставляют деталь под номером 'Р1'). Тогда выражение A UNION В (см. рис. 6.2, а) представляет поставщиков, которые или находятся в Лондоне, или поставляют деталь под номером 'Р1' (или и то, и другое). Обратите внимание, что результат имеет три кор- тежа, а не четыре — повторяющиеся кортежи удаляются по определению. Вопрос удале- ния дубликатов не возникает в других традиционных операциях над множествами. Фак- тически еще существует только одна операция (помимо объединения), где этот вопрос актуален, — операция проекции (подробнее о ней речь идет далее в этом разделе).
|
А В |
| ||||||||
|
S# |
SNAME |
STATUS |
CITY |
|
S# |
SNAME |
STATUS |
CITY |
|
SI S4 |
Smith Clark |
20 20 |
London London |
|
SI S2 |
Smith Jones |
20 10 |
London Paris | ||
|
|
| ||||||||
|
|
| ||||||||
а) Объединение (A UNION В) |
S# |
SNAME |
STATUS |
CITY |
| |||||
SI S4 S2 |
Smith Clark Jones |
20 20 10 |
London London Paris | |||||||
|
|
| ||||||||
|
|
| ||||||||
б) Пересечение (A INTERSECT В) |
S# |
SNAME |
STATUS |
CITY |
| |||||
SI |
Smith |
20 |
London | |||||||
|
|
| ||||||||
|
в) Вычитание (A MINUS В) |
|
г) Вычитание (В MINUS A) |
| ||||||
|
S# |
SNAME |
STATUS |
CITY |
|
S# |
SNAME |
STATUS |
CITY |
|
1 |
S4 |
Clark |
20 |
London |
S2 |
Jones |
10 |
Paris | ||
1 |
|
|
|
|
Рис. 6.2. Примеры операций объединения, пересечения и вычитания
Пересечение
Как и для оператора объединения, для реляционного оператора пересечения (и по тем же причинам) необходимо, чтобы его операнды были совместимы по типу. Итак, пересе- чением двух совместимых по типу отношений А и В (что записывается как A INTERSECT В) называется отношение того же типа с телом, состоящим из множества всех кортежей t, ко- торые принадлежат одновременно обоим исходным отношениям А и В.
Пример. Пусть вновь отношения А и В будут такими, как показано на рис. 6.2. Тогда выражение A INTERSECT В (см. рис. 6.2, б) представляет поставщиков, которые находят- ся в Лондоне и поставляют деталь под номером 'Р1'.
Вычитание
Как и для операторов объединения и пересечения, для реляционного оператора вычи- тания необходимо, чтобы его операнды были совместимы по типу. Тогда вычитанием двух совместимых по типу отношений А и В (что записывается как A MINUS В, причем
порядок их указания здесь играет роль) называется отношение того же типа, что и отно- шения А и В, с телом, состоящим из множества всех кортежей t, которые принадлежат отношению А, но не принадлежат отношению В.
Пример. Пусть еще раз отношения А и В будут такими, как показано на рис. 6.2. Тогда выражение A MINUS В (см. рис. 6.2, в) представляет поставщиков, которые находятся в Лондоне и не поставляют деталь под номером 'Р1', а выражение В MINUS А (см. рис. 6.2, г) представляет поставщиков, которые поставляют деталь под номером ' Р1' и не находятся в Лондоне. Заметьте, что при вычитании учитывается порядок следования операндов, точно так, как в обычной арифметике (например, 5-2и2-5 — это не одно и то же).
Произведение
В математике декартово произведение (или для краткости— просто произведение) двух множеств является множеством всех таких упорядоченных пар элементов, что пер- вый элемент в каждой паре берется из первого множества, а второй элемент в каждой паре берется из второго множества. Следовательно, декартово произведение двух отно- шений должно быть множеством упорядоченных пар кортежей. Но, опять-таки, необ- ходимо сохранить свойство замкнутости; иначе говоря, результат должен содержать кор- тежи, а не упорядоченные пары кортежей. Поэтому версия декартова произведения в ре- ляционной алгебре представляет собой расширенную форму операции, в которой каждая упорядоченная пара кортежей заменяется одним кортежем, образованным из двух сцеп- ленных кортежей этой пары. "Сцепление" здесь означает объединение (в смысле теории множеств, а не реляционной алгебры), т.е. кортежи { Altai, A2ta2, Amtam }и{
Bltbl, B2:b2, Bntbn } объединяются в один кортеж.
{ Altai, A2ta2, Amtam, Bltbl, B2tb2, Bntbn }
Другая проблема, возникающая в связи с декартовым произведением, заключается в том, что результирующее отношение должно иметь правильно сформированный заголовок. Очевидно, что заголовок результирующего отношения должен содержать все атрибуты из двух исходных отношений. Однако, если эти два заголовка имеют какие-то общие имена атрибутов, возникает проблема. Если допустить подобную операцию, то результирующий заголовок будет иметь два одинаковых атрибута, а значит, будет "неверно сформированным". Поэтому, чтобы построить декартово произведение двух отношений, которые имеют какие-то общие имена атрибутов, не- обходимо прежде применить оператор RENAME для переименования соответствующих атрибутов.
В результате можно определить (реляционное) декартово произведение двух отно- шений А и В (что записывается как A TIMES В), где отношения А и В не имеют общих имен атрибутов, как новое отношение с заголовком, представляющим собой объедине- ние заголовков двух исходных отношений А и В, и с телом, состоящим из множества всех кортежей t, таких, что каждый кортеж t представляет собой объединение двух кортежей, один из которых принадлежит отношению А, а другой — отношению В. Обратите внима- ние, что кардинальность результата равняется произведению кардинальностей исходных отношений А и В, а степень равняется сумме их степеней.
Пример. Пусть отношения А и В будут такими, как показано на рис. 6.3 (отношение А представляет, например, номера всех существующих на данный момент поставщиков, а отношение В — номера всех поставляемых на текущий момент деталей). Тогда произве- дение A TIMES В — это набор всех возможных на текущий момент пар из значений но- мера поставщика и номера детали.
A SJ^ SI S2 S3 S4 S5
В
p# PI
P2 P3 P4 P5 P6
Декартово произведение (A TIMES B)
s# |
p# |
si |
PI |
si |
P2 |
SI |
P3 |
SI |
P4 |
SI |
P5 |
SI |
P6 |
S2 |
PI |
|
S3 |
PI |
|
S4 |
PI |
S2 |
P2 |
|
S3 |
P2 |
|
S4 |
P2 |
S2 |
P3 |
|
S3 |
P3 |
|
S4 |
P3 |
S2 |
P4 |
|
S3 |
P4 |
|
S4 |
P4 |
S2 |
P5 |
|
S3 |
P5 |
|
S4 |
P5 |
S2 |
P6 |
|
S3 |
P6 |
|
S4 |
P6 |
S5 |
PI |
S5 |
P2 |
S5 |
P3 |
S5 |
P4 |
S5 |
P5 |
S5 |
P6 |
Рис. 6.3. Пример операции декартова произведения
Выборка
Пусть задано отношение А с атрибутами X и У (и, возможно, с другими атрибутами), а символ в обозначает любой скалярный оператор сравнения (=, >, > и т.д.), такой, что условие X G Y корректно определено и при заданных значениях атрибутов X и Y его проверка дает значение истина или ложь. Тогда ©-выборкой из отношения А по атри- бутам X и Y (что записывается, например, как S WHERE CITY = 'London', причем именно в этом порядке) называется отношение, имеющее тот же заголовок, что и отношение А, и тело, содержащее множество всех кортежей t отношения А, для которых проверка усло- вия X в Y дает значение истина.
Необходимо отметить следующее.
1. Обращение к оператору выбора, в частности литерал, может быть указано как вме- сто атрибута X, так и вместо атрибута Y (или вместо обоих); на практике это обыч- ный случай. Тем не менее этот "обычный случай" следует рассматривать всего лишь как сокращение. Например, оператор выборки
S WHERE CITY = 'London',
по сути, является всего лишь сокращенной записью следующего выражения: { EXTEND S ADD 'London' AS TEMP ) WHERE CITY = TEMP
(здесь имя TEMP может быть произвольным). Оператор EXTEND будет рассмотрен в разделе 6.7.
\2. Условия в форме b (где b — обращение к оператору логического выбора) являются допустимыми.
3. В приведенном определении операции выборки в выражении WHERE допускаются только единичные операции сравнения. Однако на основании свойства замкнутости можно недвусмысленно расширить определение до такой формы, в которой усло- вие в выражении WHERE будет содержать произвольное число логических сочетаний подобных единичных сравнений благодаря следующим тождествам.
A WHERE cl AND с2 з (A WHERE cl ) INTERSECT ( A WHERE с2 ) A WHERE cl OR с2 = ( A WHERE cl ) UNION ( A WHERE c2 ) A WHERE NOT с = A MINUS ( A WHERE С )
Поэтому впредь мы будем подразумевать, что параметр <логическое выражение> в предложении WHERE для операции выборки содержит произвольное число логических сочетаний единичных сравнений (с использованием круглых скобок, если необходи- мо указать желаемый порядок вычисления), где каждое единичное сравнение, в свою очередь, включает либо атрибуты указанного отношения, либо обращение к операто- ру выборки, либо и то, и другое. Обратите внимание, что значение параметра Логическое выражениё> может быть истолковано как истина или ложь для каждого заданного кортежа в отдельности независимо от остальных. Описанное выше значе- ние параметра <логическое выражениё> принято называть условием выборки.
В результате выполнения оператора выборки будет получено "горизонтальное" под- множество заданного отношения, т.е. такое подмножество кортежей заданного отноше- ния, для которого удовлетворяется указанное условие выборки. На рис. 6.4 приводится несколько примеров операции выборки.
S WHERE CITY = 'London' |
S# |
SNAME |
STATUS |
CITY |
|
SI |
Smith |
20 |
London |
|
S4 |
Clark |
20 |
London |
P WHERE WEIGHT < |
P# |
PNAME |
COLOR |
WEIGHT |
CITY |
WEIGHT (14.0) |
PI |
Nut |
Red |
12.0 |
London |
|
P5 |
Cam |
Blue |
12.0 |
Paris |
SP WHERE S# - S# ( 'S6' ) OR P# - P# ( 'P7' )
S# |
P# |
QTY |
|
|
|
Puc. 6.4. Примеры операций выборки
Проекция
Пусть задано отношение А с атрибутами X, Y, ... , Z (и, возможно, с другими). То- гда проекцией отношения А по атрибутам X, У, ... , Z (что записывается как А { X, Y, ... , Z }) называется отношение, удовлетворяющее следующим требованиям.
■ Его заголовок получается из заголовка отношения А посредством удаления из него всех атрибутов, не входящих в множество {X, Y, ... , Z}.
■ Его тело содержит множество всех кортежей вида {X:x, Y:y, ... , Z:z}, таких, для которых в отношении А значение атрибута X равно х, значение атрибута Y рав- но у значение атрибута Z равно г.
Таким образом, с помощью оператора проекции создается "вертикальное" подмноже- ство заданного отношения, т.е. подмножество, получаемое путем исключения всех атри- бутов, не указанных в заданном списке атрибутов, с последующим исключением дубли- рующихся кортежей (подкортежей) из того, что осталось от исходного отношения.
Из этого определения можно сделать следующие выводы.
Никакой атрибут не может быть указан в списке атрибутов более одного раза (почему?).
Если в списке атрибутов указаны все атрибуты отношения А, то такая проекция представляет собой тождественную проекцию.
Проекция вида А{ } (т.е. такая, в которой список атрибутов пуст) также допустима. Она представляет собой нулевую проекцию. Подробности приводятся в упр. 6.8- 6.10 в конце этой главы.
Несколько примеров операции проекции показано на рис. 6.5. Обратите внимание, что в первом примере (проекция отношения поставщиков по атрибуту CITY), несмотря на то что исходное отношение S имеет пять кортежей (и, следовательно, пять значений городов), в результирующем отношении присутствует только три города, поскольку дублирующиеся кортежи исключены. Аналогичные замечания можно сделать и для других примеров.
S {CITY }
CITY
London
Paris
Athens
P { COLOR, CITY }
COLOR |
CITY |
Red |
London |
Green |
Paris |
Blue |
Rome |
Blue |
Paris |
( S WHERE CITY = 'PARIS' ) { S# }
S#
S2 S3
Рис. 6.5. Примеры операций проекции
Отметим, что часто на практике удобно указывать не те атрибуты, по которым берет- ся проекция, а те, которые проекцией "отбрасываются". Например, удобнее сказать "проекция, исключающая из отношения Р атрибут WEIGHT " вместо "проекция отношения Р по атрибутам PI, PNAME, COLOR и CITY".
Р { ALL BUT WEIGHT }
Соединение
Операция соединения имеет несколько разновидностей. Однако наиболее важным, без со- мнения, является естественное соединение, причем настолько важным, что общий термин соединение почти всегда используется для обозначения именно естественного соединения. Этой практики мы будем придерживаться и в данной книге. Далее приводится определение (оно несколько абстрактное, но мы считаем, что читатели уже знают о естественном соедине- нии на интуитивно понятном уровне из главы 3). Пусть отношения А и В имеют заголовки
{ XI, Х2, ... , Xm, Yl, Y2, ... , Yn }
и
{ Yl, Y2, ... , Yn, Zl, Z2, ... , Zp }
соответственно, т.е. атрибуты Yl, Y2, ... , Yn (и только они) — общие для двух этих от- ношений, XI, Х2, ... , Xm — остальные атрибуты отношения А и Zl, Z2, ... , Zp — ос- тальные атрибуты отношения В. Далее мы будем рассматривать выражения {XI, Х2, ... , Xm}, {Yl, Y2, ... , Уп}и{21, Z2, ... , Zp} как три составных атрибута X, У и Z соответ- ственно. Тогда естественным соединением отношений А и В (что записывается как A JOIN В) называется отношение с заголовком {X, Y, Z} и телом, содержащим множество всех кортежей вида {Х:х, У:у, Z:z}, таких, для которых в отношении А значение атрибута X равно х, а значение атрибута У равно у и в отношении В значение атрибута У равно у, а зна- чение атрибута Z равно г.
Пример естественного соединения (естественное соединение S JOIN Р по общему ат- рибуту СИУ) приведен на рис. 6.6.
s# |
SNAME |
STATUS |
CITY |
P# |
PNAME |
COLOR |
WEIGHT |
SI |
Smith |
20 |
London |
PI |
Nut |
Red |
12.0 |
SI |
Smith |
20 |
London |
P4 |
Screw |
Red |
14.0 |
SI |
Smith |
20 |
London |
P6 |
Cog |
Red |
19.0 |
S2 |
Jones |
10 |
Paris |
P2 |
Bolt |
Green |
17.0 |
S2 |
Jones |
10 |
Paris |
P5 |
Cam |
Blue |
12.0 |
S3 |
Blake |
30 |
Paris |
P2 |
Bolt |
Green |
17.0 |
S3 |
Blake |
30 |
Paris |
P5 |
Cam |
Blue |
12.0 |
S4 |
Clark |
20 |
London |
PI |
Nut |
Red |
12.0 |
S4 |
Clark |
20 |
London |
P4 |
Screw |
Red |
14.0 |
S4 |
Clark |
20 |
London |
P6 |
Cog |
Red |
19.0 |
Рис. 6.6. Естественное соединение S JOIN P
Замечание. Хотелось бы еще раз остановиться на том факте (хотя это неоднократно отмечалось выше и явно показано на рис. 6.6), что соединения необязательно выполня- ются по внешнему ключу и соответствующему первичному ключу, хотя такие соедине- ния весьма распространены и являются важным частным случаем.
Теперь обратимся к операции ©-соединения. Она предназначается для тех случаев (сравнительно редких, но всем известных), когда нужно соединить два отношения на основе некоторых условий, отличных от эквивалентности. Пусть отношения А и В не имеют общих
имен атрибутов (как и в рассмотренной выше операции декартова произведения) и 0 опреде- ляется так же, как и в операции выборки. Тогда в-соединением отношения А по атрибуту X с отношением В по атрибуту Y называется результат вычисления следующего выражения.
( A TIMES В ) WHERE X © Y
Другими словами, в-соединение — это отношение с тем же заголовком, что и при декартовом произведении отношений А и В, и с телом, содержащим множество кортежей t, таких, что кортеж t принадлежит этому декартову произведению и вычисление усло- вия X © Y для кортежа t дает значение истина.
В качестве примера предположим, что необходимо вычислить "больше чем"- соединение отношения S по атрибуту CITY с отношением Р по атрибуту CITY (предполагается, что операция ">" имеет смысл для сравнения названий городов и ин- терпретируется просто как "далее в алфавитном порядке"). Соответствующим выраже- нием реляционной алгебры будет следующее.
( ( S RENAME CITY AS SCITY ) TIMES ( P RENAME CITY AS PCITY ) )
WHERE SCITY > PCITY
Обратите внимание на переименование атрибутов в этом примере. Конечно, доста- точно было бы переименовать лишь один из двух атрибутов CITY. Единственный смысл двойного переименования — это симметрия. Результат вычисления данного выражения показан на рис. 6.7.
s# |
SNAME |
STATUS |
SCITY |
P# |
PNAME |
COLOR |
WEIGHT |
PCITY |
S2 |
Jones |
10 |
Paris |
PI |
Nut |
Red |
12 |
London |
S2 |
Jones |
10 |
Paris |
P4 |
Screw |
Red |
14 |
London |
S2 |
Jones |
10 |
Paris |
P6 |
Cog |
Red |
19 |
London |
S3 |
Blake |
30 |
Paris |
PI |
Nut |
Red |
12 |
London |
S3 |
Blake |
30 |
Paris |
P4 |
Screw |
Red |
14 |
London |
S3 |
Blake |
30 |
Paris |
P6 |
Cog |
Red |
19 |
London |
Рис. 6.7. "Больше чем "-соединение отношений поставщиков и деталей по атрибуту на- звания города
Если условие © является условием "равно", то ©-соединение называется равно- соединением. Из определения следует, что результат равно-соединения должен вклю- чать два атрибута, значения которых должны быть равны в каждом кортеже отношения. Если исключить один из этих атрибутов (с помощью операции проекции), результатом будет обычное естественное соединение! Например, выражение, представляющее есте- ственное соединение отношений поставщиков и деталей (по атрибуту города) S JOIN Р, эквивалентно следующему более сложному выражению.
( ( S TIMES ( Р RENAME CITY AS PCITY ) )
WHERE CITY = PCITY )
{ ALL BUT CITY }
Замечание. В языке Tutorial D нет прямой поддержки оператора ©-соединения, по- скольку он не так уж часто используется на практике и, как мы уже видели, не является примитивным.
Деление
В [6.3] вводятся два разных оператора деления — Small Divide и Great Divide. В языке Tutorial D оператору <деление>, список <рег> которого состоит только из одного парамет- ра реляционное выражениё>, соответствует операция Small Divide, а оператору <деление>, список <рег> которого состоит из двух разделенных запятыми параметров реляционное выражениё>, соответствует операция Great Divide. Приведенное далее описание относится только к частному ограниченному случаю операции Small Divide. Оператор Great Divide и подробности, касающиеся операции Small Divide, приводятся в [6.3].
Необходимо сказать, что рассмотренная здесь версия оператора Small Divide отлича- ется от оригинального оператора, предложенного Коддом. Фактически это улучшенная версия, в которой исправлены недостатки, вызывавшие трудности при работе с пустыми отношениями. Данная версия также отличается от оператора Small Divide, рассмотрен- ного в нескольких первых изданиях настоящей книги.
Дадим теперь определение оператора деления. Пусть отношения А и В имеют заго- ловки {XI, Х2, ... , Xm } и { Yl, Y2, ... , Yn } соответственно (т.е. заголовки от- ношений А и В не пересекаются). Пусть также отношение С имеет следующий заголовок.
{ XI, Х2, ... , Xm, Yl, Y2, ... , Yn } .
(Иначе говоря, заголовок отношения С является объединением заголовков отноше- ний А и В.) Далее будем рассматривать множества { XI, Х2, ... , Xm } и { Yl, Y2, ... , Yn } как составные атрибуты X и Y соответственно. Тогда результатом деления отношения А на отношение В по отношению С (что записывается как A DIVIDEBY В PER С, где отношение А представляет собой делимое, отношение В — делитель, а от- ношение С— "посредник") называется отношение с заголовком {X} и телом, содер- жащим множество всех кортежей вида {Х:х}, таких, что кортеж вида {Х;х, Y:y} при- надлежит отношению В для всех кортежей вида {Y:y}, принадлежащих отношению В. Нестрого это можно сформулировать так: результат содержит такие Х-значения из от- ношения А, для которых соответствующие Y-значения из отношения С включают все Y-значения из отношения В.
На рис. 6.8 показаны некоторые простые примеры операции деления. В каждом слу- чае делимое (отношение DEND) — это проекция текущего значения переменной- отношения S по атрибуту Sf, посредник (MED) — это проекция текущего значения пере- менной-отношения SP по атрибутам S# и Р#, а три делителя (отношения DOR)— такие, как показано на рисунке. В частности, обратите внимание на последний пример, в кото- ром делителем является отношение, содержащее номера всех известных в данный мо- мент деталей. В результате, очевидно, получим номера поставщиков, поставляющих все типы этих деталей. Как видно из примера, оператор DIVIDEBY полезен именно для запро- сов такого рода. Более того, если запрос на обычном языке включает слово "все" ("определить поставщиков всех типов деталей"), то почти наверняка понадобится ис- пользовать операцию деления3. Тем не менее следует отметить, что подобные запросы удобнее записывать в терминах реляционных сравнений (раздел 6.9).
MED
S# SI S2 S3 S4 S5
s# |
p# |
SI |
PI |
SI |
P2 |
SI |
P3 |
SI |
P4 |
SI |
P5 |
SI |
P6 |
S2 |
PI |
S2 |
P2 |
S3 |
P2 |
S4 |
P2 |
S4 |
P4 |
S4 |
P5 |
DOR
P#
DOR
P#
DOR
P#
PI
P2 P4
PI P2 P3 P4 P5 P6
DEND DIVIDEBY DOR PER MED
S#
SI S2
S#
SI S4
S# SI
Рис. 6.8. Примеры операции деления
Ассоциативность и коммутативность
Легко проверить, что операция объединения (UNION) ассоциативна, т.е. если А, В и С — произвольные реляционные выражения (дающие совместимые по типу результаты), то приведенные ниже два выражения логически эквивалентны.
( A UNION В ) UNION С A UNION ( В UNION С )
Следовательно, для удобства можно разрешить запись последовательных операторов объединения без использования круглых скобок. Поэтому предыдущие выражения мож- но однозначно упростить следующим образом.
A UNION В UNION С
Аналогичные замечания можно сделать и для операций пересечения (INTERSECT), де- картова произведения (TIMES) и соединения (JOIN) (но не операции вычитания MINUS).
Заметим также, что операции объединения (UNION), пересечения (INTERSECT), декар- това произведения (TIMES) и соединения (JOIN) (но не операция вычитания MINUS) еще и коммутативны, т.е. выражения A UNION В и В UNION А эквивалентны, что справедливо и для операций пересечения, декартова произведения и соединения.
Замечание. К вопросу ассоциативности и коммутативности мы еще вернемся в гла- ве 17. А относительно операции декартова произведения мимоходом заметим, что в тео- рии множеств она не является ни ассоциативной, ни коммутативной, но ее расширенная версия, как мы ее здесь определили, и ассоциативна, и коммутативна.
Наконец, отметим, что если отношения А и В не имеют общих атрибутов, то операция A JOIN В эквивалентна операции A TIMES В [5.5], т.е. в таком случае естественное со- единение вырождается в декартово произведение. По этой причине в версии языка Tutorial D, описанной в [3.3] оператор TIMES не поддерживается.