Базы данных
Для чего модуль
Научиться принимать решения по данным так, чтобы система была быстрой, корректной и эволюционировала без аварийных миграций.
Результат после прохождения
- Вы выбираете SQL/NoSQL под конкретный продуктовый сценарий.
- Вы проектируете схемы и индексы через реальные паттерны чтения/записи.
- Вы понимаете транзакции, согласованность и компромиссы под нагрузкой.
- Вы умеете планировать безопасные миграции и производственную поддержку БД.
Термины и аббревиатуры
| Термин | Коротко |
|---|---|
ACID | Свойства надежной транзакции |
Index | Ускорение поиска |
Isolation | Степень изоляции транзакций |
N+1 | Лишние последовательные запросы |
Replication | Копирование данных между узлами |
Фокус по грейдам
Junior: понимать базовые механики и объяснять их простыми примерами.Middle: применять тему в продуктовых сценариях с учетом рисков и ограничений.Senior: управлять архитектурными trade-offs, метриками и эволюцией решения.
Как работать с модулем
- Для каждого урока используйте один домен (orders, payments, users).
- Любое решение связывайте с workload: read/write ratio, latency, consistency.
- После урока фиксируйте артефакт: схема, explain-анализ, миграционный план.
Программа модуля
Урок 1. Моделирование данных
Цель: проектировать схему, которая отражает доменные инварианты и рабочие сценарии.
От домена к схеме
- Определите сущности и их жизненный цикл.
- Выделите инварианты (уникальность, обязательность, связи).
- Отразите инварианты на уровне constraints, а не только кода.
SQL vs NoSQL (практично)
- SQL — когда критичны связи, транзакции, отчетность.
- NoSQL — когда нужны гибкие документы, горизонтальный масштаб, event-heavy сценарии.
- Часто оптимален polyglot подход, если есть дисциплина границ.
Где ломается в проде
- Схема проектируется «под текущий экран», а не под эволюцию домена.
- Инварианты живут только в приложении и теряются при обходных путях.
- Выбор типа БД делается по моде, а не по workload.
Мини-задача (обязательная)
Смоделируйте схему для одного домена: сущности, связи, ограничения, ожидаемые read/write patterns.
Что спросит интервьюер: почему вы выбрали эту модель данных и какие альтернативы отвергли.
Критерий готовности по уроку: вы можете защитить схему через доменные инварианты и рабочие сценарии.
Урок 2. Запросы и индексы
Цель: ускорять запросы системно, а не «добавляя индекс на всё подряд».
Оптимизация через планы выполнения
- Читайте
EXPLAIN/EXPLAIN ANALYZE. - Ищите full scan, неэффективные join, сортировки и фильтры.
- Оптимизируйте в порядке наибольшего влияния на p95/p99.
Индексная стратегия
- Индексы создаются под реальные query patterns.
- Композитный индекс зависит от порядка фильтрации/сортировки.
- Каждый индекс ускоряет чтение, но повышает цену записи.
Где ломается в проде
- Много лишних индексов замедляют writes.
- Нет регулярного аудита «мертвых» индексов.
- Запросы растут по сложности без пересмотра схемы.
Мини-задача (обязательная)
Оптимизируйте 3 медленных запроса: зафиксируйте план до/после и влияние на latency.
Что спросит интервьюер: как вы понимаете, что именно этот индекс даст эффект.
Критерий готовности по уроку: вы можете обосновать оптимизацию запроса через план выполнения и измеримый результат.
Урок 3. Транзакции и согласованность
Цель: управлять корректностью данных под конкурентной нагрузкой.
ACID и уровни изоляции
- Read phenomena (dirty/non-repeatable/phantom reads).
- Выбор isolation level по критичности операции.
- Trade-off между строгой согласованностью и throughput.
Idempotency и конкурентные сценарии
- Idempotency key для повторяемых операций.
- Защита от double-submit и race conditions.
- Явные правила retry для транзакционных операций.
Где ломается в проде
- Транзакции слишком широкие и блокируют систему.
- Отсутствие idempotency в платежных/заказных сценариях.
- Неверные assumptions о последовательности событий.
Мини-задача (обязательная)
Опишите стратегию для операции «подтвердить заказ»: транзакция, idempotency, обработка ретраев, ожидания по консистентности.
Что спросит интервьюер: как вы предотвращаете двойную запись в конкурентном сценарии.
Критерий готовности по уроку: вы можете описать надежный сценарий записи под конкуренцией без потери корректности.
Урок 4. Production-поддержка
Цель: сопровождать БД как критичную инфраструктуру.
Миграции без простоя
- Expand/contract подход.
- Backfill с контролем нагрузки.
- Совместимость старой и новой схемы на переходном этапе.
Мониторинг и операционка
- Метрики: latency, lock wait, connection saturation, replication lag.
- Alerting и runbook на типовые деградации.
- Backup/restore проверяется регулярно, а не «на словах».
Где ломается в проде
- Деструктивные миграции без phased rollout.
- Нет проверенного процесса восстановления.
- Инциденты решаются вручную без постмортема.
Мини-задача (обязательная)
Соберите migration plan для изменения схемы в живом сервисе: этапы, риски, проверки, rollback.
Что спросит интервьюер: как вы проводите миграцию схемы без downtime.
Критерий готовности по уроку: вы можете провести изменение схемы и показать, как контролируете риск инцидента.
Практика
- Сформируйте модель данных с явными инвариантами.
- Оптимизируйте 3 запроса через explain-анализ.
- Подготовьте дизайн транзакции для критичной операции.
- Сделайте migration runbook с expand/contract.
- Закрепите в Базы данных вопросах, Node.js, NestJS.
- Смоделируйте slow-query кейс в Песочнице, проверьте гипотезу индексом и сравните метрики.
Связь с треками и вопросами
- Треки: Middle трек, Senior трек.
- Вопросы: Базы данных, Node.js.
- Повторение: 3-5 вопросов без подсказок -> сверка с модулем -> повтор через 24 часа.
Критерий готовности
Вы объясняете модель данных, индексы и транзакционные решения через workload, корректность и эксплуатационные риски.
Артефакты после модуля
- Data model с комментариями по trade-offs.
- Отчет по оптимизации 3 запросов (до/после).
- Migration plan + rollback strategy.
- Набор из 6 сильных interview-ответов по базам данных.