- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
-110 -
3.5.5.Составные функциональные зависимости
Ранее мы рассматривали разбиение множества функциональных зависимостей на классы с эквивалентными левыми частями. Каждый класс эквивалентности может быть представлен в виде специальной нотации — составной функциональной зависимости, которая является не чем иным, как просто более компактной формой записи набора F- зависимостей, принадлежащих к одному классу.
Составная функциональная зависимость (CF-зависимость), имеющая вид (X1, X2, ... , Xk) Y, представляет собой множество F-зависимостей Xi Xj, Xi Y на схеме R при условии 1 i,j k.
По аналогии с терминологией функциональных зависимостей (X1, X2, ... , Xk) называется левой частью, Y - правой частью составной функциональной зависимости, а Xi - левые множества. Правая часть в составной функциональной зависимости может отсутствовать, в этом случае запись будет иметь вид (X1, X2, ... , Xk).
Пример. F = {A B, B A, AC D, BC E}. Зависимости из данного множества можно представить в виде множества из двух CFзависимостей следующим образом: G={(A,B),(AC,BC) DE}. В первой составной F-зависимости отсутствует правая часть.
Понятие эквивалентности для CF-зависимостей используется так же, как и для F-зависимостей. То есть если имеется множество CFзависимостей F и множество F-зависимостей и (или) CF-зависимостей, то они эквивалентны, если каждое отношение r(R), удовлетворяющее F, удовлетворяет G и наоборот.
Аналогично и относительно покрытий. Множество F является покрытием G, если F G, а множества F и G состоят из F- зависимостей, CF-зависимостей или из зависимостей обоих типов.
Пример. Имеется множество F = {A B, B A, AC D, BC E}, состоящее из одних F-зависимостей, множество G ={(A,B), (AC,BC) DE}, состоящее из одних CF-зависимостей, и множество G = {(A,B), A B, B A }, состоящее из зависимостей обоих видов. Все эти множества эквивалентны.
Множество F-зависимостей F является характеристическим множеством для CF-зависимости (X1, X2, ... , Xk) Y, если F {(X1, X2, ... , Xk) Y}. Если каждое левое множество из CF-зависимости встречается в левой части F-зависимостей характеристического множества F точно один раз, то
- 111 -
множество F называется естественным характеристическим множеством.
Пример. Для CF-зависимости (A,B) характеристическим множеством является F={A B, B A}, а для CF-зависимости (AC,BC) DE — одно множество G={AC BC, BC AC, BC DE}, а другое — G = {AC B, BC A, BC DE}. Для первой CFзависимости характеристическое множество одновременно является и естественным, поскольку оба левых множества A и B в точности по одному разу входят в левые части зависимостей множества F. Для второй CF-зависимости оба множества G и G являются характеристическими, но не естественными, поскольку левое множество BC в обоих случаях дважды входит в левые части F- зависимостей. Естественным характеристическим множеством будет F ={AC BD, BC AE}.
Естественных характеристических множеств может быть несколько. Наибольший интерес из них представляет множество вида {X1 X2, X2 X3, ..., Xk-1 Xk, Xk X1Y}, которое легко представляется в виде кольца.
X4 |
Xk-1 |
|
X3 |
Xk |
Y |
X2 |
X1 |
|
Такое множество носит название кольцевого естественного характеристического множества CF-зависимости (для краткости будем называть его просто кольцевым множеством).
Пример. Для CF-зависимости (A,B) кольцевым множеством также является F={A B, B A}, а для CF-зависимости (AC,BC) DE
— множество G={AC BC, BC ACDE}.
Таким образом, множество CF-зависимостей можно рассматривать как объединение характеристических множеств всех CF-зависимостей. Отсюда следует, что практически все рассуждения, которые приводились для функциональных зависимостей, справедливы и для CF-зависимостей.
-112 -
3.5.6.Кольцевые покрытия
Определение. Множество CF-зависимостей F называется кольцевым, если не существует различных CF-зависимостей с левыми множествами X и Z таких, что X Y в F.
Поскольку множества CF-зависимостей подчиняются тем же правилам, что и множества F-зависимостей, то все алгоритмы, которые нами рассматривались, могут быть адаптированы для работы с CFзависимостями.
Становится совершенно ясно, что для множества F-зависимостей G можно найти кольцевое покрытие с количеством CF-зависимостей, не превышающим |EF|, где F - неизбыточное покрытие G. Для этого все F-зависимости одного класса эквивалентности представляются одной CF-зависимостью, где левые множества образуются из множеств eF(X), а правая часть получается путем объединения всех правых частей из
EF(X).
Пример. Для неизбыточного множества F={A BC, B AD, AE I,BE IJ}существуют EF = {EF(A), EF(AE)}, где EF(A) = {A BC, B AD}, EF(AE)= {AE I,BE IJ}, eF(A)={A,B}, eF(AE)={AE, BE}. В этом случае можно получить кольцевое покрытие G={(A, B) ABCD, (AE, BE) IJ}.
С решением обратной задачи могут возникнуть сложности, связанные с тем, что при переходе от кольцевого покрытия к множеству F-зависимостей путем объединения характеристических множеств всех CF-зависимостей этого покрытия с числом CFзависимостей, равным |EF|, что интуитивно предполагает получение неизбыточного множества F-зависимостей, такого результата может не получиться.
Пример. Множество G={(A, AB, B) CD, (AE) IJ} - кольцевое покрытие для множества F={A BC, B AD, AE I, BE IJ}, рассмотренного в предыдущем примере, после объединения естественных характеристических множеств будет преобразовано к виду F ={A AB, AB B, B ACD, AE IG}. Действительно, множество G имеет две CF-зависимости, а множество F F имеет два класса эквивалентности, однако полученная зависимость AB B является избыточной, поскольку AB B.
Если G — множество CF-зависимостей, содержащее (X1, X2, ... , Xk) Y, при этом A Xi, тогда атрибут A называется перемещаемым, если его можно перенести из Xi в Y без
- 113 -
изменения эквивалентности G. Левое множество перемещаемо, если его можно целиком перенести в Y.
При перемещении левого множества следует руководствоваться следующими соображениями: все левые множества эквивалентны и если одно из них является собственным подмножеством другого левого множества, то возникает ситуация, когда естественное характеристическое множество будет содержать зависимости вида AX X. Наличие зависимостей такого вида говорит о наличии избыточности и позволяет перенести множество в правую часть.
Пример. В зависимости (A, AB, B) CD множество AB можно переместить в правую часть, и тогда множество CF-зависимостей из предыдущего примера можно будет представить в следующем виде: G ={(A, B) ABCD, (AE) IJ}, его, в свою очередь, можно представить в виде уже неизбыточного множества F-зависимостей, сформированного объединением естественных характеристических множеств F ={A B, B ABCD, AE IJ}.
Определение. Кольцевое множество CF-зависимостей G неизбыточно, если из него нельзя удалить ни одну CFзависимость и если ни одна CF-зависимость не содержит перемещаемых левых множеств.
Пример. Множество G={(A, AB, B) CD, (AE) IJ} - избыточно, поскольку оно содержит перемещаемое левое множество AB, а множество G ={(A, B) ABCD, (AE) IJ} — неизбыточно.
Таким образом, неизбыточные кольцевые множества позволяют получить неизбыточные множества F-зависимостей при объединении естественных характеристических множеств для всех CF-зависимостей из кольцевого множества.
Определение. CF-зависимость {(X1, X2, ... , Xk) Y} G, где G — неизбыточное кольцевое множество, называется редуцированной, если левые множества не содержат перемещаемых атрибутов, а правые части – посторонних.
Пример. Множество G={(A, AB, B) CD, (AE) IJ} содержит перемещаемое левое множество, множество G ={(A, B) ABCD, (AE) IJ} содержит посторонние атрибуты AB в правой части CFзависимости (A, B) ABCD, следовательно, оба множества не являются неизбыточными кольцевыми множествами, а множество G ={(A, B) CD, (AE) IJ} удовлетворяет этим условиям.
