- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
-134 -
3.7.2.6.Нормальная форма вида «проекция-соединение»
Нормальная форма вида «проекция-соединение» (НФПС) — решение проблемы устранения избыточности при наличии в отношении зависимостей соединения. Для начала введем понятие тривиальной J-зависимости, которое аналогично тривиальной MVзависимости.
J-зависимость *[R 1, R 2, ..., R p ] называется тривиальной, если она удовлетворяется в любом отношении r со схемой R, и приложимой к R, если R = R 1 R 2 ... R p.
Следует заметить, что все тривиальные зависимости имеют вид *[R1, R2, ..., Rp], где Ri = R, для любого i от 0 до p.
Пусть R — схема отношения и F — множество F- и J- зависимостей над R. Схема R находится в НФПС относительно F, если для каждой J-зависимости *[R1, R2, ..., Rp], выводимой из F и приложимой к R, J-зависимость тривиальна или каждая схема Ri является суперключом R. Схема базы данных R находится в НФПС относительно F, если каждая из схем отношений R из R также находится в НФПС.
Пример. Пусть имеется схема R = A B C D E I и F = { *[ A B C D, C D E, B D I], *[A B, B C D, A D], A BCDE, BC AI}. Из F- зависимостей можно определить, что множество ключей схемы K = ={A,BC}. Отношение не находится в НФПС из-за зависимости *[ A B C D, C D E, B D I]. После декомпозиции по схемам R1 = A B C D ,
R2 = C D E и R3 = B D I схема базы данных R = {R1, R2, R3} будет находиться в НФПС, поскольку, хотя зависимость *[A B, B C D, A D]
приложима к схеме R1 = A B C D и не является тривиальной, каждое из составляющих ее множеств атрибутов включает в себя один из ключей схемы.
3.8. Алгоритмы синтеза схем баз данных
Существует достаточно большое количество алгоритмов, целью которых является построение схем реляционных баз данных, удовлетворяющих требованиям третьей нормальной формы. Рассмотрены будут только два: нормализация через декомпозицию и нормализация посредством синтеза. Алгоритмы для схем с MV- и J- зависимостями практически не разработаны, и рассматриваться будут только основные идеи.
-135 -
3.8.1.Нормализация через декомпозицию
Алгоритм сводится к тому, что берется отношение, которое включает все атрибуты из множества U (все атрибуты, с которыми может иметь дело система), анализируются зависимости между данными, и на их основе формируется множество F-зависимостей F. Это множество обрабатывается соответствующим образом: исключаются избыточные зависимости, удаляются посторонние атрибуты и, по возможности, ищется минимальное покрытие. Затем ищутся транзитивные зависимости и последовательно удаляются путем декомпозиции исходного отношения на два со схемами R1 и R2, для которых любое отношение, удовлетворяющее множеству F- зависимостей F, разлагается без потерь на R1 и R2. Возможно, одно из отношений не окажется в третьей нормальной форме, тогда для этого отношения процесс декомпозиции следует повторить. Декомпозиция повторяется до тех пор, пока все отношения не будут удовлетворять требованиям третьей нормальной формы. Следует добавить, что исходное отношение обязательно уже должно быть в первой нормальной форме, приведение к которой алгоритмизировать практически невозможно и поэтому оно остается целиком и полностью на совести разработчика.
Предположим, что существует транзитивная зависимость от ключа в схеме R. В схеме имеется ключ K R, множество атрибутов Y R и непервичный атрибут A R. Множество F влечет зависимости K Y и Y A, но не влечет Y K. Транзитивность удаляется разбиением на схемы R1 = R — A и R2 = Y A. Если для схемы имеются выделенные ключи R = ( S, K), то R1 = (S - A,K) и R2 = (YA, { Y }). Возможен случай, когда A оказывается частью одного из суперключей из K (A K), тогда в множестве K необходимо удалить A из K: K = (K - -K) {K - A}.
На практике процесс декомпозиции может быть значительно ускорен, если одновременно проверять на транзитивную зависимость от ключа не одиночный атрибут, а сразу несколько атрибутов в множестве R - (K Y), зависящих от Y. Эти атрибуты будут также транзитивно зависеть от ключа K и могут быть удалены одновременно.
Пример. Рассмотрим отношение, полученное при проведении системного анализа с небольшими упрощениями:
R = БИЛЕТ КНИЖКА СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ СПЕЦИАЛЬНОСТЬ СТАРОСТА КУРАТОР ЛЕКТОР ДОЛЖНОСТЬ КАФЕДРА ФАКУЛЬТЕТ ЗАВЕДУЮЩИЙ ДЕКАН ДИСЦИПЛИНА СЕМЕСТР ЛЕКТОР ОЦЕНКА.
K = { КНИЖКА ДИСЦИПЛИНА }.
- 136 -
Для приведенного отношения характерны следующие F- зависимости из множества:
F = {КНИЖКА ДИСЦИПЛИНА ОЦЕНКА,
КНИЖКА БИЛЕТ СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ, БИЛЕТ КНИЖКА СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ, ПАСПОРТ БИЛЕТ КНИЖКА СТУДЕНТ ГРУППА ПОЛ, СТУДЕНТ БИЛЕТ КНИЖКА ГРУППА ПАСПОРТ ПОЛ, БИЛЕТ ГРУППА, ГРУППА СПЕЦИАЛЬНОСТЬ СТАРОСТА КУРАТОР,
СПЕЦИАЛЬНОСТЬ КАФЕДРА, КАФЕДРА ФАКУЛЬТЕТ ЗАВЕДУЮЩИЙ ФАКУЛЬТЕТ ДЕКАН,
ДИСЦИПЛИНА СПЕЦИАЛЬНОСТЬ КАФЕДРА СЕМЕСТР ЛЕКТОР
ЛЕКТОР КАФЕДРА ДОЛЖНОСТЬ} Удаляем транзитивную зависимость атрибута ДЕКАН от ключа
через ФАКУЛЬТЕТ. В результате получим пару схем R1 и R2:
R1 = БИЛЕТ КНИЖКА СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ СПЕЦИАЛЬНОСТЬ СТАРОСТА КУРАТОР ЛЕКТОР ДОЛЖНОСТЬ КАФЕДРА ЗАВЕДУЮЩИЙ ФАКУЛЬТЕТ ДИСЦИПЛИНА СЕМЕСТР ОЦЕНКА ).
K1 = { КНИЖКА ДИСЦИПЛИНА }. R2 = ФАКУЛЬТЕТ ДЕКАН.
K2 = { ФАКУЛЬТЕТ }.
Отношение R2 находится в 3НФ и дальнейшей декомпозиции не требует, а из отношения R1 следует удалить транзитивную зависимость ЗАВЕДУЮЩИЙ ФАКУЛЬТЕТ от ключа через КАФЕДРА:
R11 = БИЛЕТ КНИЖКА СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ СПЕЦИАЛЬНОСТЬ СТАРОСТА КУРАТОР ЛЕКТОР ДОЛЖНОСТЬ КАФЕДРА ДИСЦИПЛИНА СЕМЕСТР ОЦЕНКА.
K11 = { КНИЖКА ДИСЦИПЛИНА }.
R12 = КАФЕДРА ЗАВЕДУЮЩИЙ ФАКУЛЬТЕТ.
K12 = { КАФЕДРА }.
Отношение R12 опять в 3НФ, а отношение R11 содержит транзитивную зависимость КАФЕДРА от ключа через СПЕЦИАЛЬНОСТЬ. После очередной декомпозиции получаем:
R111 = БИЛЕТ КНИЖКА СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ СПЕЦИАЛЬНОСТЬ СТАРОСТА КУРАТОР ЛЕКТОР ДОЛЖНОСТЬ ДИСЦИПЛИНА СЕМЕСТР ОЦЕНКА.
K111 = { КНИЖКА ДИСЦИПЛИНА }.
R112 = СПЕЦИАЛЬНОСТЬ КАФЕДРА.
- 137 -
K112 = { СПЕЦИАЛЬНОСТЬ }.
Удаляем транзитивную зависимость КУРАТОР СТАРОСТА СПЕЦИАЛЬНОСТЬ от ключа через ГРУППА:
R1111 = БИЛЕТ КНИЖКА СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ ЛЕКТОР ДОЛЖНОСТЬ ДИСЦИПЛИНА СЕМЕСТР ОЦЕНКА.
K1111 = { КНИЖКА ДИСЦИПЛИНА }.
R1112 = ГРУППА КУРАТОР СТАРОСТА СПЕЦИАЛЬНОСТЬ.
K1112 = { ГРУППА }.
Удаляем транзитивную зависимость БИЛЕТ СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ от ключа через КНИЖКА:
R11111 = КНИЖКА ЛЕКТОР ДОЛЖНОСТЬ ДИСЦИПЛИНА СЕМЕСТР ОЦЕНКА.
K11111 = { КНИЖКА ДИСЦИПЛИНА }.
R11112 = БИЛЕТ КНИЖКА СТУДЕНТ ГРУППА ПАСПОРТ ПОЛ. K11112 = { БИЛЕТ, КНИЖКА, СТУДЕНТ, ПАСПОРТ }.
Удаляем транзитивную зависимость ДОЛЖНОСТЬ от ключа через ЛЕКТОР:
R111111 = КНИЖКА ЛЕКТОР ДИСЦИПЛИНА СЕМЕСТР ОЦЕНКА.
K111111 = { КНИЖКА ДИСЦИПЛИНА }. R111112 = ЛЕКТОР ДОЛЖНОСТЬ.
K111112 = { ЛЕКТОР }.
Наконец, последняя декомпозиция позволяет удалить транзитивную зависимость ЛЕКТОР от ключа. Однако здесь уже видны некоторые недостатки метода декомпозиции — существует зависимость ДИСЦИПЛИНА СПЕЦИАЛЬНОСТЬ КАФЕДРА СЕМЕСТР ЛЕКТОР, которую трудно реализовать из-за отсутствия атрибута СПЕЦИАЛЬНОСТЬ, удаленного ранее. Этот атрибут необходимо добавить искусственно:
R1111111 = КНИЖКА ДИСЦИПЛИНА ОЦЕНКА. K1111111 = { КНИЖКА ДИСЦИПЛИНА }.
= СПЕЦИАЛЬНОСТЬ ДИСЦИПЛИНА ЛЕКТОР
K1111112 = { СПЕЦИАЛЬНОСТЬ ДИСЦИПЛИНА }.
Таким образом, получена схема реляционной базы данных
R= { R2, R12, R112, R1112, R11112, R111112,R 1111111, R1111112}.
3.8.2.Недостатки нормализации через декомпозицию
Как мы уже обратили внимание, на примере при нормализации через декомпозицию возникают новые проблемы.
- 138 -
Во-первых. Высокая временная сложность алгоритма, связанная с трудностью определения транзитивных зависимостей и непервичности атрибутов.
Во-вторых. Число порожденных алгоритмом отношений может оказаться большим, чем это действительно требуется для того, чтобы схема базы данных удовлетворяла условиям 3НФ.
Пример. R = A B C D E и F= {AB CDE, AC BDE, B C, C B, C D, B E}. Ключи схемы — AB, AC. При удалении транзитивной зависимости D от AB через C получаются схемы R1 = (ABCE, {AB, AE}) и R2 = (CD, {C}). Для R1 используем транзитивность B AB E и получаем окончательную схему базы данных R = {R11, R12, R2} = { (ABC, {AB, AE}), (BE, {B}), (CD, {C})}, хотя на самом деле имеется декомпозиция всего с двумя отношениями R = {R1, R2} = { (ABC, {AB, AC}), (BDE, {B} ) }.
В-третьих. При декомпозиции могут возникнуть частичные зависимости, которые могут привести в результате также к появлению лишних схем.
Пример. Для R = A B C D и F= {A BCD, BC D, C D}
удаление транзитивности A BC D приводит к схеме R1 = (ABC, {A}) и R2 = (BCD, {BC}), где последняя схема опять же должна быть подвергнута декомпозиции из-за транзитивности BC C D, которая возникает вследствие частичной зависимости D от ключа в R2, следовательно, будет получена схема R = { (ABC, {A}), (BCD, {BC}), (CD, {C})}, хотя в 3НФ находится схема R ={ (ABC, {A}), (CD, {C} )}. Причины избыточности можно было бы избежать, удалив предварительно избыточную зависимость BC D.
В-четвертых. Для построенной схемы данное множество может оказаться ненавязанным.
Пример. R = A B C D E и F= {A BCDE, CD E, E C B}. После исключения транзитивности A CD E, получается схема R = {(ABCD, {A}), (CDE, {CD})}. Зависимость E C B при этом не выводится из F-зависимостей в замыкании F, приложимых к схемам отношений из R.
В-пятых. Возможно порождение схем со «скрытыми» транзитивными зависимостями.
Пример. R = A B C D и F= {A B, B C } K = {AD}. Транзитивность A AD B приводит к схеме R = { (ACD, {AD}), (AB, {A}) }, которая формально находится в 3НФ, но в которой присутствует скрытая транзитивность AD B C.
