SQL или NoSQL: как выбрать

↑ 4.1 Redis и MongoDB · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: middle

Зачем это на собесе

Ответ «зависит» должен сопровождаться критериями. Проверяют умение аргументировать выбор хранилища.

Категории NoSQL

ТипПримерыМодельСильная сторона
Ключ–значениеRedis, DynamoDB, Memcachedkey → valueскорость, простота, кэш
ДокументнаяMongoDB, Couchbase, FirestoreJSON-документыгибкая схема, агрегаты «всё вместе»
Колоночная семействCassandra, HBase, ScyllaDBwide-columnзапись огромных объёмов, распределённость
Колоночная аналитическаяClickHouse, BigQueryстолбцыаналитика
ГрафNeo4j, ArangoDBвершины и рёбрасвязи, рекомендации, пути
ПоисковыеElasticsearch, OpenSearchинвертированный индексполнотекстовый поиск
Временные рядыTimescaleDB, InfluxDB, VictoriaMetricstime-seriesметрики
ОбъектноеS3, MinIOblobфайлы

Сравнение

SQL (реляционные)NoSQL
Схемастрогая, миграциигибкая
Связи и JOINсильныеслабые/отсутствуют
Транзакцииполноценный ACIDограниченные (зависит от БД)
Масштабированиевертикальное, репликация; шардирование сложнеегоризонтальное встроено (часто)
ЗапросыSQL, ad-hocпод конкретный доступ к данным
Согласованностьсильнаячасто eventual, настраиваемая (CAP)
Зрелость экосистемыочень высокаязависит

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

  1. Модель данных и связи: много связей и инвариантов → реляционная.
  2. Шаблоны доступа: известны заранее и простые (по ключу) → key-value/документы; непредсказуемые отчёты → SQL.
  3. Консистентность: деньги, склады, бронирования → ACID.
  4. Объём и нагрузка: масштаб записи за пределы одного узла → шардируемые БД, но сначала исчерпайте оптимизацию PostgreSQL (партиционирование, реплики, кэш).
  5. Гибкость схемы: часто меняющиеся полуструктурированные данные → документы или jsonb.
  6. Команда и эксплуатация: опыт, инструменты, стоимость поддержки.
  7. Латентность: sub-ms → Redis.

Практический подход

  • По умолчанию — PostgreSQL: реляционная модель + jsonb, полнотекстовый поиск, расширения покрывают большинство задач;
  • добавляйте специализированные хранилища под конкретную проблему:
    • кэш и очереди → Redis;
    • аналитика → ClickHouse;
    • поиск → Elasticsearch/OpenSearch;
    • файлы → S3/MinIO;
    • документная модель с гибкой схемой → MongoDB;
  • polyglot persistence: разные хранилища под разные задачи с одним источником истины (обычно транзакционная БД) и синхронизацией (CDC, события).

Типичные сценарии

ЗадачаВыбор
Интернет-магазин: заказы, платежиPostgreSQL
Сессии, кэш, счётчики, лимитыRedis
Каталог с переменными атрибутамиPostgreSQL jsonb или MongoDB
События и аналитикаClickHouse
Полнотекстовый поиск с фасетамиElasticsearch/OpenSearch
Рекомендации по связямграф-БД или SQL с рекурсивными CTE
Загрузка файловS3-совместимое хранилище + метаданные в БД
Логи и метрикиClickHouse / Loki / Prometheus

Ловушки

  • выбор NoSQL «потому что модно» или «для масштаба» без нужды;
  • перенос реляционных данных в документы с потерей целостности;
  • «синхронизация вручную» нескольких хранилищ без источника истины;
  • игнорирование стоимости эксплуатации новой технологии.

Вопросы с ответами