- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 119 -
C{ ДОЦЕНТ СТУДЕНТ ДЕНЬ }[ ДОЦЕНТ=« Кузьмин »]( расписание)=4 {C{СТУДЕНТ }[ ДОЦЕНТ =« Кузьмин »]( расписание )=2
C{ ДЕНЬ}[ ДОЦЕНТ=« Кузьмин »](расписание)=2
C{ ДОЦЕНТ СТУДЕНТ ДЕНЬ }[ ДОЦЕНТ=« Петров »]( расписание)=2 {C{СТУДЕНТ }[ ДОЦЕНТ=« Петров »](расписание)=2
C{ ДЕНЬ}[ ДОЦЕНТ=« Петров »]( расписание)=2
C{ ДОЦЕНТ СТУДЕНТ ДЕНЬ }[ ДОЦЕНТ=« Потапов »]( расписание)=1 {C{СТУДЕНТ }[ ДОЦЕНТ =« Потапов »](расписание)=1
C{ ДЕНЬ}[ ДОЦЕНТ=« Потапов »]( расписание)=1
{C{ ДОЦЕНТ СТУДЕНТ ДЕНЬ }[ ДОЦЕНТ=« Гущин »]( расписание)=2 C{СТУДЕНТ }[ ДОЦЕНТ=« Гущин »]( расписание)=2
C{ ДЕНЬ}[ ДОЦЕНТ=« Гущин »]( расписание)=1
У нас имеется четыре значения атрибута ДОЦЕНТ, и для каждого из них выполняется условие c = c1 c2, следовательно, отношение расписание удовлетворяет многозначной зависимости ДОЦЕНТ >СТУДЕНТ.
Что касается отношения расписание, то здесь проверку не проходят кортежи, удовлетворяющие условию ДОЦЕНТ= «Кузьмин»:
C{ ДОЦЕНТ СТУДЕНТ ДЕНЬ }[ ДОЦЕНТ=« Кузьмин »]( расписание)=3 {C{СТУДЕНТ }[ ДОЦЕНТ=« Кузьмин »]( расписание )=2
C{ ДЕНЬ}[ ДОЦЕНТ =« Кузьмин »]( расписание)=2
На основе приведенной проверки дается еще одно определение многозначной зависимости.
Отношение r(R) удовлетворяет многозначной зависимости X >Y, если для каждого X-значения x и Y-значения y в r выполняется условие
cZ [X = x] (r) = cZ [ X Y = x y ] (r), где X Y R, Z = R - ( X Y ).
3.6.2. Многозначные и функциональные зависимости
После знакомства с многозначными зависимостями легко прийти к выводу о том, что они являются более общим видом зависимостей, чем функциональные. Определение многозначной зависимости не противоречит определению функциональной зависимости. Следовательно, если имеется отношение r(R) и X Y R, то когда
- 120 -
отношение r удовлетворяет F-зависимости X Y, то оно удовлетворяет и MV-зависимости X >Y.
Естественно возникает вопрос о том, какие многозначные зависимости можно определить на основе уже известного множества F-зависимостей F над схемой R. Уже выяснено, что если зависимость X Y принадлежит к замыканию F, то отношение удовлетворяет и MVзависимости X >Y . Также известно, что отношение обязательно будет удовлетворять и MV-зависимости X >R - XY.
Осталось проверить: существуют ли в отношении r MVзависимости, которые совершенно не связаны ни с одной из F- зависимостей с r? Отрицательный ответ можно получить из теоремы, которая приводится без доказательств.
Теорема. Имеется множество F-зависимостей F над схемой R. XZZ R и Z = R - (XY). Если ни X, ни Z не являются подмножествами X+, то существует отношение r, которое удовлетворяет F и не удовлетворяет MV-зависимости X >Y.
Из теоремы следует, что все MV-зависимости, выводимые из F- зависимостей, имеют вид X >Y , где Y X+ или R - (XY) X+.
Пример. Пусть R = ABCDEI и F = {A BC, C D}. В этом случае из F следует A >BCD, A >C, потому что A+ = ABCD, и не следует зависимость A >DE, так как ее правая часть DE не является подмножеством A+.
3.6.3. Аксиомы вывода для многозначных зависимостей
Ранее были определены MV-зависимости, которые можно было вывести из F-зависимостей, и теперь осталось определить, каким образом можно вывести MV-зависимости из множества MVзависимостей. Определим класс MV- и F-зависимостей, выводимых из класса MV- и F-зависимостей.
3.6.4. Только многозначные зависимости
Всего рассматривается семь аксиом, среди которых первые шесть можно рассматривать как аналоги аксиом вывода для F-зависимостей, а седьмую мы уже практически рассматривали. Предварительные условия: имеются r(R) и W, X, Y, Z — подмножества схемы R.
M1. |
Рефлексивность: X |
|
X. |
|
|
|
|
||
M2. |
Пополнение: X |
|
|
|
|
|
|
||
M3. |
Y ZX Y. |
|
|
|
|
||||
Аддитивность: |
|
|
|
Z |
X |
||||
|
X |
|
|
Y и X |
|
YZ. |
|||
M4. |
X — Y. |
|
|
|
|
|
- 121 - |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
X |
|
|
Y, X |
Z |
X |
X |
|
Y и X |
||||||||||||||
|
|
Проективность: |
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
M5. |
|
|
|
|
|
|
|
|
|
|
|
Y и Y |
|
|
Z |
|
X |
|
Z — Y. |
|
|
||||||
M6. |
Транзитивность: X |
|
|
|
|
||||||||||||||||||||||
|
|
Псевдотранзитивность: X |
|
|
Y и YW |
|
|
Z |
|
X W |
|
||||||||||||||||
M7. |
Z — (Y W). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
Y и Z = R — (X Y) |
X |
|
|
|
> Z. |
|
|
|||||||||||
|
|
Дополнение: X |
|
|
|
|
|
|
|
|
|||||||||||||||||
Пример. Пусть R = |
ABCDE и F = {A |
BC, DE |
|
|
C}, тогда можно |
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
вывести следующие MV-зависимости: |
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
1. |
A |
BC A |
|
DE (дополнение). |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
2. |
A DE, DE C A |
|
C (транзитивность). |
|
|
|
|
|
|
|
|||||||||||||||||
3. |
A C AD C |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
4. |
|
|
|
|
|
(пополнение). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
BE (дополнение). |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
AD C |
|
AD |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
зависимостям удовлетворяет отношение r(ABCDE). |
|
||||||||||||||||||||||||
Всем этим |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
r ( A |
B |
C |
D |
|
E) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
a |
b |
c |
d |
|
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a |
b |
c |
d |
|
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
a |
b |
c |
d |
|
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
a |
b |
c |
d |
|
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
a |
b |
c |
d |
|
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
3.6.5. Функциональные и многозначные зависимости
Множества, состоящие из многозначных и функциональных зависимостей, можно комбинировать только с помощью двух аксиом. Пусть имеются r(R) и W, X, Y, Z — подмножества R.
C1. X Y X >Y.
C2. X >Y, Z W, W R, Y Z= X W.
Пример. Имеется R = ABCDE и F = {A >BC, D C}. Согласно C2 выводится F-зависимость A C. Приведенное ниже отношение удовлетворяет F.
r( |
A |
B |
C |
D |
E ) |
|
|
a |
b |
c |
d |
e |
|
|
a |
b |
c |
d |
e |
|
|
a |
b |
c |
d |
e |
|
|
a |
b |
c |
d |
e |
|
3.6.6. Зависимости соединения
Рассмотренные нами виды зависимостей (F-зависимости и MVзависимости) позволяют производить декомпозицию отношений без потерь путем разделения их на два отношения, однако некоторые
- 122 -
отношения обладают свойством декомпозиции без потерь на число отношений больше, чем два, и не обладают этим свойством для любых двух из них.
Пример. Отношение r представлено своими проекциями:
r( A |
B |
C |
) AB(r) = A |
B |
AC(r) = A |
C BC(r) = |
B |
C |
||||
|
a1 |
b1 |
c1 |
|
a1 |
b1 |
|
a1 |
c1 |
|
b1 |
c1 |
|
a1 |
b2 |
c2 |
|
a1 |
b2 |
|
a1 |
c2 |
b2 |
c2 |
|
|
a3 |
b3 |
c3 |
|
a3 |
b3 |
|
a3 |
c3 |
b3 |
c3 |
|
|
a4 |
b3 |
c4 |
|
a4 |
b3 |
|
a4 |
c4 |
b3 |
c4 |
|
|
a5 |
b5 |
c5 |
|
a5 |
b5 |
|
a5 |
c5 |
b5 |
c5 |
|
|
a6 |
b6 |
c5 |
|
a6 |
b6 |
|
a6 |
c5 |
b6 |
c5 |
|
Отношение разлагается на проекции AB, AC, BC, но при этом не удовлетворяет ни одной MV-зависимости и, следовательно, не имеет декомпозиции без потерь на пары отношений по схемам R1 и R2 такие, что R1 ABC и R2 ABC.
Пусть R = {R1, R2, ..., Rp} — множество схем отношений над множеством атрибутов U, тогда отношение r(U) удовлетворяет зависимости соединения (J-зависимости) *[R1, R2, ..., Rp], если r разлагается без потерь на R1, R2, ..., Rp , то есть выполняется условие r=π rR1(r ) π R2 (r) ... π Rp(r ) .
Вместо записи *[R1, R2, ..., Rp] можно использовать следующую форму: *[ R].
Пример. Отношение r удовлетворяет зависимости соединения *[AB, AC, BC].
Для выполнения зависимости соединения *[R1, R2, ..., Rp] в отношении r(U) соблюдается равенство U = R1 R2 ... Rp. Также следует заметить, что многозначные зависимости являются частным случаем зависимостей соединения. Известно, что отношение r удовлетворяет многозначной зависимости X Y тогда, когда отношение разлагается
без потерь на два отношения со схемами R1 = XY и R2 = XZ, что по определению полностью совпадает с зависимостью соединения *[XY, XZ]. С другой стороны, зависимость соединения *[R1, R2] аналогична зависимости соединения R1 R2 > R1.
Определение, данное ранее для многозначных зависимостей, можно адаптировать для зависимостей соединения. В модернизированном виде оно будет выглядеть следующим образом:
