Что такое NoSQL и зачем
Определение
NoSQL (Not Only SQL) — класс СУБД, отличающихся от классических реляционных:
- Не требуют фиксированной схемы.
- Горизонтально масштабируются из коробки.
- Отказываются от ACID в пользу BASE.
- Оптимизированы под конкретную задачу (документы, граф, ключ-значение).
Это не «замена SQL». Это другие инструменты для других задач.
Зачем появились
Проблемы SQL в 2000-х:
- Вертикальное масштабирование — только мощнее сервер.
- Строгая схема — трудно менять.
- JOIN на миллиардах строк — медленно.
- ACID тормозит на распределённых системах.
Google, Amazon, Facebook — начали делать свои:
- Bigtable → HBase, Cassandra.
- Dynamo → DynamoDB, Riak.
- MongoDB — документная.
- Neo4j — графовая.
CAP-теорема
Brewer, 2000. Распределённая система может гарантировать только 2 из 3:
- C — Consistency. Все узлы видят одинаковые данные.
- A — Availability. Каждый запрос получает ответ.
- P — Partition tolerance. Система работает при потере связи между узлами.
На практике: P обязателен. Выбор — между C и A.
CA-системы: PostgreSQL, MySQL (без распределения). CP: MongoDB, HBase (жертвует доступностью). AP: Cassandra, DynamoDB, Riak (жертвует согласованностью).
Правило: с распределённой системой выбираешь CP или AP.
ACID vs BASE
ACID (реляционные):
- Atomicity — всё или ничего.
- Consistency — валидные состояния.
- Isolation — транзакции не видят друг друга.
- Durability — после commit — надёжно.
BASE (NoSQL):
- Basically Available — доступность.
- Soft state — состояние может меняться.
- Eventually consistent — со временем данные сойдутся.
Что даёт: масштабируемость за счёт строгости.
Виды NoSQL
4 основных типа:
1. Key-Value:
- Redis, Memcached, DynamoDB.
- Просто: ключ → значение.
- Быстро, максимально просто.
2. Document:
- MongoDB, CouchDB, Firebase.
- JSON-документы.
- Гибкая схема, вложенность.
3. Column-family:
- Cassandra, HBase, ScyllaDB.
- Колонки → строчные группы.
- Для временных рядов и метрик.
4. Graph:
- Neo4j, ArangoDB, JanusGraph.
- Узлы и связи.
- Для соцсетей, рекомендаций, маршрутов.
Плюс:
- Time-series — InfluxDB, TimescaleDB.
- Search — Elasticsearch, Meilisearch.
- Vector — Pinecone, Qdrant, Milvus.
- Wide-column — ScyllaDB.
Когда NoSQL
Document (MongoDB):
- Гибкая схема, частые изменения.
- Вложенные данные (заказ + позиции).
- CMS, каталоги, профили.
- Быстрый старт разработки.
Key-Value (Redis):
- Кэш.
- Сессии.
- Очереди.
- Счётчики.
- Rate limiting.
Column (Cassandra):
- Метрики, логи.
- IoT-данные.
- Time-series.
- Огромные объёмы.
- Multi-datacenter.
Graph (Neo4j):
- Соцсети.
- Рекомендательные системы.
- Графы знаний.
- Маршруты.
Search (Elasticsearch):
- Полнотекстовый поиск.
- Логи.
- Аналитика по тексту.
Когда НЕ NoSQL
- Финансы, транзакции — ACID обязателен.
- Сложные связи — граф или SQL.
- Аналитика — DWH.
- Нормализация — реляционная.
- Маленькие объёмы — PostgreSQL справится.
Правило: PostgreSQL по умолчанию. NoSQL — если есть конкретная причина.
Polyglot Persistence
Идея: разные данные — в разных БД.
Пример интернет-магазина:
- PostgreSQL — заказы, платежи (ACID).
- MongoDB — каталог, характеристики (гибкая схема).
- Redis — кэш, сессии.
- Elasticsearch — поиск.
- Neo4j — рекомендации.
- ClickHouse — аналитика.
Что даёт: каждая БД для своей задачи.
Что стоит: сложнее инфраструктура, синхронизация.
Правило: начинай с одной БД. Добавляй по мере необходимости.
Ошибки перехода на NoSQL
1. «SQL не масштабируется»:
PostgreSQL масштабируется через партиции, реплики, шардирование
2. «Схема не нужна»:
Схема есть, но в приложении — хуже, чем в БД
3. «NoSQL быстрее»:
На простых запросах — да. На сложных — часто медленнее
4. «ACID не нужен»:
Приложение ждёт ACID и ломается без него
5. «Один NoSQL для всего»:
Каждая БД оптимизирована под своё
Практика
1. Определите, где в вашем проекте нужен NoSQL.
2. Оцените CAP: вам нужна C или A?
3. Выберите тип: document, KV, column, graph?
4. Не мигрируйте всё разом — начните с одной задачи.
Итог
- NoSQL ≠ замена SQL.
- CAP: выбор между C и A.
- BASE vs ACID.
- 4 типа: KV, document, column, graph.
- Polyglot persistence — разные БД для разных задач.
- PostgreSQL по умолчанию.
- NoSQL — когда есть конкретная причина.
Дальше — типы NoSQL баз.