- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 145 -
устанавливать более раннюю версию, то можно установить последнюю следующей командой:
# zypper in postgresql-server Loading repository data...
Reading installed packages...
Resolving package dependencies...
The following 3 recommended packages were automatically selected:
postgresql12 postgresql12-llvmjit postgresql12-server The following 6 NEW packages are going to be installed:
postgresql postgresql12 postgresql12-llvmjit postgresql12-server postgresql-llvmjit postgresql-server
6 new packages to install.
Overall download size: 15.0 MiB. Already cached: 0 B. After the operation, additional 47.1 MiB will be used.
Continue? [y/n/v/...? shows all options] (y): y
После подтверждения установки (ввода y в ответ на предложение установить программное обеспечение) не более чем через минуту сервер базы данных будет установлен.
Теперь мы можем увидеть, что появился ранее не существовавший пользователь postgres, который является администратором сервера только что установленной СУБД:
# cat /etc/passwd | grep postgres postgres:x:26:26:PostgreSQL
Server:/var/lib/pgsql:/bin/bash
Сразу после установки в системе будет создан каталог для PostgreSQL в котором следует выделить подкаталог для размещения данных.
# ls /var/lib/pgsql/
.bash_profile
Для этого надо инициализировать PostgreSQL командой
initdb -D /var/lib/pgsql/data
После ее выполнения будет создан каталог /var/lib/pgsql/data, в котором будут созданы служебные файлы PostgreSQL.
4.2. Запуск и останов сервера PostgreSQL
Теперь можно запускать сервер PostgreSQL от имени пользователя postgres следующим образом:
user@localhost:~> su Password: *********
# su postgres
$ pg_ctl start -D /var/lib/pgsql/data/ -l /var/lib/pgsql/log
- 146 -
Вводить каждый раз расположение кластера базы данных с помощью параметра -D не очень удобно, поэтому лучше использовать переменную окружения PGDATA:
$ export PGDATA=/var/lib/pgsql/data $ pg_ctl start
Теперь можно проверять состояние сервера PostgreSQL, останавливать его и снова запускать (часть вывода не приводится):
$ pg_ctl status
pg_ctl: server is running (PID: 3113) /usr/lib/postgresql12/bin/postgres
$ pg_ctl stop
waiting for server to shut down.... done server stopped
$ pg_ctl start server started
4.2.1. Утилита psql
Этого достаточно для изучения PostgreSQL, а для его работы в промышленных условиях он запускается при старте операционной системы. Этот вопрос касается больше работы с операционными системами и здесь рассматриваться не будет.
Теперь можно начать сессию работы с базой данных от имени пользователя Postgres. Мы получим в результате сообщение о том, что пользователь - владелец базы данных соединился с сервером PostgreSQL.
> psql psql (12.6)
Type "help" for help.
postgres=#
Мы уже знаем, что есть язык SQL, на котором можно общаться с базой данных. Кроме него важно знать и метакоманды утилиты psql, которые позволяют выполнять ряд функций, не свойственных стандартному SQL. Подсказку по метакомандам можно получить в консоли метакомандой
\?
В результате на экран будет выведен полный список метакоманд, разделенных на группы:
-общие метакоманды;
-метакоманды подсказки;
-метакоманды работы с буфером запросов;
-метакоманды ввода-вывода;
-147 -
-метакоманды, реализующие условное выполнение блоков операторов;
-метакоманды, позволяющие получить информацию о базе данных;
-метакоманды форматирования;
-метакоманды для соединения с другими базами данных;
-метакоманды для взаимодействия с операционной системой;
-метакоманды для работы с внешними переменными;
-метакоманды для работы с большими объектами.
Важно запомнить, что выйти из режима подсказки можно нажатием клавиши q.
Мы можем посмотреть список всех баз данных для конкретного экземпляра PostgreSQL командой, часть вывода которой приведена ниже.
postgres=# \l |
|
|
|
|
|
List of databases |
|
||
Name |
| Owner |
| Encoding | |
Collate |
|
----------- |
+---------- |
+---------- |
+------------- |
|
postgres |
| postgres |
| UTF8 |
| en_US.UTF-8 |
|
template0 |
| postgres |
| UTF8 |
| en_US.UTF-8 |
|
template1 | postgres |
| UTF8 |
| en_US.UTF-8 |
||
(3 rows) |
|
|
|
|
Как видно, первоначально мы имеем 3 базы данных — системная база данных (словарь базы данных) и два шаблона, на основе которых можно создавать новые базы данных (их использовать необязательно).
4.2.2. Создание базы данных
Для прикладных задач требуется создание отдельных баз данных, что реализуется выполнением команды, синтаксис которой приведен ниже:
CREATE DATABASE name |
|
|
[ [ WITH |
] [ OWNER [=] user_name ] |
|
[ |
TEMPLATE [=] template |
] |
[ |
ENCODING [=] encoding |
] |
[ |
LC_COLLATE [=] lc_collate ] |
|
[ |
LC_CTYPE [=] lc_ctype |
] |
[ |
TABLESPACE [=] tablespace_name ] |
|
[ |
ALLOW_CONNECTIONS [=] |
allowconn ] |
[ |
CONNECTION LIMIT [=] connlimit ] |
|
[ |
IS_TEMPLATE [=] istemplate ] ] |
|
Как видно, единственным обязательным значением является имя новой базы данных. Остальные параметры позволяют задать имя владельца базы данных, шаблон, на базе которого создается база
- 148 -
данных, кодировку символов, табличное пространство, разрешение на подключение к этой базе данных, максимальное количество одновременных подключений к ней и шаблон, на основании которого база данных создается.
Для учебной работы достаточно указать имя базы данных и ее владельца. Если владельца не указать, то по умолчанию им станет суперпользователь PostgreSQL postgres. Попытка сделать владельцем незарегистрированного пользователя приведет к ошибке.
postgres=# CREATE DATABASE university OWNER rector; ERROR: role "rector" does not exist
postgres=# CREATE DATABASE university;
CREATE DATABASE |
|
|
|
postgres=# \l |
|
|
|
|
List of databases |
||
Name |
| Owner |
| |
Encoding |
------------ |
+---------- |
+ |
---------- |
postgres |
| postgres | |
UTF8 |
|
template0 |
| postgres | |
UTF8 |
|
template1 |
| postgres | |
UTF8 |
|
university |
| postgres | |
UTF8 |
|
(4 rows) |
|
|
|
Создав нового пользователя rector, мы можем создать новую базу данных, для которой он будет владельцем:
postgres=# CREATE ROLE rector LOGIN; CREATE ROLE
postgres=# CREATE DATABASE university OWNER rector; postgres=# \l
|
List of databases |
||
Name |
| Owner |
| |
Encoding |
------------ |
+---------- |
+ |
---------- |
postgres |
| postgres | |
UTF8 |
|
template0 |
| postgres | |
UTF8 |
|
template1 |
| postgres | |
UTF8 |
|
university |
| rector |
| |
UTF8 |
(4 rows) |
|
|
|
Теперь мы можем соединяться с нашей базой данных как пользователь rector, будучи зарегистрированными в операционной системе как пользователь user. С этого момента у нас есть возможность подключаться к конкретной базе данных с учетной записью базы данных rector от имени непривилегированного пользователя user операционной системы:
user@localhost:~> psql -U rector -d university psql (12.6)
