О курсе
Курс «Базы данных» знакомит с теорией и практикой реляционных баз данных — от модели данных и языка SQL до внутреннего устройства современной СУБД и её использования в приложениях. Курс рассчитан на читателя без предварительной подготовки: каждое понятие вводится с нуля; цель — научиться проектировать схему базы данных для предметной области, писать на SQL запросы любой сложности, объяснять по плану выполнения, почему запрос медленный, выбирать уровень изоляции транзакций, организовывать резервное копирование и правильно работать с базой из программы.
Курс построен вокруг трёх идей. Первая — модель прежде синтаксиса: язык SQL изучается как способ записи операций реляционной алгебры, проектирование — через функциональные зависимости и нормальные формы, поэтому знания переносятся на любую реляционную СУБД. Вторая — понимание того, что происходит внутри: индексы, планировщик, многоверсионность и журнал рассматриваются не как «настройки», а как механизмы, поведение которых можно предсказать и наблюдать средствами самой СУБД. Третья — единая учебная база: все примеры и лабораторные работы строятся на одной базе данных книжного интернет-магазина «Книжный узел», которую можно сгенерировать в двух масштабах — от двух тысяч книг для первых запросов до миллиона заказов для экспериментов с производительностью. Учебная СУБД — PostgreSQL 16; особенности реализации всегда отделяются от общих принципов.
Что даёт курс
- Понимание реляционной модели, ключей и ограничений целостности, реляционной алгебры и соответствия ей конструкций SQL.
- Умение проектировать схему базы данных по требованиям предметной области (модель «сущность — связь», функциональные зависимости, нормальные формы до НФБК) и обосновывать решения.
- Умение писать на SQL запросы с соединениями, подзапросами, группировкой, оконными функциями и рекурсией, изменять данные; учитывать трёхзначную логику SQL (NULL).
- Знание устройства хранения и индексов (B-дерево, GIN, BRIN), умение читать план выполнения запроса, находить причину низкой производительности и устранять её.
- Понимание свойств ACID, аномалий параллельного доступа, уровней изоляции, MVCC и журнала упреждающей записи; умение выбирать уровень изоляции и способ блокировки.
- Умение создавать функции, процедуры и триггеры на PL/pgSQL и разрабатывать приложения на Python (psycopg 3), работающие с базой безопасно и эффективно.
- Умение выполнять резервное копирование и восстановление, разграничивать права доступа; представление о масштабировании, теореме CAP и нереляционных системах.
- Владение
psql, системным каталогом и представлениями статистики,EXPLAIN (ANALYZE, BUFFERS),pg_stat_statements,pageinspect,pg_dump,pg_restore,pg_basebackup,pgbench.
Связь с другими курсами
Курс опирается на программирование на Python на уровне первого курса, базовые навыки работы в командной строке Linux и дискретную математику (множества, отношения, логика высказываний и предикатов). Специальной подготовки по базам данных не требуется. Результаты курса пригодятся в курсах «Разработка Web-приложений», «Облачные технологии», по анализу данных, распределённым системам, информационной безопасности и в дипломной работе.
Темы курса
Каждая тема включает лекцию (вкладка «Теория»), лабораторную работу, для двух тем — практическое занятие, и дополнительные материалы (вопросы для самопроверки, глоссарий, шпаргалка, аннотированный список литературы и ресурсов).
| № | Тема | Раздел | Практика |
|---|---|---|---|
| 1 | Введение в базы данных и СУБД | Реляционная модель и язык SQL | ЛР 1 |
| 2 | Реляционная модель данных и ограничения целостности | Реляционная модель и язык SQL | ЛР 2 |
| 3 | Реляционная алгебра и основы запросов SQL | Реляционная модель и язык SQL | ПЗ 3, ЛР 3 |
| 4 | Соединения и подзапросы | Реляционная модель и язык SQL | ЛР 4 |
| 5 | Агрегирование, группировка и оконные функции | Реляционная модель и язык SQL | ЛР 5 |
| 6 | Изменение данных, общие табличные выражения и представления | Реляционная модель и язык SQL | ЛР 6 |
| 7 | Концептуальное проектирование: модель «сущность — связь» | Проектирование баз данных | ЛР 7 |
| 8 | Функциональные зависимости и нормализация | Проектирование баз данных | ПЗ 8, ЛР 8 |
| 9 | Физическое проектирование: типы данных, хранение и полуструктурированные данные | Проектирование баз данных | ЛР 9 |
| 10 | Индексы | Внутреннее устройство и производительность | ЛР 10 |
| 11 | Выполнение и оптимизация запросов | Внутреннее устройство и производительность | ЛР 11 |
| 12 | Транзакции и управление параллельным доступом | Внутреннее устройство и производительность | ЛР 12 |
| 13 | Журнал, восстановление и резервное копирование | Внутреннее устройство и производительность | ЛР 13 |
| 14 | Программирование на стороне сервера: функции, процедуры, триггеры | Базы данных в приложениях | ЛР 14 |
| 15 | Базы данных в приложениях и безопасность | Базы данных в приложениях | ЛР 15 |
| 16 | За пределами одного сервера: масштабирование, NoSQL и аналитические системы | Базы данных в приложениях | ЛР 16 |
Учебная среда
Все лабораторные работы выполняются в PostgreSQL 16. Рекомендуемая платформа — Ubuntu 24.04 LTS: установленная на компьютер, в виртуальной машине (VirtualBox, VMware, Hyper-V, UTM) или в подсистеме WSL2 на Windows. В Ubuntu 24.04 версия 16 входит в стандартный репозиторий:
sudo apt update
sudo apt install -y postgresql postgresql-contrib python3-psycopg python3-venv
sudo -u postgres createuser --superuser "$USER"
createdb bookstore
В WSL2 без systemd сервер запускается командой sudo service postgresql start. Допустима и установка PostgreSQL 16 на Windows или macOS (официальные сборки с postgresql.org) либо запуск в контейнере Docker — различия в этих средах в лабораторных работах не разбираются.
Учебная база «Книжный узел» создаётся в первой лабораторной работе из двух скриптов архива окружения: schema.sql (таблицы и ограничения) и data.sql (детерминированный генератор данных; у всех получаются одинаковые строки). Масштаб scale=1 (2 тыс. книг, 5 тыс. покупателей, 20 тыс. заказов) используется в темах 1–9 и 14–16, масштаб scale=50 (100 тыс. книг, 250 тыс. покупателей, 1 млн заказов, около 450 МБ) — в темах 10–13. К остальным лабораторным работам прилагаются архивы окружения со скриптами подготовки, данными и программами самопроверки.
Минимальные требования: 4 ГБ ОЗУ, 5 ГБ свободного места, доступ в Интернет на этапе установки пакетов.
Как работать с материалами
Тема изучается в следующем порядке.
- Теория. Лекция читается целиком, с остановками на схемах и примерах. Каждый запрос из лекции полезно выполнить на своей учебной базе и сравнить результат с приведённым: данные детерминированы, поэтому результаты должны совпасть. Ссылки в тексте вида ¹ ведут к списку литературы в конце темы; к документации PostgreSQL и классическим статьям стоит обращаться, когда хочется понять, почему механизм устроен именно так.
- Дополнительно. Вопросы для самопроверки показывают, усвоен ли материал: если на вопрос не удаётся ответить своими словами, соответствующий раздел стоит перечитать. Глоссарий и шпаргалка нужны во время лабораторной работы.
- Лабораторная работа или практическое занятие. Главный принцип — предсказать, затем проверить: прежде чем выполнить запрос, следует записать, сколько строк он вернёт, какой план выберет планировщик, что увидит вторая транзакция, — а после объяснить расхождение. Базовая часть работы — основная, продвинутая углублённая и выполняется по желанию.
Темы следует проходить по порядку. Если хочется сократить путь, минимальная траектория, дающая цельную картину, — темы 1–5, 7, 8, 10, 11, 12 и 15.
Итоговые вопросы для самопроверки
Вопросы охватывают весь курс; если на вопрос не удаётся ответить своими словами, стоит вернуться к соответствующей теме.
- База данных и СУБД. Преимущества СУБД перед файлами. Трёхуровневая архитектура ANSI/SPARC и независимость данных.
- Архитектура PostgreSQL: процессы, кластер, базы данных, схемы, роли.
- Реляционная модель: домен, атрибут, кортеж, отношение. Отличия таблицы SQL от отношения.
- Ключи: суперключ, потенциальный, первичный, внешний. Естественные и суррогатные ключи.
- Ограничения целостности в SQL. Ссылочная целостность и действия при удалении и изменении.
- Значение NULL и трёхзначная логика. Типичные ошибки при работе с NULL.
- Операции реляционной алгебры. Деление и его выражение в SQL.
- Логический порядок выполнения запроса SELECT. Сортировка, ограничение числа строк, операции над множествами.
- Внутренние и внешние соединения. Условие в ON и в WHERE для внешнего соединения.
- Подзапросы: скалярные, табличные, коррелированные. EXISTS, IN, ANY/ALL. Полусоединение и антисоединение.
- Агрегатные функции и группировка. WHERE и HAVING. GROUPING SETS, ROLLUP, CUBE.
- Оконные функции: разделы, порядок, рамка окна. Ранжирование и накопительные итоги.
- Изменение данных: INSERT, UPDATE, DELETE, RETURNING, ON CONFLICT, MERGE.
- Общие табличные выражения и рекурсивные запросы.
- Представления: обновляемые и материализованные представления.
- Модель «сущность — связь»: сущности, атрибуты, связи, кардинальность, слабые сущности. Преобразование в реляционную схему.
- Отображение наследования в реляционные таблицы: три способа и их сравнение.
- Аномалии модификации. Функциональные зависимости, аксиомы Армстронга, замыкание множества атрибутов.
- Нормальные формы: 1НФ, 2НФ, 3НФ, НФБК. Декомпозиция без потерь и с сохранением зависимостей.
- Денормализация: цели, способы и цена.
- Выбор типов данных: числа, строки, дата и время, UUID, перечисления. Ошибки округления и часовые пояса.
- Хранение данных в PostgreSQL: страницы, кортежи, выравнивание, TOAST. Секционирование таблиц.
- JSON и JSONB: возможности, индексирование, уместность применения.
- Индекс B-дерево: устройство, поиск, высота, поддерживаемые операции. Составные, частичные и покрывающие индексы.
- Индексы GIN, GiST, BRIN и Hash: назначение и выбор. Цена индексов.
- Этапы обработки запроса. Методы доступа к таблице.
- Методы соединения: вложенные циклы, хеширование, слияние. Условия эффективности каждого.
- Стоимостная оптимизация: модель стоимости, статистика, оценка кардинальности и её ошибки.
- Чтение плана выполнения. Типичные причины медленных запросов и способы их устранения.
- Транзакции и свойства ACID. Аномалии параллельного выполнения.
- Уровни изоляции стандарта SQL и их реализация в PostgreSQL. Изоляция снимков и асимметрия записи. SSI.
- Многоверсионное управление параллельным доступом в PostgreSQL. Видимость версий, VACUUM.
- Блокировки таблиц и строк. Взаимоблокировки. Оптимистическая и пессимистическая блокировки.
- Журнал упреждающей записи. Контрольные точки. Восстановление после сбоя.
- Резервное копирование: логическое и физическое. Восстановление на момент времени.
- Физическая и логическая репликация.
- Функции и процедуры на PL/pgSQL. Категории изменчивости функций.
- Триггеры: виды, применение, риски.
- Взаимодействие приложения с базой данных: пулы соединений, транзакции, параметризованные запросы, проблема N+1.
- Безопасность базы данных: роли, привилегии, защита строк (RLS), аутентификация.
- Масштабирование: репликация, секционирование, шардирование. Распределённые транзакции и двухфазная фиксация.
- Теорема CAP. Модели данных NoSQL-систем. OLTP и OLAP, колоночное хранение.
Рекомендуемая литература
Основная
- Silberschatz A., Korth H. F., Sudarshan S. Database System Concepts. 7th ed. — McGraw-Hill, 2019.
- Новиков Б. А., Горшкова Е. А., Графеева Н. Г. Основы технологий баз данных. 2-е изд. — М.: ДМК Пресс, 2020.
- Рогов Е. В. PostgreSQL 16 изнутри. — М.: ДМК Пресс, 2024. Свободная электронная версия: postgrespro.ru/education/books/internals.
- Дейт К. Дж. Введение в системы баз данных. 8-е изд. — М.: Вильямс, 2005.
Дополнительная
- Garcia-Molina H., Ullman J. D., Widom J. Database Systems: The Complete Book. 2nd ed. — Pearson, 2008.
- Ramakrishnan R., Gehrke J. Database Management Systems. 3rd ed. — McGraw-Hill, 2003.
- Клеппман М. Высоконагруженные приложения. Программирование, масштабирование, поддержка. — СПб.: Питер, 2018.
- Winand M. SQL Performance Explained. — 2012. Свободная версия: use-the-index-luke.com.
- Моргунов Е. П. PostgreSQL. Основы языка SQL. — СПб.: БХВ-Петербург, 2018. Свободная электронная версия: postgrespro.ru/education/books/sqlprimer.
- Hellerstein J. M., Stonebraker M., Hamilton J. Architecture of a Database System. — Foundations and Trends in Databases, 2007, Т. 1, № 2.
Интернет-ресурсы
- Документация PostgreSQL 16 и её русский перевод — основной справочник курса.
- Учебные курсы и книги Postgres Professional — свободно доступные курсы по администрированию и разработке на PostgreSQL.
- CMU 15-445/645 Database Systems — лекции Энди Павло о внутреннем устройстве СУБД.
- Use The Index, Luke! — индексы и производительность SQL для разработчиков.
- explain.depesz.com и explain.dalibo.com — наглядное отображение планов выполнения.
- Modern SQL — возможности стандарта SQL и их поддержка в разных СУБД.
- Jepsen — анализы согласованности распределённых баз данных.