- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 66 -
Если в отношении r меняются значения атрибутов {C1, C2, ...,Cp}, причем все приведенные атрибуты принадлежат схеме отношения, операция будет иметь следующий вид:
CH(r; A1 = d1, A2 = d2, ..., An = dn; C1 = e1, C2 = e2, ..., Cp = ep).
При наличии ключа K={B1, B2, ..., Bm} запись можно сократить до
CH(r; B1 = d1, B2 = d2, ..., Bm = dm; C1 = e1, C2 = e2, ..., Cp = ep).
3.2. Реляционные операторы
В предыдущей главе все операции проводились над отдельными кортежами отношений, где каждая из операций состояла как бы из трех составных частей. Первая идентифицировала отношение, над которым проводилось действие (рассматривались добавление, удаление и изменение), вторая указывала на конкретный кортеж отношения и третья показывала, какие конкретно значения должны принимать атрибуты.
Теперь настала пора рассмотреть операции, которые выполняются над целыми отношениями. Все операции над отношениями можно разделить на две основные группы: булевы операции реляционной алгебры и операторы реляционной алгебры.
3.2.1. Булевы операции
Булевы операции являются аналогом операций над множествами, где множествам соответствуют отношения, а элементам множеств — кортежи отношений.
Для всех булевых операций справедливо требование равенства схем, включенных в операцию отношений. Таким образом, мы будем рассматривать в качестве операндов пару отношений r(R) и s(R). Уделять много внимания этим операциям мы не будем, поскольку они достаточно просты для понимания. Поэтому дадим определения сразу для всех отношений, а уже потом рассмотрим примеры.
Результатом операции объединения отношений r(R) s(R) является отношение q(R), в которое входят все кортежи, принадлежащие или отношению r(R), или отношению s(R).
Результатом операции пересечения отношений r(R) s(R) является отношение q(R), в которое входят все кортежи, принадлежащие и отношению r(R), и отношению s(R).
Результатом операции теоретико-множественной разности
отношений r(R) — s(R) является отношение q(R), в которое
- 67 -
входят все кортежи, принадлежащие отношению r(R) и не принадлежащие s(R).
Кроме приведенных операций имеется еще ряд, отличающийся тем, что с ним связаны операции над доменами. Так, если dom(R) — множество всех кортежей над схемой R, то существует операция для определения множества кортежей, которые входят в dom(R), но не входят в r(R).
Дополнением отношения r со схемой R является результат операции q(R) = dom(R) — r(R) и обозначается как r.
К сожалению, определение домена отношения достаточно часто бывает затруднено из-за бесконечности или слишком большого значения доменов одного или нескольких доменов атрибутов, входящих в схему отношения. В этом случае и с доменом схемы работать практически невозможно.
Решается эта проблема введением понятия активного домена атрибута A относительно отношения r — adom(A,r). Активный домен представляет только те значения из домена, которые используются в конкретном отношении r. С понятием активного дополнения связано следующее определение:
Активным дополнением отношения r со схемой R является результат операции q(R) = dom(R) — r(R) и обозначается как
.
Рассмотрим примеры, иллюстрирующие использование приведенных операторов с учетом того, что активные домены атрибутов будут отличаться от их же доменов. Предположим при этом, что оба отношения обладают одинаковой схемой R=ABC, это отношения r(ABC) и s(ABC).
r ( A |
B C ) |
s ( A |
B C ) |
||||||
|
a1 |
b1 |
c1 |
|
|
a1 |
b2 |
c1 |
|
|
a1 |
b2 |
c1 |
|
a2 |
b2 |
c1 |
||
|
a2 |
b1 |
c2 |
|
a2 |
b2 |
c2 |
||
Тогда результаты выполнения основных операций можно
представить в следующем виде: |
|
|
|
|
|
|
|||
r∩s= ( |
A |
B |
C |
) |
r s= ( |
A |
B |
C ) |
|
|
a1 |
b2 |
c1 |
|
|
a1 |
b1 |
c1 |
|
|
|
|
|
|
|
a1 |
b2 |
c1 |
|
r-s = ( |
A |
B |
C |
) |
|
a2 |
b1 |
c2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 68 - |
|
|
|
r-s = ( |
A |
B |
C |
) |
a2 |
b2 |
c1 |
|
a1 |
b1 |
c1 |
|
a2 |
b2 |
c2 |
|
a2 |
b1 |
c2 |
|
|
|
|
Для простоты рассмотрения примеров дополнения и активного дополнения предположим, что домены атрибутов A и C совпадают с их активными доменами соответственно. Следует при этом заметить, что активные домены конкретных атрибутов для различных отношений, в отличие от приведенного примера, могут быть разными, но сами домены обязательно должны быть равны.
Таким образом, мы имеем adom(A,r) = adom(A,s) = dom(A) = { a1, a2} и adom(C,r) = adom(C,s) = dom(C) = {c1, c2}. С атрибутом B дело обстоит несколько иначе, поскольку его домен не совпадает с активными доменами на отношениях s и r: dom(B)= {b1, b2, b3}, adom(B,r)= {b1, b2}, adom(B,s)= { b2}. Тогда домен схемы R и дополнение отношения r примут вид:
dom(R) = ( |
A |
B |
C ) |
dom(R)-r ( |
A |
B |
C ) |
||
|
a1 |
b1 |
c1 |
|
|
a1 |
b1 |
c2 |
|
|
a1 |
b1 |
c2 |
|
a1 |
b2 |
c2 |
||
|
a1 |
b2 |
c1 |
|
a1 |
b3 |
c1 |
||
|
a1 |
b2 |
c2 |
|
a1 |
b3 |
c2 |
||
|
a1 |
b3 |
c1 |
|
a2 |
b1 |
c1 |
||
|
a1 |
b3 |
c2 |
|
a2 |
b2 |
c1 |
||
|
a2 |
b1 |
c1 |
|
a2 |
b2 |
c2 |
||
|
a2 |
b1 |
c2 |
|
a2 |
b3 |
c1 |
||
|
a2 |
b2 |
c1 |
|
a2 |
b3 |
c2 |
||
|
a2 |
b2 |
c2 |
|
|
|
|
|
|
|
a2 |
b3 |
c1 |
|
|
|
|
|
|
|
a2 |
b3 |
c2 |
|
|
|
|
|
|
При рассмотрении активного домена и активного дополнения следует отметить, что в отношении r атрибут B никогда не принимает значения b3, что приводит к значительному уменьшению количества кортежей в результирующем отношении, что достаточно хорошо иллюстрирует приведенные выше рассуждения о влиянии размера домена на результат операции дополнения.
adom(R,r) = ( |
A |
B |
C ) |
adom(R,r)-r ( |
A |
B |
C ) |
||
|
a1 |
b1 |
c1 |
|
|
a1 |
b1 |
c2 |
|
|
a1 |
b1 |
c2 |
|
a1 |
b2 |
c2 |
||
|
a1 |
b2 |
c1 |
|
a2 |
b1 |
c1 |
||
|
a1 |
b2 |
c2 |
|
a2 |
b2 |
c1 |
||
|
a2 |
b1 |
c1 |
|
a2 |
b2 |
c2 |
||
|
a2 |
b1 |
c2 |
|
|
|
|
|
|
|
a2 |
b2 |
c1 |
|
|
|
|
|
|
|
a2 |
b2 |
c2 |
|
|
|
|
|
|
- 69 -
3.2.2. Оператор выбора
Рассмотрим теперь реляционные операторы и в первую очередь оператор, позволяющий получить выборку кортежей из имеющегося отношения.
Пусть имеется отношение r со схемой R, атрибут A R и a — значение из dom(A), тогда результатом выполнения оператора
выбора, который обозначается как A=a(r), будет отношение
со схемой R, в которое войдут все кортежи из r, для которых t(A) = a.
Так, для приведенного в качестве примера отношения студенты результатом выполнения оператора выбора ИМЯ=“Сергей“(студенты)
студенты( |
ФАМИЛИЯ |
ИМЯ |
ГРУППА |
БАЛЛ |
ПОЛ ) |
|
|
|
|
|
|
|
|
|
Балашов |
Андрей |
342 |
5.00 |
М |
|
|
Катеринченко |
Андрей |
342 |
4.59 |
М |
|
|
Колычева |
Лия |
349 |
4.38 |
Ж |
|
|
Малин |
Сергей |
345 |
4.87 |
М |
|
|
Никулкин |
Сергей |
342 |
4.79 |
М |
|
|
Фахрудинова |
Тамара |
342 |
4.12 |
Ж |
|
|
Чертков |
Максим |
344 |
4.31 |
М |
|
будет следующее отношение:
студенты` = |
(ФАМИЛИЯ |
ИМЯ |
ГРУППА |
БАЛЛ |
ПОЛ ) |
|
|
|
|
|
|
|
|
|
Малин |
Сергей |
345 |
4.87 |
М |
|
|
Никулкин |
Сергей |
342 |
4.79 |
М |
|
Операторы выбора обладают рядом свойств, которые нам следует знать.
Они коммутируют относительно их композиции, то есть всегда имеет место тождество A=a( B=b(r))= B=b ( A=a(r)).
Так, в нашем примере результат выполнения двух последовательностей операторов будет одинаковым:
ИМЯ = “Сергей“( ГРУППА = 342(студенты) = |
|
|
|
|||
= ГРУППА = 342( ИМЯ = “Сергей“(студенты) |
|
|
|
|||
студенты``= |
(ФАМИЛИЯ |
ИМЯ |
ГРУППА |
БАЛЛ |
ПОЛ ) |
|
|
Никулкин |
Сергей |
342 |
4.79 |
М |
|
Другое свойство — дистрибутивность оператора выбора относительно бинарных булевых операций объединения, пересечения и теоретико-множественной разности, которые обозначим как :
