SQL или NoSQL: когда что выбирать

Это не «что лучше», а «что подходит под вашу нагрузку и модель данных».

SQL-базы хранят данные в таблицах со строгой схемой и связями, дают транзакции и JOIN. NoSQL — общее имя для нереляционных хранилищ, делающих ставку на гибкость схемы и горизонтальный масштаб.

Сильные стороны SQL

Реляционные базы (PostgreSQL, MySQL) десятилетиями оттачивались под целостность данных. Их козыри: ACID-транзакции (либо всё применилось, либо ничего), строгая схема (база не пустит мусор), мощные JOIN и сложные запросы. Это идеально для денег, заказов, связанных сущностей — там, где ошибка недопустима.

Сильные стороны NoSQL

NoSQL появился, когда данных стало столько, что одна SQL-машина не справлялась. Главные козыри: горизонтальный масштаб «из коробки», гибкая схема (можно дописать поле без миграции) и высокая скорость на простых операциях по ключу. Цена — обычно нет JOIN и часто нет строгих транзакций между записями.

Типы NoSQL

ТипМодельХорош дляПример
Ключ-значениесловарь key → valueкэш, сессии, счётчикиRedis, DynamoDB
ДокументныйJSON-документыгибкие сущности, профили, каталогиMongoDB
Колоночныйколонки/семейства колонокогромные объёмы записей, временные рядыCassandra, HBase
Графовыйузлы и рёбрасвязи: соцсети, рекомендацииNeo4j

Таблица выбора

КритерийСкорее SQLСкорее NoSQL
Транзакции, деньгида, нужны ACIDобычно избыточно
Связи и сложные запросы (JOIN)сильная сторонанеудобно
Схемастабильная, известнаяменяется часто, разнородная
Объём и масштаб записидо определённого пределаогромный, горизонтальный
Доступсложные выборкив основном по ключу

Полиглот-персистентность

В реальных системах редко выбирают «или-или». Заказы — в PostgreSQL (нужны транзакции), сессии — в Redis (скорость по ключу), лента активности — в Cassandra (объём записей), полнотекстовый поиск — в Elasticsearch. Это называется polyglot persistence: под каждую нагрузку — своё хранилище. На собеседовании это сильный ответ: «для платежей возьму SQL ради ACID, а для ленты — NoSQL ради масштаба».

Пример рассуждения

Задача: каталог товаров + корзина + заказы.
- Заказы и оплата → PostgreSQL (ACID, нельзя терять/задваивать).
- Корзина и сессии → Redis (быстро, временно, по ключу).
- Карточки товаров → MongoDB (поля у товаров разные).
- Поиск по каталогу → Elasticsearch.
Один тип на всё — почти всегда компромисс не в нашу пользу.

Итог

  • SQL — целостность, транзакции, связи; NoSQL — масштаб, гибкость схемы, скорость по ключу.
  • У NoSQL четыре основных типа: ключ-значение, документный, колоночный, графовый.
  • Зрелое решение — polyglot persistence: под каждую нагрузку своё хранилище.
Проверьте себя
1. Для системы платежей, где нельзя задвоить или потерять транзакцию, что предпочтительнее?
AКолоночная NoSQL ради скорости
BРеляционная SQL-база ради ACID-транзакций
CКэш в памяти
DЛюбая база, это не важно
2. Что обычно отдают за горизонтальный масштаб и гибкую схему в NoSQL?
AВозможность хранить данные вообще
BJOIN и часто строгие транзакции между записями
CСкорость чтения по ключу
DВозможность добавлять серверы
3. Что такое polyglot persistence?
AИспользование одной базы для всего
BПодбор разных типов хранилищ под разные нагрузки в одной системе
CХранение данных на нескольких языках программирования
DПеревод базы на другой язык
Поддержать проект