- •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. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся
5.4. Переменные-отношения
Как уже говорилось в главе 3, существует две разновидности переменных-отношений (relation variable или кратко — relvar): базовые переменные-отношения и представления (которые иногда называют реальными и виртуальными переменными-отношениями со- ответственно). В этом разделе рассматриваются только базовые переменные-отношения. Представления будут обсуждаться в главе 9.
Определение базовых переменных-отношений
Базовые переменные-отношения определяются следующим образом.
VAR <имя переменной-отношения > BASE <тип отношение
<перечень определений потенциальных ключей> [ <переченъ определений внешних ключей> ] ;
Параметр <тип отношение имеет следующий вид. RELATION { <спнсок атрибутов> }
Здесь каждое значение <атрибут> в параметре <список атрибутов>, в свою очередь, является упорядоченной парой следующего вида.
<имя атри6ута> <имя типа>
Смысл выражения <перечень определений потенциальных ключей> и необязательно- го выражения <переченъ определений внешних ключей> раскрывается ниже.
Замечание. Термин <список ...> (список, разделенный запятыми) был определен в главе4 (раздел 4.6), а термин <переченъ ...> имеет следующее определение. Если <xyz> — это некоторая синтаксическая категория (т.е. что-либо, что записывается слева в BNF-нотации), то <перечень хуг> обозначает последовательность категорий <хуг>, количество которых больше нуля либо равно нулю, причем каждая соседняя пара этих определений разделяется по крайней мере одним пробелом.
В качестве примера рассмотрим несколько определений базовых отношений для базы данных поставщиков и деталей.
VAR S BASE RELATION { SI Si,
SNAME NAME,
STATUS INTEGER,
CITY CHAR } PRIMARY KEY { Si } ;
VAR P BASE RELATION { Pi Pi,
PNAME NAME,
COLOR COLOR,
WEIGHT WEIGHT,
CITY CHAR } PRIMARY KEY { Pi } ;
VAR SP BASE RELATION { Si Si,
Pi Pt,
QTY QTY } PRIMARY KEY{ Si, Pi } FOREIGN KEY{ Si } REFERENCES S FOREIGN KEY{ Pi } REFERENCES P ;
Пояснения
1. Эти три базовые переменные-отношения относятся к следующим типам (отношений).
RELATION { Si Si, SNAME NAME, STATUS INTEGER, CITY CHAR } RELATION { Pi Pi, PNAME NAME, COLOR COLOR, WEIGHT WEIGHT,
CITY CHAR } RELATION { Si Si, Pi Pi, QTY QTY }
Очевидно, что все эти типы (отношений) действительно являются типами и могут ис- пользоваться любым обычным способом; в частности, как тип атрибута некоторого отношения. (Фактически тип RELATION является генератором типов, позволяющим определять сколько угодно различных типов отношений, подобно тому как тип array является генератором типов массивов в общепринятых языках программирования.)
Все возможные значения переменной-отношения принадлежат одному типу (а именно, тому типу, который прямо или косвенно был задан при определении этой переменной-отношения) и, следовательно, имеют одинаковые заголовки. В частно- сти, начальным значением любой переменной-отношения является пустое отноше- ние соответствующего типа.
Термины заголовок, тело, атрибут, кортеж, кардинальность и степень, уже оп- ределенные для значений отношений, очевидным образом переносятся на пере- менные-отношения (на все переменные-отношения, а не только на базовые пере- менные-отношения).
При определении новой базовой переменной-отношения система делает в каталоге запись — описание этой переменной-отношения.
Определение потенциальных ключей будет дано в главе 8. До этого времени мы просто будем считать, что в каждом определении базовой переменной-отношения есть ровно одно такое определение, записанное в следующем виде.
PRIMARY KEY {<стсок имен атрибутов>]
Определение внешних ключей также приводится в главе 8.
6. Наконец, любую существующую базовую переменную-отношение можно удалить. DROP VAR <иш переменной-отношения>;
В результате выполнения этой операции сначала значение базовой переменной- отношения устанавливается равным пустому отношению (т.е. из базовой переменной- отношения удаляются все кортежи), а затем из каталога удаляются записи, соответст- вующие этой переменной-отношению. По завершении указанных действий данная базо- вая переменная-отношение перестает быть известной системе.
Замечание, Для простоты предполагается, что выполнение оператора DROP приведет к ошибке, если удаляемая переменная-отношение где-либо используется, например если на нее имеется ссылка в определении какого-либо представления. Представления будут рас- смотрены в главе 9.
Обновление переменных-отношений
Присвоение значений переменным-отношениям, т.е. их обновление, в реляционной модели осуществляется с помощью оператора реляционного присвоения. На языке Tu- torial D это делается следующим образом.
<имя переменной-отношения> := реляционное выражение>;
После вычисления реляционного выражения, заданного параметром реляционное выражение>, полученное значение присваивается переменной-отношению с именем, ко- торое указано параметром <имя переменной-отношения>, заменяя ее прежнее значение. Разумеется, переменная-отношение и полученное в результате вычислений отношение должны быть одного типа, т.е. иметь одинаковые заголовки.
Предположим, к примеру, что задана некоторая переменная-отношение R, принадле- жащая тому же типу, что и переменная-отношение поставщиков S.
VAR R BASE RELATION
{ Sf SI, SNAME NAME, STATUS INTEGER, CITY CHAR }
Ниже приведено несколько примеров правильного реляционного присвоения.
R := S;
R := S WHERE CITY = 'London' ;
R := S MINUS { S WHERE CITY = 'Paris' ) ;
Заметьте, что каждый из этих примеров можно рассматривать и как пример выборки данных из отношения, заданного в правой части выражения, и как пример обновления значения переменной-отношения, расположенной слева от оператора присвоения.
Предположим теперь, что во втором и третьем примерах переменную-отношение R заменили переменной-отношением S.
S := S WHERE CITY = 'London' ;
S := S MINUS ( S WHERE CITY = 'Paris' ) ;
В этом случае оба присвоения обновляют значение переменной-отношения S: первое удаляет всех поставщиков, находящихся вне Лондона, а второе удаляет всех поставщи- ков, находящихся в Париже. Для удобства язык Tutorial D поддерживает явные операто- ры INSERT, DELETE и UPDATE, однако каждый из них является лишь сокращенным обозна- чением некоторой операции реляционного присвоения. Например, рассмотрим следую- щий оператор11.
■ INSERT INTO S
RELATION { TUPLE { Si Si ( 'S6' ),
SNAME NAME ( 'Smith' ),
STATUS 50,
CITY 'Rome' } } ;
Он является эквивалентом операции присвоения, которая записывается так.
S := S UNION
RELATION { TUPLE { Si Si ( 'S6' ),
SNAME NAME ( 'Smith' ),
STATUS 50,
CITY 'Rome' } } ;
"
Выражение RELATION
(...)
в примере оператора INSERT
является
обращением к опера-
тору выбора (в
свою очередь, выражение в фигурных
скобках в фразе TUPLE
{...}
является об-
ращением к оператору
выбора кортежа, а выражения во внутренних
скобках — обращением к
оператору
выбора скаляров). Подробнее об этом
рассказывается в разделах б.3 и 6.4 главы
б.
своения, можно было бы расширить так, чтобы подобные ситуации проверялись. Для простоты эти усовершенствования здесь игнорируются. Разумеется, то же самое касается операторов DELETE и UPDATE.
■ DELETE S WHERE CITY = 'Paris'; эквивалентно присвоению
S := S MINUS (S WHERE CITY = 'Paris' ) ;
■ UPDATE S WHERE CITY = 'Paris'
STATUS := 2 * STATUS, CITY := 'Rome' ;
Эквивалент этого оператора, записанный в виде реляционного присвоения, имеет слишком сложный на текущий момент вид, поэтому мы его опускаем (см. [3.3]).
Подводя итог, приведем несколько упрощенный синтаксис операторов INSERT, DELETE и UPDATE.
INSERT INTO <ит переменной-отношения> реляционное выражениё> ;
DELETE <имя переменной-отношения> [ WHERE Логическое выражение> ] ;
UPDATE <имя переменной-отношения > [ WHERE логическое выражениё> }
<список обновляемых атрибутов> ;
Здесь параметр обновляемый атрибут> имеет следующий вид. <имя атри6ута> := <выражение>
Синтаксис выражения, помещаемого в параметр <логическое выражениё>, говорит сам за себя, тем не менее он подробно описывается в главе 6.
В завершение этого раздела подчеркнем, что реляционное присвоение, а следова- тельно, и операторы INSERT, DELETE и UPDATE являются операторами на уровне мно- жеств. Например, оператор UPDATE, говоря нестрого, обновляет некоторое множество кортежей результирующей переменной-отношения. Неформально мы также часто гово- рим, например, об обновлении отдельного кортежа, однако при этом необходимо отчет- ливо понимать следующее.
В действительности имеется в виду множество кортежей, однако в данном случае кардинальность этого множества равна единице.
Иногда обновление множества кортежей с кардинальностью, равной единице, не- возможно!
Предположим, например, что на переменную-отношение поставщиков наложено ог- раничение целостности (подробности приводятся в главе 8), которое заключается в том, что поставщики с номерами 'S1' и 'S4' должны иметь один и тот же статус. Тогда при обновлении отдельного кортежа, затрагивающем статус одного из двух перечисленных выше поставщиков, возникнет ошибка. В этом случае необходимо обновлять статус обо- их поставщиков одновременно, например так.
UPDATE S WHERE S# = S# { 'SI' ) OR Sf = S# ( 'S4' ) STATUS := <некоторое значение> ;
Следует подчеркнуть, что говорить об "обновлении кортежа" (или множества корте- жей), как мы это только что делали, — довольно некорректно. Кортежи, как и отноше- ния, являются значениями и не могут быть обновлены (по определению никакое значе- ние изменить нельзя). Таким образом, для того чтобы "обновлять кортежи", необходимо ввести понятие переменной кортежа, что вовсе не является частью реляционной модели! Поэтому, когда мы, например, говорим "обновление кортежа t\ с его преобразованием в кортеж t{\ подразумевается, что кортеж t\ (т.е. значение кортежа t\) заменяется корте- жем 1г (под которым снова понимается значение кортежа). Аналогичные замечания отно- сятся к фразам наподобие "обновление атрибута А" (некоторого кортежа). В этой книге мы и далее будем говорить "обновление кортежей" или "обновление атрибутов корте- жей", поскольку на практике это удобно. Однако не следует забывать, что такие сокра- щения в общем случае некорректны.