- •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.5. Оптимизация
Как объяснялось в разделе 3.2, реляционные операции, такие как выборка, проекция и соединение, выполняются на уровне множеств. Поэтому реляционные языки часто на- зывают непроцедурными, так как пользователь указывает, что делать, а не как делать. Фактически пользователь говорит лишь, что ему нужно, без указания процедуры получе- ния результата. Процесс "навигации" по хранимой базе данных с целью удовлетворения запроса пользователя выполняется системой автоматически, а не пользователем вручную. Поэтому реляционные системы иногда называют системами автоматической навигации. В нереляционных системах за навигацию по базе данных, в основном, несет ответственность сам пользователь. На рис. 3.5 приведена яркая иллюстрация преиму- ществ автоматической навигации — оператору языка SQL INSERT противопоставлен код, выполняющий навигацию "вручную". Подобный код, возможно, должен написать для получения того же результата пользователь нереляционной системы (в данном случае — сетевой системы CODASYL; пример взят из главы по сетевым базам данных в [1.5]).
п Замечание. Здесь используется широкоизвестная база данных деталей и поставщиков. За.родробностями обратитесь к разделу 3.9.
Несмотря на предыдущие замечания, следует отметить, что "непроцедурный" — это хотя и общепринятый, но не совсем точный термин, потому что "процедурный" и "непроцедурный" — понятия относительные. Можно лишь с уверенностью сказать, что язык А более (или менее) процедурный, чем язык Б. Поэтому точнее будет сказать, что реляционные языки, такие как SQL, обладают более высоким уровнем абстракции, чем типичные языки программирования, подобные С++ или COBOL (либо подъязыки дан- ных, обычно принадлежащие нереляционным СУБД; убедитесь в этом сами; см. рис. 3.5). В принципе, именно более высокий уровень абстракции способствует повыше- нию продуктивности, характерному для реляционных систем.
INSERT INTO SP ( St, Pt, QTY )
VADLDES ( 'S4', 'P3', 1000 ) ; MOVE 'S4' TO St IN S FIND CALC S
ACCEPT S-SP-ADDR FROM S-SP CURRENCY FIND LAST SP WITHIN S-SP while SP found PERFORM
ACCEPT S-SP-ADDR FROM S-SP CURRENCY
FIND OWNER WITHIN P-SP
GET P
IF Pt IN P < 'P3'
leave loop END-IF
FIND PRIOR SP WITHIN S-SP END-PERFORM MOVE 'P3' TO Pt IN P FIND CALC P
ACCEPT P-SP-ADDR FROM P-SP CURRENCY FIND LAST SP WITHIN P-SP while SP found PERFORM
ACCEPT P-SP-ADDR FROM P-SP CURRENCY
FIND OWNER WITHIN S-SP
GET S
IF St IN S < 'S4'
leave loop END-IF
FIND PRIOR SP WITHIN P-SP END-PERFORM MOVE 1000 TO QTY IN SP FIND DB-KEY IS S-SP-ADDR FIND DB-KEY IS P-SP-ADDR STORE SP
CONNECT SP TO S-SP CONNECT SP TO P-SP
Рис. 3.5. Примеры автоматической навигации и навигации вручную
Ответственность за то, как именно выполняется автоматическая навигация, несет очень важный компонент СУБД — оптимизатор (мы уже упоминали о нем в главе 2). Другими словами, работа оптимизатора заключается в том, чтобы для каждого запроса пользователя выбрать самый эффективный способ выполнения этого запроса. Предположим, например, что пользователь сделал следующий запрос (снова воспользуемся языком Tutorial D).
RESULT := ( ЕМР WHERE EMPI = 'Е4' ) { SALARY } ;
Пояснение. Выражение в первых скобках (ЕМР WHERE ...) означает запрос выборки строк из переменной-отношения ЕМР, а именно — той строки, в которой значение столб- ца EMPi равно 'Е4'. Название столбца в фигурных скобках (SALARY) означает запрос вы- борки столбцов (иначе называемый проекцией) из результата, полученного после выбор- ки строк, а именно — столбца SALARY. И наконец, оператор присвоения (:=) означает за- прос присвоения результата выборки столбцов переменной-отношению RESULT. Следова- тельно, после выполнения запроса переменная-отношение RESULT будет содержать зна- чение из одной строки и одного столбца, содержащего значение зарплаты служащего с номером 'Е4'. (Обратите внимание, что в данном случае в явном виде используется ре- ляционное свойство замкнутости: мы написали вложенное выражение, в котором ре- зультат выборки строк — это входные данные для выборки столбцов.)
Даже в этом простом примере существует по крайней мере два способа поиска необ- ходимых данных.
Последовательный физический просмотр (хранимой версии) переменной- отношения ЕМР, пока требуемая запись не будет найдена.
Если есть индекс для столбца EMPi (в хранимой версии) переменной-отношения (который, вероятно, действительно существует, поскольку этот столбец является уникальным, а большинство систем фактически требует создания индекса для обеспечения уникальности), то переход с помощью этого индекса непосредственно к данным служащего с номером ' Е4'.
Оптимизатор выберет, какую из двух возможных стратегий следует применить. В общем случае для реализации любого конкретного реляционного запроса оптимизатор будет осуществлять выбор стратегии, исходя из соображений, подобных следующим:
на какие переменные-отношения есть ссылки в запросе;
насколько велики эти переменные-отношения;
какие существуют индексы;
насколько избирательны эти индексы;
как физически группируются данные на диске;
какие реляционные операции используются и т.д.
Поэтому повторяем: пользователь указывает в запросе, какие данные ему требуются, а не как их получить, тогда как стратегия доступа к данным выбирается оптимизатором (автоматическая навигация). В результате пользователи и пользовательские программы обретают независимость от применяемых стратегий доступа, что, конечно же, совершен- но необходимо, если мы хотим достичь реальной независимости от физического пред- ставления данных.
Более подробные сведения об оптимизаторе приводятся в главе 17.