- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 70 -
A=a(r s) = A=a(r) A=a(s).
3.2.3. Оператор проекции
Другим часто встречающимся оператором является оператор проекции, который в отличие от оператора выбора получает результирующее отношение не в результате удаления кортежей, а в результате удаления столбцов. Дадим определение оператору.
Пусть имеется отношение r со схемой R, атрибут X R, тогда результатом выполнения оператора проекции, который
обозначается как X(r), будет отношение со схемой X, в которое войдут кортежи t(X) из r.
Проекция осуществляется в два этапа. На первом из отношения удаляются все столбцы из множества R-X, то есть не входящие в схему, на которую осуществляется проекция, а на втором удаляются дубли кортежей, которые могут появиться в том случае, когда пересечение множества X и атрибутов, составляющих ключ отношения, не пусто. В противном случае при удалении из отношения части ключа последний будет разрушен, что приведет к потере свойства уникальности кортежей в отношении и в нем могут появиться дубли. Поэтому на втором этапе проецирования удаляются дубли кортежей.
Предположим, что нам требуется выполнить операцию
r = {ИМЯ,ГРУППА}(студенты), тогда получим следующий результат:
r( |
ИМЯ |
ГРУППА |
) |
|
|
|
|
|
Андрей |
342 |
|
|
Лия |
349 |
|
|
Сергей |
345 |
|
|
Сергей |
342 |
|
|
Тамара |
342 |
|
|
Максим |
344 |
|
Легко можно заметить, что сократилось не только число столбцов, но и кортежей. Оператор проекции, как и выбора, обладает рядом свойств, которые мы и рассмотрим ниже.
Если последовательно |
выполняются две проекции X( Y(r)) и |
X — подмножество Y, то |
вторая проекция поглощает первую и |
справедливо следующее равенство: X( Y(r)) = X(r).
Другое свойство позволяет коммутировать проекцию с выбором, но здесь обязательным условием является нахождение атрибута для
- 71 -
выбора среди атрибутов, на которые производится проекция. В этом случае можно говорить, что справедливо
X( A=a(r)) = A=a( X(r)).
3.2.4. Оператор соединения
Третьим оператором, который можно с уверенностью отнести к основной группе операторов реляционной алгебры, является оператор соединения, который в отличие от двух предыдущих операторов является бинарным и служит для комбинирования двух отношений. В общем случае оператор не требует каких-то ограничений на схемы участвующих в соединении отношений, другими словами, можно соединять отношения r(R) и s(S) с любыми схемами R и S, которые могут иметь, а могут и не иметь общих атрибутов.
Пусть имеются два отношения r(R) и s(S), тогда результатом их соединения будет отношение q(RS) = r(R) s(S), где кортежи t(RS) с одинаковыми R S-значениями формируются как комбинации кортежей tr r и ts s с одинаковыми R S- значениями.
Таким образом, при отсутствии одинаковых атрибутов в схемах отношений r и s условие соединения будет выполняться всегда и результатом соединения окажется декартово произведение двух отношений q = r s. Использование такой операции не только лишено всякого смысла, но и приводит к формированию отношения, количество кортежей в котором равно произведению количества кортежей в первом отношении на количество кортежей во втором отношении. К сожалению, это не только чисто математический казус, но и суровая практика работы с системами управления базами данных, когда формирование запроса по двум не связанным таблицам может привести к бесцельной потере времени на получение результирующей таблицы, размер которой в несколько раз превышает свободное дисковое пространство.
Когда в соединяемых кортежах имеются атрибуты с одинаковыми доменами (предполагается, что они имеют одинаковые имена), то следует рассмотреть несколько случаев.
1. R S=K — отношения соединяются по первичным ключам, естественно, не имеющим дублей как в первом, так и во втором отношениях. С точки зрения реляционной алгебры такая операция лишена смысла, поскольку в процессе синтеза такая структура не должна быть создана и вместо двух отношений в схеме должно
- 72 -
присутствовать только одно. Однако ряд СУБД имеют ограничения на количество столбцов в таблице, что приводит к невозможности размещения в базе данных таблиц с большим количеством столбцов. Единственным здравым решением проблемы и является принудительное разбиение таблицы на несколько таблиц, связанных посредством основного ключа. При этом появляется некоторая избыточность за счет дублирования значений ключевого атрибута в нескольких таблицах, но это плата за расхождение теории и практики реляционных баз данных. В приведенном случае количество кортежей в исходных отношениях и в результирующем должны быть равны.
2.R S=K для одного отношения и R S K для другого отношения. В подобном случае реализуется связь между отношениями «один ко многим», когда таблицы связаны таким образом, что общий атрибут для одного отношения является ключом, а для другого — нет. Данный случай является наиболее часто используемым на практике.
3.R S K для обоих отношений. Дубли могут
встречаться как в первом, так и во втором отношениях. Случай характеризует наличие связи «многие ко многим». На практике такое случается при наличии сложных отношений между данными. При использовании подобных связей надо соблюдать максимальную осторожность.
Рассмотрим пример для второго случая, когда кроме отношения студенты у нас имеется отношение группы, дающее информацию о принадлежности группы к определенному факультету.
группы( ГРУППА ФАКУЛЬТЕТ )
340ФВТ
341ФВТ
344ФВТ
345ФВТ
349 |
ФВТ |
310 |
РТФ |
320 |
ФЭ |
Тогда результат выполнения операции студенты группы будет представлен отношением студенты`
студенты ( |
ФАМИЛИЯ |
ИМЯ |
ГРУППА |
БАЛЛ |
ПОЛ |
ФАКУЛЬТЕТ ) |
|
|
|
|
|
|
|
|
|
|
Балашов |
Андрей |
342 |
5.00 |
М |
ФВТ |
|
|
Катеринченко |
Андрей |
342 |
4.59 |
М |
ФВТ |
|
|
Колычева |
Лия |
349 |
4.38 |
Ж |
ФВТ |
|
|
Малин |
Сергей |
345 |
4.87 |
М |
ФВТ |
|
- 73 -
Никулкин |
Сергей |
342 |
4.79 |
М |
ФВТ |
Фахрудинова |
Тамара |
342 |
4.12 |
Ж |
ФВТ |
Чертков |
Максим |
344 |
4.31 |
М |
ФВТ |
В качестве информации к размышлению заметим, что в отношении группы может храниться информация о группах, относящихся к факультетам, на которых не учатся студенты из отношения студенты. С другой стороны, даже невооруженным глазом видно, что информация о принадлежности определенной группы к факультету явно избыточна, поскольку мы в четырех кортежах располагаем данными о том, что группа 342 относится к ФВТ.
Операция соединения обладает одним интересным свойством, которое позволяет использовать его как замену оператора выбораA=a(r). Для этого следует воспользоваться отношением s с единственным атрибутом A и единственным кортежем t = t(A) = {a}. Тогда операция соединения r s будет эквивалентна выбору A=a(r).
Так для получения на основе отношения студенты отношения, содержащего информацию только о студентах, обучающихся в группе 342, исходное отношение следует соединить с отношением выбор(ГРУППА) с единственным кортежем t = {342}, тогда результат будет выглядеть следующим образом:
Студенты выбор = r
r ( |
ФАМИЛИЯ |
ИМЯ |
ГРУППА |
БАЛЛ |
ПОЛ ) |
|
|
|
|
|
|
|
|
|
Балашов |
Андрей |
342 |
5.00 |
М |
|
|
Катеринченко |
Андрей |
342 |
4.59 |
М |
|
|
Никулкин |
Сергей |
342 |
4.79 |
М |
|
|
Фахрудинова |
Тамара |
342 |
4.12 |
Ж |
|
3.2.5. Другие операции на отношениях
В реляционной алгебре кроме рассмотренных операторов выбора, проекции и соединения имеется еще ряд операторов, которые, с одной стороны, выполняют более сложные функции, а с другой — реже используются. Рассмотрим их конспективно, не вдаваясь в подробности.
3.2.6. Оператор деления
Оператор деления позволяет делать более подробную выборку кортежей из отношения, совмещенную с проекцией. Предположим, что у нас имеется отношение оценки.
оценки ( |
ФАМИЛИЯ |
ИМЯ |
ПРЕДМЕТ |
ОЦЕНКА ) |
|
|
|
|
|
|
|
|
Балашов |
Андрей |
Физика |
5 |
|
|
Балашов |
Андрей |
Математика |
5 |
|
|
Балашов |
Андрей |
История |
5 |
|
