- •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. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся
3.1. Введение
Как отмечалось в главе 1, в этой книге основное внимание сконцентрировано на ре- ляционных системах. В части II подробно описаны теоретические основы таких систем, а точнее— реляционная модель данных. Эта глава является лишь предварительным и весьма неформальным введением в материал, подробно изложенный в части II (и в неко- торой степени в материал последующих глав), которое послужит основой для лучшего понимания последующих частей книги. Большинство затронутых здесь тем рассматрива- ется в дальнейшем более формально и значительно детальнее.
3.2. Реляционная модель
Как уже неоднократно отмечалось, реляционные системы базируются на формальных основах, или теории, которая называется реляционной моделью данных. Интуитивно понят- но, что, кроме всего прочего, в такой системе выполняются как минимум три условия.
Структурный аспект. Данные в базе воспринимаются пользователем, как таблицы (и никак иначе).
Аспект целостности. Эти таблицы удовлетворяют определенным условиям целостно- сти (что мы еще обсудим в конце раздела).
Аспект обработки. В распоряжении пользователя имеются операторы манипулирова- ния данными (например, выборки информации), которые генерируют новые таблицы на основании уже имеющихся и среди которых есть по крайней мере операторы выборки (restrict), проекции (project) и объединения (join).
На рис. 3.1 показан простой пример реляционной базы данных отделов (таблица DEPT) и служащих (таблица ЕМР). Как видите, эта база данных действительно "воспринимается, как набор таблиц" (мы полагаем, что смысл этих таблиц не требует пояснений).
На рис. 3.2 показаны некоторые примеры операций SELECT, PROJECT и JOIN для этой базы данных. Ниже приведены (очень нестрогие!) определения этих операций.
Операция выборки SELECT (или RESTRICT) предназначена для извлечения опре- деленных строк из таблицы.
Операция проекции PROJECT предназначена для извлечения определенных столбцов из таблицы.
Операция объединения JOIN предназначена для соединения двух таблиц на основе общих значений в общих столбцах.
DEPT# |
DNAME |
BUDGET |
Dl |
Marketing |
10M |
D2 |
Development |
12M |
D3 |
Research |
5M |
EMP
EMP# |
ENAME |
DEPT# |
SALARY |
El |
Lopez |
Dl |
40K |
E2 |
Cheng |
Dl |
42K |
E3 |
Finzi |
D2 |
30K |
E4 |
Saito |
D2 |
35K |
SELECT (RESTRICT): Результат:
Выборка
строк из DEPT,
где
BUDGET
>
8М
Рис. 3.1. База данных отделов и служащих (значения взяты для примера)
DEPT# |
DNAME |
BUDGET |
Dl D2 |
Marketing Development |
10M 12M |
PROJECT: |
Результат: |
DEPT# |
BUDGET |
Извлечение столбцов DEPT#, BUDGET |
Dl |
10M | |
|
|
D2 |
12M |
|
|
D3 |
5M |
JOIN:
Соединение DEPT и EMP на основе столбца DEPT#
DEPT# |
DNAME |
BUDGET |
EMP# |
ENAME |
SALARY |
Dl |
Marketing |
10M |
El |
Lopez |
40K |
Dl |
Marketing |
10M |
E2 |
Cheng |
42K |
D2 |
Development |
12M |
E3 |
Finzi |
30K |
D2 |
Development |
12M |
E4 |
Saito |
35K |
Рис. 3.2. Примеры выполнения операций SELECT, PROJECT и JOIN
Из трех приведенных здесь примеров в комментариях, по-видимому, нуждается толь- ко операция JOIN. Прежде всего, обратите внимание на то, что в таблицах DEPT и ЕМР есть общий столбец DEPTt, а следовательно, для этих таблиц можно выполнить операцию соединения на основе общих значений в этом столбце.
При выполнении данной операции строка таблицы DEPT соединяется со строкой таб- лицы ЕМР и образуется более длинная строка, но подобное происходит тогда и только то- гда, когда у этих двух строк одинаковое значение поля DEPTi. Например, можно соеди- нить в результирующую строку следующие строки таблиц DEPT и ЕМР (названия столбцов приведены для наглядности).
DEPT# |
DNAME |
BUDGET |
Dl |
Marketing |
10M |
EMP# |
ENAME |
DEPT# |
SALARY |
El |
Lopez |
Dl |
40K |
Это возможно, так как в общем столбце у данных строк одно и то же значение 'Dl'. Вот эта результирующая строка.
DEPT# |
DNAME |
BUDGET |
EMP# |
ENAME |
SALARY |
Dl |
Marketing |
10M |
El |
Lopez |
40K |
Общий результат состоит из множества всех таких соединенных строк. Обратите внимание, что столбец DEPTI в каждой результирующей строке встречается один раз, а не два. Обратите также внимание на то, что, поскольку в поле DEPTt таблицы ЕМР нет значения 'D3' (т.е. нет служащих, работающих в отделе 'D3'), нет и резуль- тирующих строк со значением 'D3' в этом поле, хотя строка со значением 'D3' в таблице DEPT присутствует.
Необходимо отметить один важный момент, очевидный из рис. 3.2: результат выполнения каждой из трех представленных операций — это еще одна таблица (другими словами, эти операторы — фактически такие "операторы, которые порож- дают таблицы из таблиц", что мы подчеркивали ранее). Это реляционное свойство замкнутости. Оно имеет очень большое значение и, главным образом, потому, что результатом выполнения операции является объект того же рода, что и объект, над которым производилась операция, а именно — таблица. Но это значит, что над ре- зультатом операции можно вновь проделать какую-либо операцию. Например, можно выбрать столбцы (операция PROJECT) из результата соединения таблиц (операция JOIN) или соединить два результата выполнения операции SELECT и т.д. Другими словами, можно использовать вложенные выражения, т.е. выражения, в которых операнды представлены выражениями, а не простыми именами таблиц. В данной и последующих главах вы увидите, что этот факт имеет, в свою очередь, множество важных следствий.
Кстати, когда мы говорим, что результатом выполнения каждой операции является таблица, мы имеем в виду, что это таблица с концептуальной точки зрения. Мы не хо- тим сказать, что система обязательно должна полностью овеществлять результат каж- дой отдельной операции. Предположим, например, что понадобилось выбрать строки (операция SELECT) из соединения таблиц. В этом случае как только строка требуемого соединения будет сформирована, система может немедленно применить к ней задан- ное ограничение и проверить, будет ли она принадлежать конечному результату. Если это не так, система может немедленно отбросить данную строку. Иначе говоря, про- межуточный результат, который создается операцией соединения, возможно, никогда и не будет существовать в виде полной овеществленной таблицы как таковой. На практике, как правило, каждая система настойчиво стремится избежать полного ове- ществления промежуточных результатов по вполне понятной причине — с целью по- вышения производительности.
Замечание. Если промежуточные результаты полностью овеществлены, стратегия вычисления выражения в целом называется (что неудивительно) овеществленными вы- числениями; если промежуточные результаты передаются последующей операции по частям, то этот подход называется конвейерными вычислениями.
Другой момент, который также недвусмысленно проиллюстрирован на рис. 3.2, за- ключается в том, что операции применяются сразу ко всему множеству строк, а не к отдельной строке за один раз, т.е. операндами и результатами являются не отдельные строки, а целые таблицы, которые содержат множество строк. (Таблица, содержащая множество из одной строки, конечно, тоже допустима, как и пустая таблица, в которой совсем нет строк.) Например, операция JOIN на рис. 3.2 применяется к двум таблицам, состоящим из трех и четырех строк соответственно, а в результате возвращает таблицу из четырех строк. В противоположность этому операции нереляционных систем обычно за одно обращение обрабатывают только одну строку или запись. Таким образом, воз- можность обработки множеств— главная отличительная характеристика реляцион- ных систем (обсуждение этого вопроса будет продолжено в разделе 3.5).
Давайте вновь вернемся к рис. 3.1. Есть несколько замечаний, которые можно сде- лать на основе примера базы данных, приведенного на этом рисунке.
■ Во-первых, отметим, что определение реляционной системы требует, чтобы база данных только воспринималась пользователем как набор таблиц. Табли- цы в реляционной системе являются логическими, а не физическими струк- турами. На самом деле на физическом уровне система может использовать любую из существующих структур памяти (последовательный файл, индекси- рование, хеширование, цепочку указателей, сжатие и т.п.), лишь бы существо- вала возможность отображать эти структуры в виде таблиц на логическом уровне. Данное положение можно сформулировать и по-другому: таблицы представляют собой абстракцию способа физического хранения данных, в которой множество деталей на уровне памяти (размещение хранимых записей, последовательность хранимых записей, кодировка хранимых данных, префик- сы хранимых записей, хранимые структуры доступа, такие как индексы, и т.д.) скрыто от пользователя.
В данном случае термин "логическая структура" в терминологии ANSI/SPARC относится как к концептуальному, так и к внешнему уровням. Дело в том, что, как объяснялось в главе 2, и концептуальный, и внешний уровни в реляцион- ной системе являются одинаково реляционными и лишь внутренний или фи- зический уровень не является таковым. На самом деле реляционная теория вообще ничего не может сказать о внутреннем уровне. Она, как уже отмеча- лось, определяет то, как база данных представлена пользователю^. Повторим, единственное требование состоит в следующем: какая бы физическая струк- тура не была выбрана, она должна полностью реализовывать существующую логическую структуру.
■ Во-вторых, у реляционных баз данных есть одно замечательное свойство, назы- ваемое информационным принципом: все информационное содержимое базы данных представлено одним и только одним способом, а именно — явным зада-
' К сожалению, приходится констатировать, что большинство современных SQL-продуктов не обеспечивает должной поддержки этого аспекта теории. А точнее, они обычно в определен- ной степени поддерживают только отображения "концептуальный-внутренний " для операций выборки (как правило, отображают одну логическую таблицу непосредственно в один хранимый файл). И вследствие этого они не обеспечивают независимость от физических данных в той ме- ре, в какой это теоретически предусмотрено в реляционной технологии.
ниш значений, помещенных в позиции столбцов в строках таблицы. Этот метод представления единственно возможный для реляционных баз данных (естествен- но, на логическом уровне). В частности, нет никаких указателей, связывающих одну таблицу с другой. Например, на рис. 3.1 существует определенная связь ме- жду строкой 'Dl' в таблице DEPT и строкой 'Е1' в таблице ЕМР, указывающая, что служащий с номером 'Е1' работает в отделе с номером 'Dl'; но эта информация представлена не указателем, а наличием значения 'D1' в столбце DEPTt строки 'El' в таблице ЕМР. В нереляционных системах (например, в IMS и IDMS), напро- тив, такая информация обычно представляется (о чем шла речь в главе 1) неким указателем, который пользователь видит явно.
Замечание. Когда мы говорим, что в реляционной системе нет указателей, мы не имеем в виду, что в ней не может быть указателей на физическом уровне; наобо- рот, они, конечно, могут быть на этом уровне и в действительности наверняка есть. Но, как уже объяснялось, подобные детали физического хранения в реляци- онных системах скрываются от пользователя.
На этом закончим с вопросами, связанными со структурой и обработкой данных в ре- ляционной модели, и перейдем к рассмотрению аспекта целостности. Еще раз восполь- зуемся базой данных отделов и сотрудников, приведенной на рис. 3.1. На практике для такой базы данных потребовалось бы определить несколько ограничений поддержки це- лостности базы. Например, зарплата служащих не должна выходить за пределы диапазо- на, скажем, от 25 до 95 тыс. долларов в год, а бюджет отдела должен быть, например, в пределах от 1 до 15 млн долларов и т.д. Некоторые из таких правил имеют настолько важное практическое значение, что получили специальные названия. Рассмотрим их.
Каждая строка в таблице DEPT должна включать уникальное значение столбца DEPTf; аналогично каждая строка в таблице ЕМР должна включать уникальное значение столбца EMPi. Говорят, что столбцы DEPTt в таблице DEPT и EMPt в таб- лице ЕМР являются первичными ключами для своих таблиц. (Вспомните, что в главе 1 мы условились отмечать на рисунках столбцы первичных ключей двой- ным подчеркиванием.)
Каждое значение столбца DEPTt в таблице ЕМР должно существовать как значе- ние столбца DEPTt в таблице DEPT для отражения того факта, что каждый слу- жащий должен быть приписан к существующему отделу. Говорят, что столбец DEPTt в таблице ЕМР является внешним ключом, ссылающимся на первичный ключ таблицы DEPT.
Завершим этот раздел определением реляционной модели, чтобы в дальнейшем на него можно было ссылаться (хотя на данном этапе такое определение будет несколько абстрактным и не очень вразумительным). В первом приближении реляционная модель состоит из следующих пяти компонентов.
Неограниченный набор скалярных типов (включая, в частности, логический тип или значение истины).
Генератор типов отношений и соответствующая интерпретация для таких сгене- рированных типов отношений.
Возможность определения переменных отношений для таких сгенерированных типов отношений.
Операция реляционного присвоения для присвоения реляционных значений та- ким переменным отношений.
Неограниченный набор общих реляционных операторов для получения значений отношений из других значений отношений.
Как видите, реляционная модель— это нечто большее, чем просто "таблицы плюс выборка, проекция и соединение", хотя ее неформально довольно часто характеризуют именно таким образом.
Замечание. Вас, возможно, удивило то, что в предыдущем определении отсутствует явное упоминание о правилах целостности. Однако на самом деле такие правила пред- ставляют собой просто приложения (хотя и очень важные), использующие реляционные операторы. Иначе говоря, такие правила формулируются (во всяком случае, концепту- ально) в терминах реляционных операторов, как мы сможем убедиться в главе 8.