Раздел 1 — Базы данных в разработке ПО

Зачем приложению СУБД, какие они бывают и как устроена работа с данными

Прогресс курса Раздел 1 из 13

Что вы освоите в этом разделе

4 академических часа: 2 часа теории, 2 часа практики. Практические задания выполняются без компьютера — это анализ и проектные решения на бумаге.
01

Где в приложении живут данные

Любое приложение сложнее калькулятора должно что-то помнить между запусками: пользователей, заказы, сообщения, настройки. Оперативная память для этого не годится — она очищается при перезапуске процесса. Данные должны пережить и перезапуск приложения, и перезагрузку сервера.

Типичное веб-приложение делится на три слоя:

Слои приложения

  • Представление — то, что видит пользователь: веб-страница, мобильный экран, ответ API.
  • Бизнес-логика — правила предметной области: можно ли оформить заказ, как посчитать скидку, кому показывать пост.
  • Хранение данных — база данных под управлением СУБД.

Слой представления и логика — код, который вы переписываете часто. База данных живёт дольше кода: приложение перепишут с PHP на Go, а таблица users останется та же. Поэтому ошибка в схеме БД стоит дороже ошибки в контроллере — её исправление затрагивает уже накопленные данные.

Практическое следствие: проектированию базы данных уделяют время до написания кода. Разделы 3 и 4 этого курса — именно об этом.

Разделим два понятия, которые в речи путают:

База данных и СУБД

  • База данных (БД) — сами данные, организованные по определённым правилам. Это набор файлов на диске.
  • СУБД (система управления базами данных, DBMS) — программа, которая этими файлами управляет: принимает запросы, читает и пишет, следит за целостностью, разграничивает доступ.

PostgreSQL, MySQL, Oracle — это СУБД. «Социальная сеть», которую вы будете изучать в этом курсе, — база данных, работающая под управлением PostgreSQL.

02

Почему не хватает файлов

Данные можно хранить в обычных файлах — CSV, JSON, XML. Так делали до появления СУБД, и так до сих пор делают в мелких задачах. Проблемы начинаются на масштабе.

Представьте магазин, который хранит заказы в orders.csv, а клиентов — в clients.csv. Пять типовых бед:

Проблемы файлового хранения

  • Избыточность. Адрес клиента продублирован в каждом его заказе. Тысяча заказов — тысяча копий одного адреса.
  • Аномалии обновления. Клиент переехал. Надо обновить тысячу строк. Обновили девятьсот — данные противоречат сами себе, и неизвестно, какая версия верная.
  • Нарушение целостности. Ничто не мешает записать заказ на несуществующего клиента или отрицательную сумму. Проверки приходится писать в каждом месте кода, который трогает файл.
  • Конкурентный доступ. Два процесса одновременно дописывают в файл — часть записей теряется. Реализовать блокировки корректно тяжело, и почти всегда это делают с ошибками.
  • Скорость поиска. Найти заказ по номеру — прочитать файл целиком. На десяти миллионах строк это секунды вместо миллисекунд.

К этому добавляются задачи, которые в файловом подходе даже не ставятся: как откатить наполовину выполненную операцию, как дать бухгалтеру доступ к суммам, но не к паролям, как восстановить состояние на вчерашний вечер.

Ни одна из этих проблем не исчезает от того, что файл заменили на JSON или добавили аккуратности в коде. Они решаются переносом ответственности за данные с приложения на СУБД.
03

Что делает СУБД

СУБД берёт на себя всё перечисленное. Её функции:

Функции СУБД

  • Хранение и организация данных — управляет файлами на диске, страницами, буферным кэшем в памяти. Разработчик про это не думает.
  • Язык запросов — вы описываете, что нужно получить, а не как это искать. Оптимизатор сам выбирает способ выполнения.
  • Контроль целостности — правила задаются один раз в схеме и действуют для всех, кто пишет в базу: хоть приложение, хоть администратор руками.
  • Транзакции — группа операций выполняется целиком или не выполняется вовсе.
  • Управление доступом — кому какие таблицы и столбцы видны, кто может изменять данные.
  • Параллельный доступ — сотни клиентов работают одновременно, не мешая друг другу и не портя данные.
  • Резервное копирование и восстановление — штатные средства снять копию и вернуться к состоянию на любой момент времени.

Приложение обращается к СУБД по сети — это отдельный процесс, часто на отдельной машине. Такая схема называется клиент-серверной: сервер СУБД принимает соединения, клиенты (ваше приложение, DBeaver, psql) отправляют запросы и получают результат.

Есть и встраиваемые СУБД, работающие внутри процесса приложения без сети и отдельного сервера — SQLite, DuckDB. Они удобны для мобильных приложений, десктопа и аналитики на одной машине, но не рассчитаны на сотни одновременных пишущих клиентов.
04

Модели данных: какие СУБД бывают

Модель данных — способ, которым СУБД представляет информацию. От модели зависит, какие задачи решаются легко, а какие — с трудом.

Основные модели

  • Реляционная — данные в таблицах, связанных между собой. Язык SQL. PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, SQLite. Универсальный выбор по умолчанию.
  • Документная — данные в виде документов JSON произвольной структуры. MongoDB, CouchDB. Удобна, когда структура записи заранее неизвестна или часто меняется.
  • Ключ-значение — примитивный словарь: по ключу отдаётся значение. Redis, etcd. Очень быстрая, применяется для кэша, сессий, счётчиков.
  • Графовая — данные как узлы и связи между ними. Neo4j. Для задач вида «найди кратчайшую цепочку знакомств» или «кто на кого влияет».
  • Колоночная — данные хранятся по столбцам, а не по строкам. ClickHouse, Vertica. Считает агрегаты по миллиардам строк за секунды.
  • Временных рядов — оптимизирована под метрики с отметкой времени. TimescaleDB, InfluxDB. Мониторинг, показания датчиков.

Все нереляционные модели объединяют собирательным словом NoSQL. Название неудачное: оно говорит, чего в них нет, а не что в них есть. Общего между Redis и Neo4j — примерно ничего.

Частая ошибка новичка — выбрать MongoDB, потому что «схему писать не надо». Схема никуда не девается, она просто переезжает из базы в код приложения, где её никто не проверяет. Через год в коллекции лежат документы пяти разных форматов, и разбирать их приходится на каждом чтении.

Реляционная модель остаётся выбором по умолчанию для большинства приложений: она даёт целостность, транзакции и зрелый язык запросов. Именно поэтому основная СУБД курса — PostgreSQL. Сравнению СУБД между собой посвящён раздел 12.

05

Два типа нагрузки: OLTP и OLAP

Базы данных решают две принципиально разные задачи, и путать их дорого.

OLTP

Online Transaction Processing — обработка транзакций. Много коротких операций: оформить заказ, поставить лайк, списать деньги. Работают с несколькими строками, требуют скорости отклика в миллисекундах и строгой корректности. Это режим работы приложения.

OLAP

Online Analytical Processing — аналитическая обработка. Мало запросов, но каждый читает миллионы строк: выручка по месяцам, средний чек по регионам. Отклик в секундах приемлем. Это режим работы отчётов и дашбордов.

Опасность в том, что тяжёлый аналитический запрос, запущенный на боевой базе приложения, забирает ресурсы у пользовательских операций — сайт начинает тормозить. Поэтому аналитику выносят: на реплику базы, в отдельное хранилище или в колоночную СУБД.

Учебная база курса — OLTP: пользователи, посты, лайки. Но итоговый проект (раздел 13) — дашборд менеджера, то есть OLAP-запросы поверх OLTP-схемы. На маленьких объёмах так делать можно и нужно; на больших это разносят.
06

Трёхуровневая архитектура и независимость данных

Стандарт ANSI/SPARC описывает базу данных на трёх уровнях. Эта абстракция объясняет, почему СУБД вообще устроены так, а не иначе.

Уровни представления данных

  • Внешний уровень — то, что видит конкретный пользователь или приложение. Бухгалтер видит суммы и контрагентов, маркетолог — города и возраст. Реализуется представлениями (VIEW) и правами доступа.
  • Концептуальный уровень — логическая схема всей базы: какие есть таблицы, столбцы, связи, ограничения. Единая для всех. Это то, что вы проектируете в разделах 3–4 и создаёте командами DDL в разделе 7.
  • Внутренний уровень — физическое хранение: файлы, страницы, индексы, сжатие. Этим занимается СУБД, а настраивает администратор.

Разделение уровней даёт два свойства, ради которых всё и затевалось:

Независимость данных

  • Физическая независимость — можно добавить индекс, перенести таблицу на другой диск, сменить способ хранения, и ни один запрос переписывать не придётся. Изменился внутренний уровень — концептуальный не заметил.
  • Логическая независимость — можно добавить в таблицу новый столбец, и приложения, которые о нём не знают, продолжат работать. Изменился концептуальный уровень — внешний по возможности не заметил.
Отсюда практическое правило из раздела 9: не пишите SELECT * в коде приложения. Такой запрос ломает логическую независимость — добавление столбца в таблицу меняет форму ответа и может уронить клиента.
07

Транзакции и ACID — обзорно

Классический пример: перевод денег между счетами. Это две операции — списать у одного, зачислить другому. Если между ними сервер выключится, деньги исчезнут.

Транзакция — группа операций, которая выполняется как единое целое. Либо все операции применены, либо ни одна. Свойства транзакций описывают аббревиатурой ACID:

ACID

  • Atomicity (атомарность) — всё или ничего. Половины транзакции не бывает.
  • Consistency (согласованность) — после транзакции все правила целостности выполняются. Заказ не может ссылаться на удалённого клиента.
  • Isolation (изолированность) — параллельные транзакции не видят промежуточных состояний друг друга.
  • Durability (долговечность) — если транзакция подтверждена, данные переживут отключение питания.

Пока достаточно знать, что это такое и зачем. Подробно — уровни изоляции, аномалии параллельного доступа, взаимные блокировки — в разделе 11.

08

Рынок СУБД в России

Выбор СУБД в российской компании — не только техническое решение. С 2022 года иностранные вендоры ушли: Oracle, Microsoft и SAP не продают лицензии и не оказывают поддержку. Для государственных организаций и компаний с госучастием действует требование использовать ПО из реестра отечественного ПО Минцифры.

Что применяют на практике

  • PostgreSQL — свободная СУБД, разрабатывается международным сообществом. Лицензия PostgreSQL License разрешает любое использование. Де-факто стандарт для новых проектов.
  • Postgres Pro — российская сборка PostgreSQL от компании «Постгрес Профессиональный», в реестре отечественного ПО. Коммерческая поддержка, сертификация ФСТЭК, дополнительные возможности. Основной путь миграции с Oracle.
  • MySQL / MariaDB — распространены в веб-разработке и на хостингах. MariaDB — форк MySQL после покупки его Oracle.
  • ClickHouse — колоночная СУБД, разработана в «Яндексе», открытый код. Мировой лидер в своей нише.
  • Tarantool — российская платформа от VK, in-memory. Применяется как быстрое хранилище с логикой.
Практический вывод для разработчика: знание PostgreSQL — самый ликвидный навык на российском рынке. Postgres Pro совместим с PostgreSQL, и переход между ними для разработчика почти незаметен. Этот курс учит PostgreSQL 17.
09

Кто работает с базой данных

Вокруг базы данных существует несколько ролей. Границы между ними размыты, и в небольшой компании один человек совмещает все.

Роли

  • Разработчик приложения — проектирует схему, пишет запросы, отвечает за то, чтобы код работал с базой эффективно. Основная роль этого курса.
  • Администратор БД (DBA) — устанавливает и настраивает СУБД, следит за производительностью, резервным копированием, правами доступа. Разделы 5–6.
  • Аналитик данных — пишет запросы для отчётов и дашбордов. Работает в основном с SELECT.
  • Инженер данных (Data Engineer) — строит потоки переноса данных из боевых баз в аналитические хранилища.

Курс рассчитан на первую роль, но захватывает вторую: разработчик, который не умеет поднять и настроить PostgreSQL, беспомощен без администратора.

Ключевые выводы раздела

Запомните главное

  • База данных — это данные; СУБД — программа, которая ими управляет
  • Файлы не заменяют СУБД: избыточность, аномалии обновления, целостность, конкурентный доступ, скорость поиска
  • Схема БД живёт дольше кода — ошибка проектирования дороже ошибки в коде
  • Модель данных определяет, какие задачи решаются легко: реляционная — универсальный выбор по умолчанию
  • OLTP — много коротких операций приложения; OLAP — редкие тяжёлые запросы аналитики
  • Три уровня ANSI/SPARC дают физическую и логическую независимость данных
  • ACID — атомарность, согласованность, изолированность, долговечность
  • На российском рынке основной выбор — PostgreSQL и его сборка Postgres Pro из реестра отечественного ПО
Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.
Все разделы Раздел 2: Реляционная модель