- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 60 -
Контрольные вопросы
1.Выбрать всех студентов женского пола.
2.Выбрать всех студентов со средним баллом ниже 4.4.
3.Определить средний балл студентов группы 342.
4.Вывести всех студентов, обучающихся на ФВТ.
5.Отсортировать всех студентов по убыванию среднего балла.
6.Вывести всех студентов, у которых куратор Логинов.
7.Удалить всех студентов, у которых куратор Бабаев.
8.Увеличить на 0.2 средний балл у студента Балашова.
9.Создать подзапрос, в котором будут фамилия, пол и средний балл для студентов, у которых заведующий кафедрой Костров.
Глава 3. Математические основы реляционных баз данных
С начала семидесятых годов реляционная модель данных стала превалирующей в информационных системах, постепенно вытесняя предшествующие ей иерархическую и сетевые модели. Исторически первой появилась иерархическая, или древовидная, модель и достаточно долгое время именно она поддерживалась в большинстве СУБД. С течением времени связи между данными становились все сложнее и сложнее, что в конечном итоге привело к неспособности иерархической модели удовлетворять современным требованиям к информационным системам. Сложные связи стали поддерживаться сетевыми моделями данных.
Но процесс увеличения объема обрабатываемой информации постоянно сопровождался и одновременным, а иногда и опережающим ростом сложности зависимостей между используемыми данными. Связано это с тем, что растет не только количество информации, но и ее качество. Стали требоваться как дополнительные сведения об объектах систем, так и сведения, которые раньше не учитывались, поскольку они имели с основными объектами системы только косвенные связи, не учитывавшиеся ранее при машинной обработке из-за низких ресурсов ЭВМ.
Это привело к тому, что новые, более сложные данные поддерживались сетевыми структурами, но связи становились настолько трудно представимыми, что разобраться в них, а тем более эффективно работать становилось практически невозможно.
Вот тогда и настало время реляционной модели данных, за разработку которой Э.Ф.Кодд получил в 1981 году премию Тьюринга Американской ассоциации по вычислительной технике. Можно привести десятки причин, объясняющих триумфальное шествие реляционной модели, однако следует остановиться на двух основных.
- 61 -
Первая заключается в том, что наиболее привычной формой представления информации для человека с давних пор была именно табличная. Буквально все, что можно, человек стремился свести к табличному виду. Таблицы всегда просты, легко обозримы, привычны для восприятия.
Другая заключается в том, что табличное представление информации формализуется с помощью хорошо разработанного аппарата реляционной алгебры. Перед синтезом схем проводится семантический анализ данных, который позволяет представить все взаимосвязи между ними в предметной области информационной системы в виде набора функциональных (Functional), многозначных (Multi Valued) зависимостей и зависимостей соединения (Join). Использование полученных на этом этапе зависимостей позволяет синтезировать схемы реляционных баз данных, удовлетворяющие определенным наборам ограничений, которые называются нормальными формами. Операция получения схемы в определенной нормальной форме называется нормализацией, и мы еще к ней вернемся в этой главе. Другими словами, только реляционные базы данных можно строить строго научно, что позволяет избежать как избыточности при хранении, так и многих других аномалий данных, которые будут в дальнейшем рассмотрены.
Еще одним немаловажным фактором является возможность преобразования и иерархических, и сетевых структур данных к реляционной модели путем внесения некоторой избыточности, необходимой для организации связей между таблицами. Получаемая избыточность является как бы неотъемлемой частью реляционной базы данных и служит для хранения в логически связанных таблицах однотипных столбцов, через которые и устанавливается реляционная связь.
3.1. Отношения и их схемы
Таблицы, из которых строятся базы данных, называются отношениями и обладают рядом обязательных свойств, которые позволяют строить базы данных, поддерживающие целостность данных. Рассмотрим эти свойства на примере простейшего отношения, содержащего информацию о студентах определенной группы.
СТУДЕНТЫ
ФАМИЛИЯ |
ИМЯ |
ГРУППА |
СРЕДНИЙ |
ПОЛ |
|
БАЛЛ |
|||||
|
|
|
|
||
Балашов |
Андрей |
342 |
5.00 |
М |
|
Катеринченко |
Андрей |
342 |
4.59 |
М |
|
Колычева |
Лия |
349 |
4.38 |
Ж |
- 62 -
Малин |
Сергей |
345 |
4.87 |
М |
Никулкин |
Сергей |
342 |
4.79 |
М |
Фахрудинова |
Тамара |
342 |
4.12 |
Ж |
Чертков |
Максим |
344 |
4.31 |
М |
Приведем ряд определений, поясняющих основные моменты, связанные с отношениями.
Схемой отношения R называется конечное множество имен атрибутов (в дальнейшем будем называть их просто атрибутами) {A1, A2, ..., An}.
Каждому имени атрибута ставится в соответствие какое-то множество значений, которое может данный атрибут принимать (домен атрибута). Размеры этого множества могут меняться в зависимости от области проблемной ориентации системы. Например, если преподаватель выставляет оценку студенту определенной группы и система рассчитана на работу только с одной конкретной группой, то в это множество войдут только студенты указанной группы. В случае, когда система работает в масштабе факультета, будут рассматриваться уже все студенты, обучающиеся на данном факультете. На крайний случай для демонстрации домена хорошим примером служит множество дней недели {понедельник, вторник, среда, четверг, пятница, суббота, воскресенье} и множество рабочих дней недели {понедельник, вторник, среда, четверг, пятница}.
Формально мы будем обозначать домен атрибута Ai (множество Di) как dom(Ai). Будем считать, что D=D1 D2 ... Dn. Для обозначения кортежей отношения будем использовать символ ti, где i - порядковый номер кортежа в отношении. Таким образом, приведенное выше отношение можно представить в виде множества кортежей {t1, t2, t3, t4, t5, t6, t7}. Каждый кортеж можно рассматривать как совокупность значений атрибутов: так, кортеж t3 = < Колычева Лия 349 4.38 Ж >. Дадим формальное определение отношения.
Отношение r со схемой R, которое в дальнейшем будем обозначать как r(R), - это конечное множество отображений {t1, t2, ..., tp}из R в D, причем каждое отображение t r должно удовлетворять следующему ограничению: t(Ai) Di. Такие отображения называются кортежами.
В базах данных одним из наиболее важных свойств является уникальность кортежей в отношениях. Из этого следует, что в любом случае в любом отношении с помощью указания набора значений одного или нескольких атрибутов может быть однозначно выделена конкретная запись. Такое множество атрибутов называется ключом
- 63 -
отношения. Сразу следует заметить, что ключей у отношения может быть несколько и размер ключа может меняться от одного атрибута до R.
Дадим формальное определение ключа.
Ключом K отношения r является такой атрибут или группа атрибутов, которые однозначно определяют любую конкретную запись в любом допустимом экземпляре отношения r со схемой R. При этом в отношении не может быть двух кортежей t1 и t2 таких, что t1(K) = t2(K).
В примере ключом является атрибут {ФАМИЛИЯ}, поскольку во всех кортежах он имеет уникальное значение. Однако если изменить отношение, добавив к нему кортеж < Колычева Ольга 349 4.02 Ж >, то этот атрибут перестанет быть ключевым из-за наличия одинаковых значений. В этом случае ключом будет уже составной атрибут {ФАМИЛИЯ, ИМЯ }, хотя, как можно догадаться, и здесь могут встречаться дубли значений в произвольном экземпляре отношения. Задача выбора ключа является одной из наиболее важных при анализе данных. Рекомендуется при этом выбирать в его качестве атрибуты, которые в принципе не могут иметь дублей. В качестве примеров можно привести паспортные данные для произвольного гражданина России, номер студенческого билета для студента конкретного вуза, уникальный код предприятия и ряд других.
Если возникают проблемы с выбором ключа из уже существующих атрибутов, которые могут быть связаны с достаточно сложным его представлением, то в ряде случаев его можно создать искусственно, добавив к схеме отношения заведомо уникальный атрибут.
Приведенное выше отношение с точки зрения реляционной алгебры удовлетворяет следующим основным требованиям:
оно имеет уникальное имя (СТУДЕНТЫ);
каждый столбец имеет уникальное имя (ФАМИЛИЯ, ИМЯ, ГРУППА, СРЕДНИЙ БАЛЛ, ПОЛ);
отношение не имеет дублей кортежей;
значения всех атрибутов взяты из определенного множества допустимых значений, которые может принимать атрибут (домен атрибута);
отношение обладает ключом, то есть одним или
несколькими атрибутами, по которым всегда можно однозначно определить запись (в нашем случае
- 64 -
отсутствуют дубли фамилий) и, следовательно, можно в качестве ключа выбрать атрибут ФАМИЛИЯ.
Перед началом знакомства примем некоторые соглашения, которые в дальнейшем позволят нам обходиться без лишних комментариев при работе с базами данных и записывать информацию в более сжатом виде:
заглавными буквами из начала алфавита будем обозначать одиночные атрибуты;
заглавными буквами из конца алфавита будем обозначать составные атрибуты, которые в принципе могут быть и одиночными;
строчными буквами из начала алфавита будем обозначать значения атрибутов;
строчными буквами из конца алфавита будем обозначать отношения.
Таким образом, запись r(R), R=ABCD, t4=<a1b2c1d1> обозначает, что имеется отношение r со схемой R, в состав которой входят атрибуты ABCD, и для четвертого кортежа отношения атрибуты принимают следующие значения: A= a1, B= b2, C= c1 и D= d1.
Кроме того, схему отношения можно представлять в виде R[ABCD]. Также допускается выделение ключа подчеркиванием ключевых атрибутов в схеме. Так, для приведенной схемы с ключом AD будет справедлива следующая запись R[ABCD].
Над отношениями могут выполняться основные операции изменения данных: добавление, удаление и модификация данных. Рассмотрим, что представляют собой эти операции.
Предположим, что нам надо добавить в отношение кортеж t= < Горюнова Ольга 342 4.14 Ж >, содержащий информацию о студентке Ольге Горюновой.
Операция добавления новой записи в отношение может быть представлена в виде следующего оператора для отношения r(A1A2 ...
An):
ADD(r; A1 = d1, A2 = d2, ..., An = dn).
При фиксированном порядке атрибутов возможна более короткая запись, в которой указываются только значения элементов данных:
ADD(r; d1, d2, ..., dn).
Для нашего примера оператор будет выглядеть следующим образом:
ADD(студенты; Горюнова, Ольга, 342, 4.14, Ж).
Очевидно, что целью операции добавления является присоединение нового кортежа к уже существующему отношению.
- 65 -
Однако операция может не соответствовать поставленной задаче по ряду причин, из которых следовало бы выделить следующие:
1)схема добавляемого кортежа не соответствует схеме отношения, над которым выполняется операция: ADD(студенты; Горюнова, Ольга, Петровна, 342, 4.14, Ж), здесь добавляемый кортеж содержит атрибут ОТЧЕСТВО, не входящий в схему отношения студенты;
2)кортеж может содержать значения, не принадлежащие домену соответствующего атрибута, например в кортеже ADD(студенты; Горюнова, Ольга, 942, 4.14, Ж) номер группы 942 может не соответствовать ни одной группе, проходящей обучение в институте;
3)в кортеже могут содержаться дубли значений ключа, уже
хранящегося в отношении.
По любой из приведенных причин новый кортеж не может быть включен в отношение, и операция должна тем или иным способом сообщить о невозможности своего выполнения.
Следующая операция предназначена для удаления уже существующей записи из отношения r и имеет следующий вид:
DEL(студенты; ФАМИЛИЯ =Горюнова, ИМЯ = Ольга, ГРУППА = 342, СРЕДНИЙ БАЛЛ = 4.14, ПОЛ = Ж).
Аналогично операции добавления при удалении также допускается сокращенная форма записи при упорядоченной записи атрибутов в операции:
DEL(r; d1, d2, ..., dn).
На самом деле в отличие от операции добавления нам не требуется информация о содержании всех атрибутов удаляемой записи, а достаточно только ее однозначно определить, для чего определить значение какого-либо ключа. Так, если у нас в отношении имеется ключ K={B1, B2, ..., Bm}, то операцию удаления можно свести к следующему виду:
DEL(r; B1 = e1, B2 = e2, ..., Bn = en).
При выполнении возможны только два варианта. Во-первых, указанная запись может быть успешно удалена, и, во-вторых, удаление может и не произойти, когда запись не найдена.
Третий тип операции в принципе не является обязательным, так как обновление (модификация) записи в отношении может быть сведено к последовательности операций удаления и добавления, однако большая частота использования этой операции в реальной работе требует ее отдельного рассмотрения.
