
- •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. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся
7.1. Введение
В главе 6 отмечалось, что часть реляционной модели, которая связана с операторами манипулирования данными, основывается на использовании реляционной алгебры. Однако с тем же основанием можно сказать, что она построена на базе реляционного исчисления. Другими словами, реляционная алгебра и реляционное исчисление представляют собой два альтернативных подхода. Принципиальное различие между ними следующее. Реляционная алгебра в явном виде предоставляет набор операций (соединение, объединение, проекция и т.д.), которые можно использовать, чтобы сообщить системе, как в базе данных из опреде- ленных отношений построить некоторое требуемое отношение, а реляционное исчисление просто представляет систему обозначений для определения требуемого отношения в тер- минах данных отношений. Например, рассмотрим запрос "Выбрать номера поставщиков и названия городов, в которых находятся поставщики детали с номером 'Р2"\ Алгебраическая версия этого запроса выглядит приблизительно так (мы умышленно не ис- пользуем формальный синтаксис, приведенный в главе 6).
Сначала выполнить соединение отношения поставщиков S и отношения поставок SP по атрибуту St.
Далее выбрать из результата этого соединения кортежи с номером детали 'Р2'.
И наконец выполнить для результата этой выборки операцию проекции по атри- бутам S# и CITY.
Этот же запрос в терминах реляционного исчисления формулируется приблизительно так.
■ Получить атрибуты SI и CITY для таких поставщиков, для которых в отношении SP существует запись о поставке с тем же значением атрибута S# и со значением атрибута Р|, равным 'Р2'.
В этой формулировке пользователь лишь указывает определенные характеристики требуемого результата, оставляя системе решать, что именно и в какой последовательно- сти соединять, проецировать и т.д., чтобы получить необходимый результат.
Итак, можно сказать, что по крайней мере внешне формулировка запроса в терминах реляционного исчисления носит описательный характер, а в терминах реляционной ал- гебры — предписывающий. В реляционном исчислении просто описывается, в чем за- ключается проблема, тогда как в реляционной алгебре задается процедура решения этой проблемы. Или, говоря очень неформально, алгебра имеет процедурный характер (пусть на высоком уровне, но все же процедурный, поскольку задает необходимые для выпол- нения процедуры), а исчисление — непроцедурный.
Подчеркнем, однако, что упомянутые отличия существуют только внешне. На самом деле реляционная алгебра и реляционное исчисление логически эквивалентны. Каждому выражению в алгебре соответствует эквивалентное выражение в исчисле- нии, и точно так каждому выражению в исчислении соответствует эквивалентное выражение в алгебре. Это означает, что между ними существует взаимно- однозначное соответствие, а различия связаны лишь с разными стилями выражения: исчисление ближе к естественному языку, а алгебра — к языку программирования. Но, повторим еще раз, эти различия только кажущиеся, а не реальные. В частности, ни один из подходов нельзя назвать "более непроцедурным" по сравнению с другим. Подробнее вопрос эквивалентности этих двух подходов будет рассматриваться в разделе 7.4 настоящей главы.
Реляционное исчисление основано на разделе математической логики, который назы- вается исчислением предикатов. Идея использования исчисления предикатов в качестве основы языка баз данных впервые была высказана в статье Кунса (Kuhns) [7.6]. Понятие реляционного исчисления, т.е. специального применения исчисления предикатов в реля- ционных базах данных, впервые было предложено Коддом в [6.1], а в [7.1] Кодд пред- ставил язык, основанный непосредственно на реляционном исчислении и названный "подъязык данных ALPHA". Сам язык ALPHA никогда не был реализован, однако язык QUEL [7.5], [7.10]—[7.12], который действительно был реализован и некоторое время серьезно конкурировал с языком SQL, очень походил на язык ALPHA, оказавший замет- ное влияние на построение языка QUEL.
Основным средством реляционного исчисления является понятие переменной кор- тежа (также называемой переменной области значений). Коротко говоря, переменная кортежа — это переменная, "изменяющаяся на" некотором заданном отношении, т.е. пе- ременная, допустимыми значениями которой являются кортежи заданного отношения. Другими словами, если переменная кортежа V изменяется в пределах отношения г, то в любой заданный момент переменная V представляет некоторый кортеж t отношения г. Например, запрос "Получить номера поставщиков из числа тех, которые находятся в Лондоне" может быть выражен на языке QUEL так.
RANGE OF SX IS S;
RETRIEVE ( SX.SI ) WHERE SX.CITY = "London";
Переменной кортежа здесь является переменная SX, которая изменяется на отно- шении, представляющем собой текущее значение переменной-отношения S (оператор RANGE — оператор определения этой переменной). Оператор RETRIEVE оз- начает следующее: "Для каждого возможного значения переменной SX выбирать компонент St этого значения тогда и только тогда, когда его компонент CITY имеет значение 'London'".
В связи с тем, что реляционное исчисление основано на переменных кортежа, его первоначальную версию (для отличия от исчисления доменов, речь о котором пойдет ниже) называют также исчислением кортежей. Исчисление кортежей подробно описано в разделе 7.2.
Замечание. Для удобства примем следующее соглашение: далее в этой книге тер- мины исчисление и реляционное исчисление, приведенные без уточнения "кортежей" или "доменов", будут означать именно исчисление кортежей (там где это играет ка- кую-то роль).
В статье Лакруа (Lacroix) и Пиротте (Pirotte) [7.7] предлагается альтернативная версия исчисления, называемая исчислением доменов, в которой переменные кортежа изменяются на доменах, т.е. являются переменными, изменяемыми на доменах, а не на отношениях'. В литературе предлагается множество языков исчисления доменов. Наи- более известный из них—* пожалуй, Query-By-Example, или QBE [7.14] (в действи- тельности он является смешанным, так как в языке QBE присутствуют и элементы ис- числения кортежей). Существует несколько коммерческих реализаций этого языка. В общих чертах исчисление доменов будет описано в разделе 7.6, а язык QBE вкратце рассматривается в комментариях к [7.14].
Замечание. Пытаясь сделать эту главу короче, мы умышленно опускаем подробное описание некоторых вопросов, рассмотренных в главе 6, а именно: транзитивное замы- кание, группирование, разгруппирование и реляционные сравнения. Мы также опускаем рассмотрение соответствующих версий реляционных операторов обновления. Все эти элементы можно перенести "на почву" реляционного исчисления (в версии кортежей или доменов) вполне очевидным способом. Кратко эти вопросы обсуждаются в [3.3].