- •Введение
- •Глава 1. Основные понятия баз данных
- •1.1. История возникновения баз данных
- •1.2. Модели данных
- •1.2.1. Иерархическая модель данных
- •1.2.2. Сетевая модель базы данных
- •1.2.3. Реляционная модель базы данных
- •1.2.4. Другие модели баз данных (ООСУБД)
- •2.1. История появления и развития SQL
- •Глава 2. SQL
- •2.2. Стандарты SQL
- •2.2.1. Стандарты ANSI/ISO
- •2.2.2. ODBC и консорциум SQL Access Group
- •2.2.3. JDBC и серверы приложений
- •2.3. SQL и переносимость
- •2.4. SQL и сети
- •2.4.1. Централизованная архитектура
- •2.4.2. Архитектура файлового сервера
- •2.4.3. Архитектура “клиент/сервер”
- •2.4.4. Многоуровневая архитектура
- •2.4.5. SQL и мэйнфреймы
- •2.4.7. SQL и UNIX
- •2.4.8. SQL и персональные компьютеры
- •2.4.9. SQL, хранилища данных и интеллектуальные ресурсы предприятия
- •2.4.10. SQL и интернет-приложения
- •2.5. Основы SQL
- •2.5.1. Использование SQL для извлечения информации из таблиц
- •2.5.2. Команда SELECT
- •2.5.3. Создание более сложных предикатов в предложении SELECT
- •2.5.4. Формирование вывода запросов
- •2.5.5. Агрегатные группы
- •2.6. Запросы к нескольким таблицам
- •2.6.1. Подзапросы
- •2.6.2. Использование операторов ANY, ALL и SOME
- •2.6.3. Использование предложения UNION
- •2.6.4. Ввод, удаление и изменение значения поля
- •2.7. DDL (Язык описания данных)
- •2.7.1. Создание таблиц
- •2.7.2. Индексы
- •2.7.3. Изменение структуры таблицы после ее создания
- •2.8. Ограничение данных
- •2.8.1. Ограничение таблиц
- •2.8.2. Установка значений по умолчанию
- •2.9. Поддержка целостности данных
- •2.9.1. Первичные ключи
- •2.9.2. Пользовательские представления
- •2.10. Модификация данных с помощью представлений
- •2.11. Разграничение доступа в базе данных
- •Глава 3. Математические основы реляционных баз данных
- •3.1. Отношения и их схемы
- •3.2. Реляционные операторы
- •3.2.1. Булевы операции
- •3.2.2. Оператор выбора
- •3.2.3. Оператор проекции
- •3.2.4. Оператор соединения
- •3.2.5. Другие операции на отношениях
- •3.2.6. Оператор деления
- •3.2.7. Оператор переименования атрибутов
- •3.2.8. Оператор эквисоединения
- •3.2.9. Расширения для сравнения на доменах
- •3.2.9.1. Расширение выбора
- •3.3. Реляционная алгебра
- •3.3.1. Дополнительные операторы
- •3.3.1.1. Оператор расщепления
- •3.3.1.2. Оператор FACTOR
- •3.4. Функциональные зависимости
- •3.4.1. Определение
- •3.4.2. Аксиомы вывода
- •3.4.3. Применение аксиом вывода
- •3.4.4. Выводы на основе аксиом вывода
- •3.4.6. Направленные ациклические графы вывода
- •3.4.7. Проверка принадлежности к замыканию множества функциональных зависимостей
- •3.5. Покрытия функциональных зависимостей
- •3.5.1. Покрытия и эквивалентность
- •3.5.2. Неизбыточные покрытия
- •3.5.3. Редуцированные покрытия
- •3.5.3.1. Посторонние атрибуты
- •3.5.3.3. Алгоритм построения редуцированного покрытия
- •3.5.3.4. Канонические покрытия
- •3.5.3.5. Структура неизбыточных покрытий
- •3.5.4. Минимальные покрытия
- •3.5.4.1. Прямая определяемость
- •3.5.4.2. Вычисление минимальных покрытий
- •3.5.4.3. Оптимальные покрытия
- •3.5.5. Составные функциональные зависимости
- •3.5.6. Кольцевые покрытия
- •3.6. Многозначные зависимости и зависимости соединения
- •3.6.1. Многозначные зависимости
- •3.6.2. Многозначные и функциональные зависимости
- •3.6.3. Аксиомы вывода для многозначных зависимостей
- •3.6.4. Только многозначные зависимости
- •3.6.5. Функциональные и многозначные зависимости
- •3.6.6. Зависимости соединения
- •3.7. Синтез схем реляционных баз данных
- •3.7.1. Базы данных и их схемы
- •3.7.2. Нормальные формы баз данных
- •3.7.2.1. Первая нормальная форма
- •3.7.2.2. Вторая нормальная форма
- •3.7.2.4. Нормальная форма Бойса - Кодда (НФБК)
- •3.7.2.5. Четвертая нормальная форма
- •3.7.2.3. Третья нормальная форма
- •3.8. Алгоритмы синтеза схем баз данных
- •3.8.1. Нормализация через декомпозицию
- •3.8.2. Недостатки нормализации через декомпозицию
- •3.8.3. Нормализация посредством синтеза
- •Глава 4. Система управления базами данных PostgreSQL
- •4.1. Установка
- •4.2. Запуск и останов сервера PostgreSQL
- •4.2.1. Утилита psql
- •4.2.2. Создание базы данных
- •4.3. Объекты базы данных
- •4.4. Функции и операторы
- •4.4.1. Логические операторы
- •4.4.2. Операторы сравнения
- •4.5. Клиентские приложения PostgreSQL
- •4.5.1. clusterdb
- •4.5.2. createdb
- •4.5.3. createuser
- •4.5.4. dropdb
- •4.5.5. dropuser
- •4.5.6. ecpg
- •4.5.7. pg_basebackup
- •4.5.8. pgbench
- •4.5.9. pg_config
- •4.5.10. pg_dump
- •4.5.11. pg_dumpall
- •4.5.12. pg_isready
- •4.5.13. pg_receivewal
- •4.5.14. pg_restore
- •4.5.15. psql
- •4.5.16. reindexdb
- •4.5.17. vacuumdb
- •4.6. Серверные приложения PostgreSQL
- •4.6.1. initdb
- •4.6.2. pg_archivecleanup
- •4.6.3. pg_checksums
- •4.6.4. pg_controldata
- •4.6.6. pg_resetwal
- •4.6.7. pg_rewind
- •4.6.8. pg_test_fsync
- •4.6.9. pg_test_timing
- •4.6.10. pg_upgrade
- •4.6.11. pg_waldump
- •4.6.12. postgres
- •4.6.13. postmaster
- •4.7. Серверное программирование
- •4.7.1. Расширение SQL
- •4.7.2. Триггеры
- •Заключение
- •Библиографический список
-91 -
3.4.6.Направленные ациклические графы вывода
RAP-последовательность вывода имеет свое графическое представление в виде помеченных направленных ациклических графов. Напомним, что ориентированный ациклический граф (DAграф) - это ориентированный граф, не имеющий циклов ни в одной вершине, а помеченный граф к тому же имеет для каждой вершины метку из множества L. Дадим определение для графа вывода.
Если имеется множество функциональных зависимостей F над схемой R, тогда DA-графом вывода над F будет ориентированный ациклический граф, помеченный метками из R и построенный по следующим правилам:
R1. Любое множество изолированных вершин из множества R является DA-графом над F.
R2. Если имеется DA-граф вывода H над F, содержащий вершины с метками A1, A2, ...,Ak, и функциональная зависимость A1 A2 ...Ak CZ, то можно построить новый граф H путем добавления к исходному графу H новой вершины, помеченной как C и соединенной дугами с вершинами A1, A2, ...,Ak.
R3. Никакой другой граф не является DA-графом вывода над F.
По аналогии с RAP-последовательностью вывода DA-граф вывода над F, который мы будем называть DDA-графом над F, строится путем однократного применения первого правила и некоторого количества применений второго правила.
Среди вершин графа следует выделить множество начальных вершин, к которым относятся те, которые не имеют входящих в них дуг. Все начальные вершины добавляются в DDA-граф только с помощью правила R1.
Формально граф H является DDA-графом вывода для зависимости X→Y, если
•X - множество меток начальных вершин;
•каждый атрибут из Y является меткой какой-либо из вершин
графа.
Аналогично другим выводам DDA-граф обладает используемым множеством, которое определяется следующим образом:
- 92 -
Используемым множеством DDA-графа для функциональной зависимости X Y над множеством функциональных зависимостей F является множество U(H), включающее все зависимости из F, использованные при построении графа H, с использованием правила R2.
Рассмотрим применение DDA-графа на примере. Имеется множество зависимостей F = {AB→E, AG→J, BE→I, E→G, GI→H}. Надо построить DDA-граф для функциональной зависимости AB→GH.
Построение графа всегда начинается с использования правила R1. В результате получается граф, состоящий исключительно из начальных вершин. В качестве начальных вершин выбираются помеченные метками из левой части функциональной зависимости AB→GH:
.
На следующем этапе используется только правило R2 для всех зависимостей, у которых левые части уже полностью включены в граф. Таким образом, мы добавляем вершину с меткой E, используя зависимость AB→E, и вершину, помеченную как G, используя E→G.
- 93 -
Как видно из последнего рисунка, все атрибуты левой части выводимой зависимости имеют соответствующие им вершины в полученном графе. Используемым множеством DDA-графа будет множество U(H) = {AB→E, BE→I, E→G, GI→H}.
3.4.7. Проверка принадлежности к замыканию множества функциональных зависимостей
Для проверки выводимости функциональной зависимости X→Y из множества функциональных зависимостей F достаточно проверить принадлежность зависимости к замыканию F. Однако величина F+ может оказаться достаточно большой. Следовательно, желательно найти алгоритм, позволяющий выполнять проверку с меньшими затратами времени.
Рассмотрим понятие замыкания атрибута X над F, которое представляет собой множество всех атрибутов C R, для которых справедливо F X C, и обозначается как X+.
Отметим еще раз, что если замыкание F - множество функциональных зависимостей, то замыкание X - множество атрибутов.
После нахождения замыкания X можно утверждать, что выведена зависимость X → Z из F и к Z не может быть добавлено ни одного атрибута без нарушения замыкания F. Таким образом, если правая часть зависимости X→Y является подмножеством Z, то эта зависимость выводится из F. Задача нахождения замыкания множества атрибутов является основой многих алгоритмов синтеза и
- 94 -
верификации схем реляционных баз данных, поэтому большое количество работ посвящено разработке и модификации соответствующих алгоритмов. Рассмотрим алгоритм, главным достоинством которого является простота восприятия.
Будем считать, что на входе рассматриваемой функции CLOSURE - множество атрибутов X и функциональных зависимостей F над схемой R. Дополнительно введем два множества зависимостей OLD и NEW.
CLOSURE(X,F) begin
OLD := ; NEW := X; while NEW OLD do begin
OLD := NEW;
for каждая зависимость {W Z} F do if W NEW then
NEW := NEW Z
end return(NEW) end.
Алгоритм обладает сходимостью, потому что в начале каждого цикла происходит проверка того, произошло ли добавление очередного атрибута или группы атрибутов к множеству NEW, и если оно осталось без изменений, то работа алгоритма прекращается. В противном случае на каждом шаге будет прибавляться конечное количество атрибутов из схемы R, содержащей конечное количество атрибутов.
Проиллюстрируем работу алгоритма на примере рассмотренного ранее множества зависимостей F = {AB→E, AG→J, BE→I, E→G, GI→H}. Надо найти замыкание для множества атрибутов AB.
Цикл |
Шаг |
NEW |
Исходные |
OLD |
NEW = |
|
|
|
зависимости |
|
= OLD |
|
|
|
|
|
|
0 |
|
AB |
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
Нет |
|
|
|
|
|
|
|
1 |
ABE |
AB E |
AB |
|
|
|
|
|
|
|
|
2 |
ABEI |
BE I |
AB |
|
|
|
|
|
|
|
|
3 |
ABEIG |
E G |
AB |
|
|
|
|
|
|
|
|
4 |
ABEIGH |
GI H |
AB |
|
|
|
|
|
|
|
2 |
|
|
|
|
Нет |
|
|
|
|
|
|
|
1 |
ABEIGHJ |
AG J |
ABEIGH |
|
|
|
|
|
|
|
