- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
|
|
- 80 - |
|
|
|
Григорьев |
2 |
|
|
|
Логинов |
4 |
|
|
|
Петровский |
3 |
|
|
|
Никонов |
1 |
|
|
Лекторы2 ( |
ЗВАНИЕ |
СТЕПЕНЬ |
МЕТКА ) |
|
|
|
|
|
|
|
профессор |
доктор |
1 |
|
|
профессор |
кандидат |
2 |
|
|
доцент |
доктор |
3 |
|
|
доцент |
кандидат |
4 |
|
Как видно из примера, при выполнении оператора вводится дополнительный столбец МЕТКА, который служит для восстановления исходного отношения путем соединения полученных отношений и удаления из них дополнительного столбца.
Если имеется отношение r со схемой R, атрибуты B1,B2, ...,Bm R и атрибут L R, то оператор FACTOR(r; B1,B2, ...,Bm; L) удаляет столбцы B1,B2, ...,Bm из отношения r, формирует из них новое отношение s и добавляет в оба отношения дополнительный столбец L.
Для примера оператор будет выглядеть следующим образом: FACTOR(лекторы; ЗВАНИЕ, СТЕПЕНЬ; МЕТКА)
Условие проверки можно записать как
лекторы = { ФАМИЛИЯ, ЗВАНИЕ, СТЕПЕНЬ}( лекторы1 лекторы2).
Более строгое определение оператора приводиться не будет, поскольку используется он достаточно редко как средство для поиска путей для эффективного хранения информации.
3.4. Функциональные зависимости
Перед разработчиками баз данных всегда стоят две взаимосвязанные задачи: повышение надежности и сокращение избыточности. Задача быстродействия, несмотря на ее очевидную актуальность, не может решаться в ущерб им. Для проектирования баз данных чрезвычайную важность представляют априорные знания о предметной области системы, в которую интегрируется база данных. Эти данные необходимо представить формально. В данном разделе мы будем представлять их в виде зависимостей между данными.
Основным видом зависимостей являются функциональные (Functional) или F-зависимости. Надо сказать, что именно зависимости данного типа составляют большую часть зависимостей между
- 81 -
данными и многие области применения баз данных имеют дело только с ними.
Кроме функциональных зависимостей будут рассматриваться многозначные зависимости (MV — Multi Valued) и зависимости соединения (J — Join). Более общие классы зависимостей рассматриваться не будут.
3.4.1. Определение
В самом общем случае функциональная зависимость является формальной записью ограничения, которое можно описать фразой «Атрибуту X соответствует только одно значение атрибута Y». Для примера приведем отношение, в котором для простоты будем считать, что у каждого студента уникальная фамилия. Ограничение вводится для того, чтобы не работать с обезличенными номерами студенческих билетов, зачетных книжек и так далее.
группы( ФАМИЛИЯ ПОЛ ГРУППА ФАКУЛЬТЕТ КАФЕДРА КУРАТОР )
Балашов |
М |
340 |
ФВТ |
ЭВМ |
Байков |
Катеринченко |
М |
342 |
ФВТ |
ЭВМ |
Сарычев |
Колычева |
Ж |
347 |
ФВТ |
САПР |
Телков |
Малин |
М |
331 |
ФТА |
АТ |
Федоров |
Никулкин |
М |
342 |
ФВТ |
ЭВМ |
Сарычев |
Фахрудинова |
Ж |
342 |
ФВТ |
ЭВМ |
Сарычев |
Чертков |
М |
343 |
ФВТ |
ВПМ |
Терехин |
Рассмотрим ограничения, накладываемые на приведенное отношение.
1.Каждому студенту соответствует один, конкретный половой признак.
2.Каждый студент обучается только в одной группе.
3.К каждой группе прикреплен один куратор.
4.Каждая группа относится к одному факультету.
5.Каждая группа относится к конкретной кафедре.
6.Каждая кафедра относится к конкретному факультету.
7.Каждый куратор работает на определенной кафедре.
Эти ограничения — типичный пример функциональных зависимостей, которые можно сформулировать следующим образом:
1.ПОЛ функционально зависит от атрибута СТУДЕНТ.
2.ГРУППА. функционально зависит от атрибута СТУДЕНТ.
3.КУРАТОР функционально зависит от атрибута ГРУППА.
4.ФАКУЛЬТЕТ функционально зависит от атрибута ГРУППА.
5.КАФЕДРА функционально зависит от атрибута ГРУППА.
6.ФАКУЛЬТЕТ функционально зависит от атрибута КАФЕДРА.
7.КАФЕДРА функционально зависит от атрибута КУРАТОР.
- 82 -
Можно дать и другое формальное описание функциональной зависимости на естественном языке, которое будет ближе к математической записи.
Для рассматриваемых семи зависимостей описание примет следующий вид:
1.СТУДЕНТ функционально определяет атрибут ПОЛ.
2.СТУДЕНТ функционально определяет атрибут ГРУППА.
3.ГРУППА функционально определяет атрибут КУРАТОР.
4.ГРУППА функционально определяет атрибут ФАКУЛЬТЕТ.
5.ГРУППА функционально определяет атрибут КАФЕДРА.
6.КАФЕДРА функционально определяет атрибут ФАКУЛЬТЕТ.
7.КУРАТОР функционально определяет атрибут КАФЕДРА. Наконец, приведем символическую запись функциональных
зависимостей:
1.СТУДЕНТ ПОЛ.
2.СТУДЕНТ ГРУППА.
3.ГРУППА КУРАТОР.
4.ГРУППА ФАКУЛЬТЕТ.
5.ГРУППА КАФЕДРА.
6.КАФЕДРА ФАКУЛЬТЕТ.
7.КУРАТОР КАФЕДРА.
Постараемся дать строгое определение функциональной зависимости.
Пусть имеется r — отношение со схемой R и атрибуты X R,
Y R, тогда отношение r удовлетворяет функциональной зависимости X Y, если Y( X=x(r)) имеет не более одного кортежа для любого X-значения x.
Множество X называется левой, а Y — правой частью функциональной зависимости X Y.
Определение можно интерпретировать следующим образом: если в отношении, удовлетворяющем функциональной зависимости X Y, имеются два кортежа t1 и t2 с одинаковыми X-значениями t1(X) = t2(X), то обязательно должно выполняться и t1(Y)=t2(Y). Такая интерпретация определения функциональной зависимости является основой алгоритма проверки наличия функциональной зависимости в отношении.
SATISFIES (r, X Y)
1.Пересортировать отношение r по X-столбцам так, чтобы кортежи с одинаковыми X-значениями оказались рядом.
-83 -
2.Если каждая совокупность кортежей с одинаковыми X- значениями имеет и одинаковые Y-значения, то алгоритм возвращает значение истина или ложь в обратном случае.
Проверим наличие функциональной зависимости КАФЕДРА ФАКУЛЬТЕТ для отношения группы:
группы( ФАМИЛИЯ |
ПОЛ |
ГРУППА |
ФАКУЛЬТЕТ КАФЕДРА |
КУРАТОР ) |
|||
|
|
|
|
|
|
|
|
|
Малин |
М |
331 |
ФТА |
АТ |
Федоров |
|
|
Чертков |
М |
343 |
ФВТ |
ВПМ |
Терехин |
|
|
Колычева |
Ж |
347 |
ФВТ |
САПР ВС |
Телков |
|
|
Балашов |
М |
340 |
ФВТ |
ЭВМ |
Байков |
|
|
Катеринченко |
М |
342 |
ФВТ |
ЭВМ |
Сарычев |
|
|
Никулкин |
М |
342 |
ФВТ |
ЭВМ |
Сарычев |
|
|
Фахрудинова |
Ж |
342 |
ФВТ |
ЭВМ |
Сарычев |
|
Здесь уже видно, что функциональная зависимость КАФЕДРА ГРУППА не выполняется в отношении, поскольку значению атрибута КАФЕДРА=ЭВМ соответствует несколько значений атрибута ГРУППА.
Понятие функциональной зависимости является одним из основных, и поэтому решено привести еще один вариант определения функциональной зависимости.
Пусть имеется отношение r со схемой R и атрибуты X R и Y R, тогда атрибут X функционально определяет атрибут Y, если в каждый конкретный момент времени каждому конкретному значению атрибута X соответствует только одно конкретное значение атрибута Y.
Рассмотрим два экстремальных случая, когда в качестве левой или правой частей функциональной зависимости используются пустые множества. Далее к зависимостям такого вида обращаться не будем, так как они представляют чисто академический интерес.
1.Функциональная зависимость X удовлетворяет любым отношениям.
2.Функциональная зависимость Y удовлетворяет только тем отношениям, в которых все значения атрибута Y имеют одинаковые значения.
3.4.2.Аксиомы вывода
Как видно из ранее изложенного материала, любое отношение в конкретный момент времени обладает определенным набором функциональных зависимостей, причем в одном случае отношение
- 84 -
удовлетворяет какой-либо функциональной зависимости, а в другом — нет. Рассмотрим на примере экземпляр отношения студенты:
студенты( |
ФАМИЛИЯ |
ИМЯ |
ГРУППА |
БАЛЛ |
ПОЛ ) |
|
|
|
|
|
|
|
|
|
Балашов |
Андрей |
342 |
5.00 |
М |
|
|
Колычева |
Лия |
349 |
4.38 |
Ж |
|
|
Малин |
Сергей |
345 |
4.87 |
М |
|
|
Фахрудинова |
Тамара |
342 |
4.12 |
Ж |
|
|
Чертков |
Максим |
344 |
4.31 |
М |
|
Формально данный экземпляр отношения удовлетворяет зависимостям ИМЯ ФАМИЛИЯ и БАЛЛ ГРУППА. Совершенно ясно, что такие зависимости появились в отношении совершенно случайно из-за того, что выборка кортежей недостаточно представительна.
Следовательно, возникает задача поиска такого семейства функциональных зависимостей, которым удовлетворяло бы любое допустимое отношение.
Это множество или семейство всегда будет конечным, так как левые и правые части функциональных зависимостей всегда представляют собой комбинации из атрибутов схемы отношения, число которых конечно. Однако число комбинаций при достаточно большом количестве атрибутов в схеме может оказаться достаточно большим. Использование при этом рассмотренного выше алгоритма потребует большого количества времени.
Другим методом является возможность вывода функциональной зависимости, если некоторые зависимости уже известны. Будем опираться при этом на следующее понятие:
Множество функциональных зависимостей F влечет функциональную зависимость X Y (F X Y), если каждое отношение, удовлетворяющее зависимостям из F, удовлетворяет и зависимости X Y.
Для того чтобы проверять возможность выводимости функциональных зависимостей, используются аксиомы вывода, которые можно рассматривать как правило, которое устанавливает, что если отношение удовлетворяет определенному набору функциональных зависимостей, то оно удовлетворяет и некоторому другому набору функциональных зависимостей.
Рассмотрим множество аксиом вывода, состоящее из шести аксиом. Предположим, что X, Y, Z и W - подмножества схемы R, тогда справедливы следующие аксиомы:
