- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 85 -
F1. Рефлексивность: X X.
F2. Пополнение: X Y ZX Y.
F3. Аддитивность: X Y и X Z X YZ. F4. Проективность: X YZ X Y.
F5. Транзитивность: X Y и Y Z X Z.
F6. Псевдотранзитивность: X Y и YZ W X Z W.
3.4.3. Применение аксиом вывода
С использованием аксиом вывода можно получить и другие правила для вывода функциональных зависимостей. При проверке полученных правил в качестве опровержения достаточно привести пример отношения, которое удовлетворяет исходным зависимостям и не удовлетворяет выведенным. Например, утверждение о том, что зависимость XY → ZW влечет за собой зависимость X→Z, легко можно опровергнуть на примере отношения, содержащего оценки студентов за весеннюю сессию:
оценки( ФАМИЛИЯ ПРЕДМЕТ ОЦЕНКА ЭКЗАМЕНАТОР )
Балашов |
ФИЗИКА |
5 |
Петров |
Балашов |
ИСТОРИЯ |
4 |
Сидоров |
Как видно из конкретного отношения, в нем выполняется зависимость ФАМИЛИЯ ПРЕДМЕТ → ОЦЕНКА ЭКЗАМЕНАТОР, но зависимость ФАМИЛИЯ → ОЦЕНКА уже не удовлетворяется.
Рассмотренная система аксиом полна, что говорит о том, что любая выводимая из множества функциональных зависимостей F- зависимость может быть получена путем применения к нему аксиом вывода.
С другой стороны, эта система аксиом избыточна, поскольку обладает собственным подмножеством, которое обладает свойством полноты. Таким множеством являются аксиомы F1, F2 и F6. Все остальные аксиомы могут быть выведены из них. Аксиомы F1, F2 и F6 являются независимыми: ни одна из них не может быть выведена из двух оставшихся. Эти аксиомы называются аксиомами Армстронга.
Для дальнейших рассуждений нам понадобится использовать понятие замыкания множества функциональных зависимостей. Дадим определение.
Пусть F - множество функциональных зависимостей для отношения r(R). Замыканием множества функциональных зависимостей F, обозначаемого, как F+, называется множество функциональных зависимостей, полученное из F путем
- 86 -
применения к нему аксиом вывода, причем дальнейшее применение аксиом уже не может дать более ни одной новой зависимости.
Проще говоря, F+ - множество, состоящее из всех зависимостей, которые можно вывести из F, и не содержащее ни одной зависимости, не выводимой из F.
Таким образом можно говорить о справедливости утверждений:
•Если зависимость X→Y принадлежит к F+, то она выводится из F.
•Если зависимость X→Y выводится из F, то она принадлежит к F+.
Замыкание не может быть увеличено, то есть F+ = (F+)+. Многие трудности связаны с большим размером замыкания. Например, если имеется множество F = {A→B, B→C} функциональных зависимостей на схеме R=ABC, то его замыкание будет представлять собой F+ = {A→A, AB→A, ABC→A, B→B, AB→B, ABC→B, C→C, AC→C, ABC→C, AB→AB, ABC→AB, AC→AC, ABC→AC, BC→BC, ABC→BC, ABC→ABC, A→B, AC→B, B→C, AB→C, A→C, AB→C}.
Легко представить, что же произойдет, если вырастет и количество атрибутов в схеме, и количество функциональных зависимостей. В дальнейшем понятие замыкания будет использоваться достаточно часто, но вычисляться не будет.
Кроме понятия замыкания будем использовать и противоположное ему понятие.
Если имеется множество функциональных зависимостей F над схемой R и множество G всех возможных функциональных зависимостей над R, то внешностью множества F будет называться множество F- =F+ - G.
Другими словами, множество G содержит все зависимости, которые нельзя вывести из F.
3.4.4. Выводы на основе аксиом вывода
Как уже упоминалось, если F влечет зависимость X→Y, то всегда можно из множества F вывести зависимость X→Y с помощью аксиом вывода. Эту последовательность применения аксиом называют выводом зависимости X→Y. В процессе вывода включаются зависимости, которые либо принадлежат множеству F, либо получаются в результате применения аксиом вывода к совокупности зависимостей, принадлежащих F и выведенных ранее.
- 87 -
Рассмотрим пример вывода для множества F = {AB→E, AG→J, BE→I, E→G, GI→H} функциональной зависимости AB→GH.
Перед получением вывода напомним, что в него входят на каждом шаге выводимые функциональные зависимости, исходные (заданные ранее или выведенные на одном из предыдущих шагов) и правила вывода (в рассматриваемом случае - аксиомы вывода).
Шаг |
Полученная |
Исходные |
Правило вывода |
|
зависимость |
зависимости |
|
1 |
AB AB |
|
Рефлексивность |
2 |
AB B |
AB AB |
Проективность |
3 |
AB E |
|
Дано |
4 |
AB BE |
AB B, AB E |
Аддитивность |
5 |
BE I |
|
Дано |
6 |
AB I |
AB BE, BE I |
Транзитивность |
7 |
E G |
|
Дано |
8 |
AB G |
AB E, E G |
Транзитивность |
9 |
AB GI |
AB G, AB I |
Аддитивность |
10 |
GI H |
|
Дано |
11 |
AB H |
AB GI, GI H |
Транзитивность |
12 |
AB GH |
AB G, AB H |
Аддитивность |
При рассмотрении выводов всегда следует помнить о том, что результат может быть достигнут разными путями, как с использованием различных аксиом, так и за различное число шагов. Рассмотрим другой вариант вывода той же зависимости.
Шаг |
Полученная |
Исходные |
Правило вывода |
|
зависимость |
зависимости |
|
1 |
AB E |
|
Дано |
2 |
BE I |
|
Дано |
3 |
AB I |
AB E, BE I |
Псевдотранзитивность |
4 |
E G |
|
Дано |
5 |
AB G |
AB E, E G |
Транзитивность |
6 |
AB GI |
AB G, AB I |
Аддитивность |
7 |
GI H |
|
Дано |
8 |
AB H |
AB GI, GI H |
Транзитивность |
9 |
AB GH |
AB G, AB H |
Аддитивность |
Второй вариант вывода короче, однако результат получен тот же: функциональная зависимость AB → GH выводится из множества функциональных зависимостей F.
В теории реляционных баз данных часто применяется понятие используемого множества вывода. Если мы рассмотрим столбец
- 88 -
«Полученная зависимость», то увидим, что в него входят два вида зависимостей: взятые из множества F и выведенные из них.
Используемым множеством вывода P функциональной зависимости X Y из множества функциональных зависимостей F называется такое его подмножество G, в которое входят только те зависимости из F, которые используются при выводе.
В рассмотренном примере используемым множеством будет следующее множество: G = {AB→E, BE→I, E→G, GI→H}. В используемое множество не вошла только одна зависимость из F:
AG→J.
Различным выводам функциональных зависимостей в общем случае соответствуют различные используемые множества.
Ранее давалось утверждение, что система аксиом Армстронга полна. Покажем на том же примере, что вывод можно получить и с помощью одних только аксиом Армстронга.
Шаг |
Полученная |
Исходные зависимости |
Правило вывода |
|
зависимость |
|
|
1 |
AB E |
|
Дано |
2 |
BE I |
|
Дано |
3 |
AB I |
AB E, BE I |
Псевдотранзитивность |
4 |
E G |
|
Дано |
5 |
AB G |
AB E, E G |
Псевдотранзитивность |
6 |
GI H |
|
Дано |
7 |
GH GH |
|
Рефлексивность |
8 |
GI GH |
GI H, GH GH |
Псевдотранзитивность |
9 |
GI GI |
|
Дано |
10 |
ABG GI |
AB I, GI GI |
Псевдотранзитивность |
11 |
AB GI |
AB G, ABG GI |
Псевдотранзитивность |
12 |
AB GH |
AB GI, GI GH |
Псевдотранзитивность |
Обратите внимание на то, что на шагах 5 и 12 использовалась практически аксиома транзитивности, что правомерно, поскольку данная аксиома является частным случаем аксиомы псевдотранзитивности с Z= .
Следует заметить, что выводы с помощью аксиом Армстронга можно считать больше упражнением для ума, чем аппаратом для практической работы, из-за достаточно большой сложности, как стало ясно уже на достаточно простом примере.
-89 -
3.4.5.RAP-последовательность вывода
Ранее уже было показано, что некоторые подмножества аксиом вывода обладают полнотой, то есть если существует последовательность вывода P для X→Y, использующая аксиомы F1-F2, то обязательно существует и последовательность вывода P` для X→Y , которая использует только аксиомы из выбранного подмножества.
Однако на практике наибольшее применение нашло множество аксиом, которое не является подмножеством аксиом F1-F6. Это множество называется B-аксиомами. Если мы имеем отношение r(R) и подмножества X, Y, Z и W схемы R и одиночного атрибута C в R, то имеем набор аксиом:
B1. |
Рефлексивность |
X X |
B2. |
Накопление |
{X YZ, Z CW} |= X YZC |
B3. |
Проективность |
X YZ |= X Y |
Приведенные аксиомы корректны, поскольку каждая из них может быть выведена из аксиом F1-F6. Для первой и третьей аксиом это очевидно, поскольку они полностью совпадают с аксиомами F1 и F4, а аксиома накопления выводится следующим образом:
Шаг |
Полученная |
Исходные зависимости |
Правило вывода |
|
зависимость |
|
|
1 |
X YZ |
|
Дано |
2 |
X Z |
X YZ |
Проективность |
3 |
Z CW |
|
Дано |
4 |
X CW |
X Z, Z CW |
Транзитивность |
5 |
X C |
X CW |
Проективность |
6 |
X YZC |
|
Аддитивность |
Полнота B-аксиом доказывается выводом из них аксиом Армстронга. Рефлексивность совпадает с аксиомой B1. Пополнение выводится следующим образом:
Шаг |
Полученная |
Исходные зависимости |
Правило вывода |
|
зависимость |
|
|
1 |
ZX ZX |
|
Рефлексивность |
2 |
X Y |
|
Дано |
3 |
ZX ZXY |
ZX ZX, X Y |
Накопление |
4 |
ZX Y |
ZX ZXY |
Проективность |
Теперь рассмотрим вывод для псевдотранзитивности:
Шаг |
Полученная |
Исходные |
Правило вывода |
|
зависимость |
зависимости |
|
1 |
ZX ZX |
|
Рефлексивность |
- 90 -
2 |
X Y |
|
Дано |
3 |
ZX ZXY |
ZX ZX, X Y |
Накопление |
4 |
YZ W |
|
Дано |
5 |
ZX ZXYW |
ZX ZXY, YZ W |
Накопление |
6 |
ZX W |
ZX ZXYW |
Проективность |
Как видно из приведенных выводов, последовательность вывода можно достаточно строго формализовать. Такой подход называется RAP-последовательностью вывода (по первым буквам названия B- аксиом: Reflexivity, Accumulation, Projectivity). Эту последовательность можно записать в виде трех правил для проверки принадлежности X→Y к замыканию множества F:
1.Первая зависимость в последовательности вывода - X→X .
2.Последняя зависимость - X→Y.
3.Все промежуточные зависимости определяются следующим образом: они либо принадлежат F, либо выводятся с помощью аксиомы B2.
Рассматриваемый подход позволяет достичь нужного результата путем многократного аккуратного перебора всех функциональных зависимостей в множестве F. Другим очевидным преимуществом данного метода является простота его программной реализации, к которой мы еще вернемся несколько позже.
В качестве примера рассмотрим опять то же множество функциональных зависимостей, что и для вывода с помощью системы аксиом F1-F6. Множества F = {AB→E, AG→J, BE→I, E→G, GI→H}. Надо вывести функциональную зависимость AB→GH.
Шаг |
Полученная |
Исходные зависимости |
Правило вывода |
|
зависимость |
|
|
1 |
AB AB |
|
Рефлексивность |
2 |
AB E |
|
Дано |
3 |
AB ABE |
AB AB, AB E |
Накопление |
4 |
BE I |
|
Дано |
5 |
AB ABEI |
AB B, AB E |
Накопление |
6 |
E G |
|
Дано |
7 |
AB ABEIG |
AB ABEI, E G |
Накопление |
8 |
GI H |
|
Дано |
9 |
AB ABEIGH |
AB ABEIG, GI H |
Накопление |
10 |
AB GH |
AB ABEIGH |
Проективность |
