- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 106 -
Пример. Для множеств F={A BC, B A, AD E} и G={A ABC, B A, BD E}
EF(A) = {A BC, B A } EF(AD) = { AD E}
EF = {EF(A), EF(AD)} EG(A) = {A ABC, B A} EG(BD) = {BD E}
EF = {EG(A), EG(BD)}
3.5.4. Минимальные покрытия
Если рассмотреть два множества F-зависимостей F = {A B, B A, AC D, BC E} и G = {A B, B A, BC DE}, то можно заметить, что F G и каждое из этих множеств неизбыточно. С другой стороны, множество G содержит меньшее количество F-зависимостей, что для нас явно предпочтительнее. Этот факт приводит к необходимости рассмотрения еще одного вида покрытий.
Множество F-зависимостей F минимально, если нет другого эквивалентного ему множества с меньшим числом F- зависимостей.
Как видно из определения, минимальных покрытий у одного множества F-зависимостей может быть несколько. Любое минимальное покрытие одновременно является и неизбыточным, поскольку если в нем содержится избыточная зависимость, то она может быть удалена из него без изменения замыкания и, следовательно, существует эквивалентное множество с меньшим числом F-зависимостей.
3.5.4.1. Прямая определяемость
Если в определении неизбыточного покрытия указывалось явно на способ его получения (поиск и удаление избыточных F- зависимостей), то в определении минимальных зависимостей этого нет. Для их нахождения используется понятие прямой определяемости как частного вида функциональной определяемости.
Атрибут X прямо определяет атрибут Y (X →˙ Y) на схеме R относительно множества функциональных зависимостей F, если X Y R, а для F-зависимости X Y существует такое неизбыточное покрытие G множества F, у которого есть DDAграф H над F, такой что U(H) EF(X) = .
- 107 -
Другими словами, для множества F-зависимостей G возможно нахождение такого неизбыточного покрытия F, что F - EF(X) |= X Y.
Для прямой определяемости всегда справедливо следующее:
X →˙ X;
X →˙ Y |= X Y, при этом допускается EF(X) = ;
A →˙ B только при A = B.
Пример. Проверить справедливость AB →˙ J относительно множества G = {A CD, AB E, B I, DI J}. Построим сначала DDAграф H для F-зависимости AB J.
A
D
J
B
I
Как видно из графа, его используемое множество имеет вид: U(H) = { A CD, B I, DI J}, в то время как EF(AB) = {AB E}. Поскольку U(H) EF(AB) = , можно сделать вывод о существовании AB →˙ J относительно G.
Достаточно легко построить алгоритм проверки прямой определяемости X →˙ Y относительно множества G. Для этого необходимо рассматривать возможность выводимости F-зависимости X Y из множества F = G - EG(X). На первом этапе алгоритма определяется множество EG(X), а затем проверяется выводимость зависимости X Y.
DDERIVES(G, X →˙ Y) begin
F := G
for каждая F-зависимость U Z G if MEMBER (G, X U) then
if MEMBER (G, U X) then F := F - {U Z};
return (MEMBER (F, X Y)) end.
3.5.4.2. Вычисление минимальных покрытий
Непосредственно использовать понятие прямой определяемости для нахождения минимального покрытия достаточно трудоемко,
- 108 -
поскольку надо искать все неизбыточные покрытия множества G. Однако, к счастью, доказано, что если хотя бы одно неизбыточное покрытие влечет прямую определяемость, то это свойство распространяется и на остальные неизбыточные покрытия этого множества.
Не вдаваясь в подробности и доказательства, примем как должное, что если множества F-зависимостей F и G эквивалентны и минимальны, то для любого X будет справедливо утверждение |EF(X)|= = |EG(X)|, другими словами, судить о минимальности множества в целом можно по минимальности размеров всех классов эквивалентности, которую можно проверить на основании леммы, которая также приводится без доказательств.
Введем в рассмотрение еще одно множество, которое обозначим как eF(X) и которое будет представлять собой множество левых частей F-зависимостей из множества EF(X).
Пример. Для множества F-зависимостей F={A BC, B A, AD E}, EF(A)= {A BC, B A}, тогда eF(A)={A, B}.
Лемма. Если F - минимальное множество F-зависимостей, то для каждого класса эквивалентности EF(X) не существует двух зависимостей Y U и Z V таких, что Y →˙ Z.
На основании леммы строится алгоритм MINIMIZE, основанный на поиске класса эквивалентности, для которого справедливо Y U, Z V, Y →˙ Z, и последующей замене двух зависимостей Y U и Z V на одну зависимость Z UV.
MINIMIZE(G) |
|
|
|
||
begin |
|
|
|
||
F=NONREDUN(G); |
|
|
|
||
определить множество |
E |
F ; |
|
|
|
for каждая EF(X) EF do |
|
|
|
||
for каждая {Y U} EF(X) do |
|
|
|||
for каждая ({Z V} EF(X)) |
and ({Z V} |
{Y U}) do |
|||
if DDERIVES (F, Y |
→ Z) then |
|
|||
|
|
|
˙ |
|
|
F = (F - {Y U, |
Z V}) {Z UV}; |
|
|||
return (F) |
|
|
|
||
end. |
|
|
|
||
Пример. Для множества F-зависимостей F = {A B, B A, AC D, BC E} можно выделить два класса эквивалентности: EF(A) = ={A B, B A} и EF(AC) = {AC D, BC E}. Для класса EF(A) прямая определяемость A →˙ B и B →˙ A невозможна, поскольку в правой и
- 109 -
левой частях стоят одиночные атрибуты, а прямая определяемость возможна только в том случае, если они равны (свойства прямой определяемости).Используемое множество U(H) DDA-графа для зависимости AC BC U(H) = {A B}.
A->B
A B
C
Поскольку U(H) EF(AC) = , то можно утверждать, что AC→BC и, следовательно, зависимости AC D и BC E можно заменить на одну зависимость Z UV. Других классов эквивалентности у нас нет, и, следовательно, минимальное покрытие будет выглядеть следующим образом: F G = {A B, B A, BC DE}.
3.5.4.3. Оптимальные покрытия
В процессе упрощения множества F-зависимостей, характеризующего схему R или, проще говоря, взаимосвязь данных в рассматриваемой предметной области, можно продвинуться еще дальше за счет поиска минимального покрытия (которых в общем случае может быть несколько) не только с минимальным количеством F-зависимостей, но и с наименьшим числом атрибутных символов.
Пример. Два множества F={EC D, AB E, E AB} и G={ABC D, AB E, E AB} минимальны, но если множество G содержит 10 атрибутных символов, то множество F только 9.
Определение. Множество F-зависимостей G оптимально, если не существует другого множества F, эквивалентного G и имеющего меньшее количество атрибутных символов.
Оптимальное покрытие является одновременно редуцированным и минимальным. Действительно, если множество содержит посторонние атрибуты, то они могут быть удалены без изменения замыкания множества и, следовательно, исходное множество не оптимально. С другой стороны, если множество не минимально, то количество F-зависимостей может быть уменьшено по алгоритму MINIMIZE, который уменьшает количество атрибутных символов.
