Document-oriented vs Key-Value — в чём разница в NoSQL?
Databases → NoSQL → default
Основная идея
Document-oriented и Key-Value — это два типа NoSQL баз данных с разными моделями хранения данных. Key-Value хранит простые пары "ключ-значение", а Document-oriented хранит структурированные документы (JSON/BSON), которые можно индексировать и искать по полям.
Ключевые аспекты
Key-Value — самая простая модель: ключ (строка) → значение (любой blob). Примеры: Redis, Memcached, DynamoDB
Схема — Key-Value не знает о структуре значения, Document DB понимает структуру
Запросы — Key-Value только по ключу, Document DB по любым полям документа
Индексы — Document DB поддерживает вторичные индексы по полям
Плюсы и минусы
Key-Value:
Максимальная производительность чтения/записи
Простота масштабирования
Ограничены запросы только по ключу
Document-oriented:
Гибкие запросы по содержимому
Поддержка сложных структур данных
Медленнее Key-Value на базовых операциях
Частые ошибки на собеседованиях
Путают Document DB с реляционными БД — документы не имеют фиксированной схемы
Думают, что Key-Value не может хранить JSON — может, но не понимает его структуру
Считают MongoDB "ключ-значение" — MongoDB документо-ориентированная, хотя _id похож на ключ
Забывают про гибридные решения — DynamoDB совмещает оба подхода
Введение и проблематика
При выборе NoSQL базы данных одним из ключевых решений является выбор модели данных. Две наиболее популярные модели — Key-Value (ключ-значение) и Document-oriented (документо-ориентированная) — решают разные задачи и имеют различные характеристики производительности.
Какую проблему решают?
Реляционные базы данных требуют фиксированной схемы и плохо масштабируются горизонтально. NoSQL базы данных предлагают альтернативные модели хранения:
Key-Value — когда нужна максимальная скорость доступа по уникальному идентификатору
Document-oriented — когда нужна гибкость структуры и возможность поиска по содержимому
Базовая теория
Key-Value хранилища
Key-Value — простейшая модель NoSQL. Данные хранятся как пары:
text
ключ (string) → значение (любые данные)
База данных не знает о структуре значения — это просто blob (бинарные данные или строка).
js
// Концептуально Key-Value работает как Map/DictionaryconstkeyValueStore=newMap();// ЗаписьkeyValueStore.set("user:123",JSON.stringify({ name:"John", age:30 }));keyValueStore.set("session:abc","encrypted-session-data");// Чтение — только по ключуconstuser=keyValueStore.get("user:123");
Примеры Key-Value баз данных:
Redis — in-memory, часто используется как кэш
Memcached — распределённый кэш
Amazon DynamoDB — managed облачный сервис
etcd — хранение конфигураций в Kubernetes
Document-oriented хранилища
Document-oriented базы хранят структурированные документы (обычно JSON или BSON):
text
ключ (_id) → документ (JSON с вложенной структурой)
База данных понимает структуру документа и может индексировать отдельные поля.
Key-Value может хранить JSON, но не понимает его структуру. Если вам нужен поиск по полям — используйте Document DB или добавьте вторичные индексы вручную (как в Redis с Sorted Sets).
Гибридные решения
Некоторые базы данных совмещают оба подхода:
DynamoDB — Key-Value с поддержкой вложенных атрибутов:
js
// Можно запрашивать по атрибутам, но менее гибко чем MongoDBconstparams= { TableName:'Users', Key: { userId:'123' },// Обязательный ключ ProjectionExpression:'name, address.city'// Проекция полей};
Redis с JSON модулем — добавляет возможность работы с JSON:
bash
# RedisJSON модульJSON.SETuser:123 $ '{"name":"John","age":30}'JSON.GETuser:123 $.name# Получить конкретное поле
Плюсы и минусы
Аспект
Key-Value
Document-oriented
Скорость
✅ Максимальная
⚠️ Зависит от запроса
Гибкость запросов
❌ Только по ключу
✅ По любым полям
Сложность
✅ Простая
⚠️ Больше настроек
Масштабирование
✅ Тривиальное
⚠️ Требует планирования
Транзакции
❌ Ограничены
⚠️ Частичная поддержка
Индексы
❌ Нет
✅ Вторичные индексы
Вопросы интервьюера
Q: Можно ли использовать MongoDB как Key-Value хранилище?
Да, если всегда запрашивать по _id. Но это неэффективно — Redis будет быстрее для такого use case.
Q: Почему Redis используют как кэш, а не MongoDB?
Redis хранит данные в памяти (in-memory) и оптимизирован для простых операций GET/SET. MongoDB работает с диском и оптимизирована для сложных запросов.
Q: Что такое BSON в MongoDB?
Binary JSON — бинарный формат хранения документов. Добавляет типы (Date, ObjectId, Binary) и эффективнее для хранения/передачи.
Q: Когда Key-Value лучше Document DB?
Когда не нужен поиск по содержимому: кэши, сессии, очереди. Key-Value проще масштабировать и быстрее на базовых операциях.