- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
-101 -
3.5.3.Редуцированные покрытия
Рассмотренные нами неизбыточные покрытия не имеют среди входящих в них зависимостей «лишних», и при попытке удаления любой зависимости будет получено множество, не эквивалентное исходному.
Другой путь лежит в проверке избыточности отдельных атрибутных символов, удаление которых может привести к уменьшению размера исходного множества.
3.5.3.1. Посторонние атрибуты
Пусть F — множество F-зависимостей над схемой R, а зависимость X Y F. Атрибут A является посторонним в X Y, если он может быть удален из ее левой или правой части без изменения замыкания F.
Это условие можно записать следующим образом для постороннего атрибута в левой части зависимости X→Y :
(F - {X→Y}) {Z→Y} ≡ F при XY R, X=AZ, X≠Z. Аналогичная запись для постороннего атрибута в правой части: (F - {X→Y}) {X→W} ≡ F при XY R, Y=AW, Y≠W.
Пример. Имеется множество G = {A→BC, B→C, AB→D}. Посторонние атрибуты в правой (C в первой зависимости) и левой (B в третьей зависимости) частях подчеркнуты. Действительно, множество
G≡ G = {A→B, B→C, A→D}, поскольку:
G|= G
A BC |= A B (проективность)
{A B, AB D} |= A D (псевдотранзитивность) G |= G
{A B, B C} |= A C (F5), {A B, A C} |= A BC (F3) A D |= AB D (F2)
3.5.3.2. Редуцированные зависимости и множества F- зависимостей
Процесс удаления посторонних атрибутов называется редуцированием. Отсюда вытекает ряд определений.
Пусть F — множество F-зависимостей над схемой R и X→Y F.
Зависимость X Y называется редуцированной слева или полной, если она не содержит посторонних атрибутов в левой части.
- 102 -
Зависимость X Y называется редуцированной справа, если она не содержит посторонних атрибутов в правой части.
Зависимость X Y называется редуцированной, если она редуцирована слева и справа и Y .
Определения для зависимостей распространяются на множества F-зависимостей:
Множество F-зависимостей называется редуцированным (слева, справа), если каждая F-зависимость X Y F редуцирована (слева, справа).
Пример. Множество G = {A→BC, B→C, AB→D} не редуцировано слева и справа. Множество G = {A→BC, B→C, A→D} редуцировано слева, но не редуцировано справа. Множество G = = {A→B, B→C, AB→D} редуцировано справа, но не редуцировано слева. Множество G = {A→B, B→C, A→D} редуцировано справа, слева, не имеет пустых правых частей и, следовательно, редуцировано.
3.5.3.3. Алгоритм построения редуцированного покрытия
В ходе построения алгоритма редуцирования можно воспользоваться подходом, аналогичным тому, который использовался при нахождении неизбыточных покрытий, то есть просматривать все атрибуты и удалять их из F-зависимостей в том случае, если они являются избыточными.
Однако различный порядок редуцирования правых и левых частей приводит к тому, что результат получается разный. Редуцирование следует начинать с левых частей.
Другой особенностью редуцирования множеств F-зависимостей является возможность появления в результате зависимостей типа Y, даже если начинать с неизбыточного покрытия. Таким образом, необходимо последовательно выполнить три этапа: получение редуцированного слева покрытия, получение редуцированного справа покрытия и удаление из множества всех зависимостей вида Y .
Если множество G — редуцированное слева покрытие множества G, то каждое удаление постороннего атрибута A из левой части зависимости AX→Y приводит к появлению вместо нее зависимости X→Y и требуется проверить справедливость утверждения F {AX→Y}≡F {X→Y}, где F=G-{AX→Y}. Поскольку по аксиоме пополнения всегда справедливо X→Y AX→Y, то в результате будет получено более сильное множество G и, следовательно, проверять
- 103 -
выводимость из него множества G не имеет смысла, а стоит ограничиться только проверкой G G .
Если проверяемое множество неизбыточно, то проверку атрибута A на то, что он является посторонним, можно упростить и свести к проверке выводимости G X→A, поскольку ее выводим: {X→A, AX→Y} X→Y (F6).
Рассмотрим теперь алгоритм для удаления посторонних атрибутов из левых частей зависимостей из неизбыточного множества G, который возвращает редуцированное слева покрытие G:
LEFTRED(G) begin
F := G;
for каждая F-зависимость X Y G do for каждый атрибут A X do
if MEMBER(F, X A) then
F := (F - {X Y}) (X-A) Y;
return F end.
Теперь перейдем к удалению посторонних атрибутов из правых частей функциональных зависимостей. Заметим, что если G=F {X→AY} и G =F {X→Y}, то всегда справедливо утверждение G G , поскольку X→AY X→Y по F4. Для проверки эквивалентности G ≡ G достаточно проверить G G, что, в свою очередь, сводится к проверке G X→AY или в упрощенном виде к G X→A, поскольку F-зависимость X→Y G , а {X→Y, X→A} X→AY. На этом и базируется алгоритм редукции справа.
RIGHTRED(G) begin
F := G;
for каждая F-зависимость X Y G do for каждый атрибут A Y do
if MEMBER (F - {X Y} {X (Y-A)},X A) then F := (F - {X Y}) X (Y-A);
return(F)
end.
На основе рассмотренных алгоритмов можно получить алгоритм, позволяющий получить редуцированное покрытие множества F- зависимостей.
REDUCE(G) begin
F := G;
F := RIGHTRED(LEFTRED(G));
- 104 -
удалить все F-зависимости вида X→; return(F)
end.
Пример. Имеется G = {A→C, AB→DE, AB→CDI, AC→J}. LEFTRED(G) = G = {A→C, AB→DE, AB→CDI, A→J}, поскольку наличие A→C позволяет удалить C из AC→J. RIGHTRED(G ) = G = = {A→C, AB→E, AB→CDI, A→J}. Удален атрибут D из AB→DE (AB→CDI AB→D по F4) и атрибут C из AB→CDI (A→C AB→C
по F2).
3.5.3.4. Канонические покрытия
Данный вид покрытий дается на уровне определений и примеров.
Множество F-зависимостей G называется каноническим, если оно редуцировано, неизбыточно и каждая F-зависимость в нем имеет вид X A.
Пример. Требуется получить каноническое покрытие для множества G = {A BCE, AB DE, BI J}. Редуцированное слева покрытие G = {A BCE, A DE, BI J}, поскольку для атрибута B в AB DE выводится зависимость A B. Редуцировать множество справа необязательно, поскольку в правых частях канонического покрытия содержатся только одиночные атрибуты и при соблюдении условия неизбыточности исходного множества возможны только два варианта: отсутствие посторонних атрибутов справа и расщепление двух различных зависимостей на пересекающиеся множества, когда одинаковые зависимости поглощаются (из зависимостей A BCE и A DE генерируются две зависимости A E). После расщепления получаем множество G = {A B, A C, A E, A D, BI J}.
3.5.3.5. Структура неизбыточных покрытий
Как уже упоминалось, множество F-зависимостей может иметь несколько неизбыточных покрытий. Рассмотрим сходство между структурами этих покрытий.
Два атрибута X и Y эквивалентны относительно множества F- зависимостей F X Y, если F X Y и F Y X.
Пусть F и G эквивалентные неизбыточные множества F- зависимостей над схемой R, тогда для каждой зависимости X Y F существует зависимость V W G с X V.
- 105 -
Другими словами, для двух эквивалентных неизбыточных покрытий справедливо следующее утверждение: для каждой левой части F-зависимости из одного множества обязательно существует эквивалентная ей левая часть из другого множества.
Пример. Во множествах F={A BC, B A, AD E} и G={A ABC, B A, BD E} нет избыточных зависимостей и F G. Анализ левых частей показывает, что A A, B B и AD BD. Если первые два утверждения не вызывают сомнений, то третье легко выводится.
Вывод AD BD
1.AD AD (рефлексивность)
2.AD D (проективность из 1)
3.A BC (дано)
4.A B (проективность из 3)
5.AD B (пополнение из 4)
6.AD BD (аддитивность из 2 и 5) Вывод BD AB
1.BD BD (рефлексивность)
2.BD D (проективность из 1)
3.B A (дано)
4.BD A (пополнение из 3)
5.BD AD (аддитивность из 2 и 4)
Кроме того, отметим, что в обоих множествах левые части двух первых F-зависимостей эквивалентны (A B), следовательно, зависимости можно классифицировать по наличию у них эквивалентных левых частей. Для этого используется понятие класса эквивалентности.
Пусть F - множество F-зависимостей на схеме R и X R. Тогда множество зависимостей вида Y Z при условии, что X Y, будут образовывать один класс эквивалентности EF(X).
Объединение всех классов эквивалентности можно представить в виде множества EF = { | X R и EF(X) }.
Множество EF(X) может оказаться пустым, если в рассматриваемом множестве F-зависимостей отсутствуют зависимости с левой частью, эквивалентной X. Множество EF всегда является разбиением множества F. При двух заданных эквивалентных неизбыточных множествах F-зависимостей F и G множество F={A B, B A, AD E} и G={A ABC, B A, BD E} только тогда, когда EG(X) , а множество EF содержит столько же классов эквивалентности, сколько и множество EF
