NoSQL
| Расшифровка | «не только SQL» (Not only SQL) |
|---|---|
| Возрождение термина | 2009 |
| Типы | ключ-значение, документные, широкие колонки, графовые |
| Примеры | Redis, DynamoDB, MongoDB, Cassandra, HBase, Neo4j |
| Основополагающие работы | Google Bigtable (2006), Amazon Dynamo (2007) |
| Модель согласованности | часто BASE и итоговая согласованность |
NoSQL — собирательное название баз данных, которые не следуют классической реляционной модели с таблицами, жёсткой схемой и языком SQL. Сейчас термин чаще расшифровывают как «не только SQL» (Not only SQL). Под ним объединяют очень разные системы: хранилища «ключ — значение», документные, колоночные и графовые базы. Общее у них — отказ от части возможностей реляционных СУБД ради горизонтального масштабирования, гибкой схемы, высокой доступности или более подходящей модели данных.
История
Название впервые использовал Карло Строцци в 1998 году для своей облегчённой реляционной базы без SQL-интерфейса. Современное значение термин получил в 2009 году, когда на встрече в Сан-Франциско обсуждали распределённые нереляционные хранилища. Им предшествовали работы интернет-гигантов, столкнувшихся с объёмами, которые не помещались на один сервер: Google описала Bigtable (2006),[1] Amazon — Dynamo (2007).[2] На их идеях выросли HBase, Cassandra, Riak, DynamoDB. Параллельно появились документная MongoDB (2009) и графовая Neo4j.
Типы NoSQL-баз
| Тип | Модель | Примеры | Типичные задачи |
|---|---|---|---|
| Ключ — значение | словарь: ключ → значение | Redis, DynamoDB, etcd | кэш, сессии, конфигурация |
| Документные | JSON-подобные документы с вложенностью | MongoDB, Couchbase, Firestore | каталоги, профили, контент |
| Широкие колонки | строки с переменным набором столбцов, распределённые по ключу | Cassandra, HBase, ScyllaDB | журналы событий, телеметрия, огромные объёмы записи |
| Графовые | вершины и рёбра со свойствами | Neo4j, JanusGraph | социальные связи, рекомендации, графы знаний |
Отдельно стоят векторные базы для эмбеддингов (см. pgvector и векторные БД), базы временных рядов (InfluxDB, TimescaleDB) и поисковые движки (Elasticsearch, OpenSearch), которые тоже иногда относят к NoSQL.
Примеры моделей
Документ в MongoDB хранит заказ со всеми позициями внутри — то, что в реляционной базе заняло бы несколько таблиц:
{
"_id": "ord-1001",
"customer": {"id": 42, "name": "Алиса"},
"items": [
{"sku": "BOOK-1", "qty": 1, "price": 900},
{"sku": "PEN-7", "qty": 3, "price": 50}
],
"status": "paid"
}
В графовой базе запрос «друзья друзей, которые купили этот товар» выражается естественно на языке Cypher:[6]
MATCH (me:User {id: 42})-[:FRIEND]->()-[:FRIEND]->(fof)-[:BOUGHT]->(p:Product {sku: "BOOK-1"})
RETURN DISTINCT fof.name
Согласованность: ACID, BASE и CAP
Многие распределённые NoSQL-системы ради доступности и масштабирования отказывались от строгих ACID-транзакций в пользу модели BASE (Basically Available, Soft state, Eventual consistency): система всегда отвечает, но реплики могут какое-то время расходиться и сходятся со временем (итоговая согласованность).
Компромисс формализует CAP-теорема: при сетевом разделении распределённая система вынуждена выбирать между согласованностью и доступностью.[3] Cassandra и Dynamo выбирают доступность с настраиваемыми кворумами, HBase и etcd — согласованность.
Сильные стороны
- Горизонтальное масштабирование. Данные изначально распределяются по многим узлам (шардирование встроено), и кластер растёт добавлением серверов.
- Гибкая схема. Документы одной коллекции могут иметь разную структуру; новые поля добавляются без миграций.
- Модель под задачу. Агрегат, который читается целиком, хранится вместе — без соединений; связи в графе обходятся быстрее рекурсивных SQL-запросов.
- Высокая доступность и запись в нескольких дата-центрах.
Слабые стороны
- Запросы проектируются заранее. В Cassandra таблицы строят под конкретные запросы; новый вид выборки может потребовать новой таблицы и дублирования данных.
- Целостность в коде. Нет внешних ключей и часто нет транзакций между документами — согласованность обеспечивает приложение (см. Нормализация).
- Разнородность. Каждая система — свой язык запросов, инструменты и подводные камни.
Сближение миров
Границы размылись. Реляционные СУБД научились хранить документы (PostgreSQL с jsonb), векторы и временные ряды; появились распределённые SQL-базы (CockroachDB, YugabyteDB, Google Spanner) с горизонтальным масштабированием и ACID. NoSQL-системы, в свою очередь, добавили транзакции (MongoDB с версии 4.0) и SQL-подобные языки. Мартин Фаулер и Прамод Садаладж описали этот подход как полиглотное хранение: каждая часть системы использует подходящее ей хранилище.[4] Для многих проектов разумная отправная точка — PostgreSQL, а специализированные базы добавляются под конкретные нагрузки.
См. также
Источники
- F. Chang et al. — Bigtable: A Distributed Storage System for Structured Data (OSDI 2006)
- G. DeCandia et al. — Dynamo: Amazon's Highly Available Key-value Store (SOSP 2007)
- S. Gilbert, N. Lynch — Brewer's conjecture and the feasibility of consistent, available, partition-tolerant web services (2002)
- P. Sadalage, M. Fowler — NoSQL Distilled
- Apache Cassandra Documentation
- Neo4j — Cypher Manual: Introduction