Виды баз данных и критерии выбора

Выбор типа базы данных определяет, насколько удобно будет хранить данные, масштабировать систему и выполнять запросы. Ниже — основные виды и критерии выбора.

Реляционные базы данных

Данные в таблицах; строки — записи, столбцы — атрибуты. Таблицы связаны отношениями через ключи (например, user_id). Строгая типизация, поддержка связей «один ко многим» и «многие ко многим», транзакции, язык SQL.

Пример: заказы в сервисе такси — таблица orders с полями order_id, user_id, driver_id, status; связь с users через user_id.

Когда использовать: транзакционность и сложные связи (финансы, заказы). Покрывают 80–90% задач.

Документо-ориентированные

Основной элемент — документ (JSON/BSON). Гибкая схема: у разных документов могут быть разные поля. Нет SQL, связи и джойны неудобны и дороги.

Пример: профиль пользователя с полями user_id, name, interests (массив), career (вложенный объект). Удобно при часто меняющейся структуре.

Поисковые движки (Elasticsearch, Sphinx) — специализация для полнотекстового поиска (лемматизация, синонимы). Рекомендуется хранить основные данные в другой БД (например, PostgreSQL), а поисковик использовать для поиска.

Графовые базы данных

Хранение графов: вершины (сущности) и рёбра (связи). Оптимизированы для обхода связей и поиска путей (Neo4j).

Пример: соцсеть — «дружит с», «живёт в»; маршрутизация — вершины перекрёстки, рёбра дороги.

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

Key-Value

Простейшая модель: ключ — значение. Аналог хеш-таблицы. Часто используются как кэш (Redis, Memcached) или для конфигураций и метаданных (etcd — сервис-дискавери, конфиги кластера).

Пример: ключ video_id:123, значение views:1500; ключ driver_id:456, значение status:available.

В Redis для удаления ключей по префиксу используют SCAN (не KEYS), затем DEL — SCAN не блокирует сервер на больших наборах.

Колоночные базы данных

Данные хранятся по колонкам, а не по строкам (ClickHouse). Сильное сжатие, чтение только нужных колонок, идеальны для аналитики; не ориентированы на частые транзакции.

Пример: аналитика поездок — колонки user_id, ride_cost, ride_date; запрос «средняя стоимость за месяц» читает только эти колонки.

Когда использовать: отчёты, статистика, большие объёмы чтения/записи.

Time-Series

Специализация на временных рядах (метрики, сенсоры). Примеры: Prometheus, Graphite, VictoriaMetrics.

Пример: метрики ride_requests_per_second с временными метками.

Когда использовать: мониторинг, датчики, аналитика по времени.

Object / Blob Storage

Хранение «сырых» данных — файлы, изображения, бэкапы (S3, MinIO). Записал — хранишь — читаешь или удаляешь; не для частых изменений.

Пример: фото профилей водителей, копии документов.

Критерии выбора

КритерийЧто учитывать
ТранзакцииНужны атомарность и согласованность → реляционные (PostgreSQL, MySQL).
Формат данныхKey-value — пары; time-series — метрики; граф — связи; аналитика — колоночные.
Навыки командыВыбирать проверенные технологии, с которыми есть опыт.
Характер обращенийАналитика — колоночные; точечные операции — реляционные.
Изменение схемыЧастые изменения структуры — документные (MongoDB) могут быть удобнее строгих реляционных.

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