Зачем приложению СУБД, какие они бывают и как устроена работа с данными
Прогресс курсаРаздел 1 из 13
Что вы освоите в этом разделе
Понять место базы данных в архитектуре приложения
Объяснить, почему файлового хранения недостаточно
Знать функции СУБД и уметь их перечислить
Различать модели данных: реляционную, документную, ключ-значение, графовую, колоночную
Отличать OLTP-нагрузку от OLAP
Понимать трёхуровневую архитектуру и независимость данных
Ориентироваться на рынке СУБД в России
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 дают физическую и логическую независимость данных
На российском рынке основной выбор — PostgreSQL и его сборка Postgres Pro из реестра отечественного ПО
Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.