NoSQL — чек-лист
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Чек-лист самопроверки
- Понимаю ли я, что NoSQL — это семейство моделей хранения данных?
- Могу ли я объяснить разницу между документоориентированной, ключ-значение, колоночной и графовой моделями?
- Знаю ли я, какие типичные сценарии лучше всего решать с помощью MongoDB?
- Понимаю ли я, почему Redis часто используется как кэш, а не как основное хранилище?
- Могу ли я описать архитектурные преимущества Cassandra при работе с потоками событий?
- Умею ли я формулировать запрос к графовой базе данных на языке Cypher?
- Понимаю ли я концепцию CAP-теоремы и как она влияет на выбор СУБД?
- Могу ли я объяснить разницу между eventual consistency и strong consistency?
- Знаю ли я, что такое schema-on-read и чем он отличается от schema-on-write?
- Понимаю ли я, почему в NoSQL часто отказываются от JOIN’ов?
- Могу ли я привести пример денормализации данных в MongoDB?
- Знаю ли я, как в Redis реализовать распределённую блокировку?
- Понимаю ли я, как работает партиционирование в Cassandra?
- Могу ли я объяснить, что такое partition key и clustering key?
- Знаю ли я, как в Neo4j хранятся свойства у связей?
- Понимаю ли я, почему JSON-файлы не заменяют NoSQL-СУБД в production?
- Могу ли я описать процесс репликации в Cassandra?
- Знаю ли я, как настроить TTL для автоматического удаления данных в Redis и MongoDB?
- Понимаю ли я, как работает агрегационный конвейер в MongoDB?
- Могу ли я написать CQL-запрос для выборки данных из Cassandra по диапазону времени?
- Знаю ли я, как в Neo4j найти кратчайший путь между двумя узлами?
- Понимаю ли я, зачем нужны индексы в NoSQL и как они влияют на производительность?
- Могу ли я объяснить, почему skip() неэффективен при глубокой пагинации?
- Знаю ли я, как в MongoDB реализовать много-документные транзакции?
- Понимаю ли я, как работает commit log в Cassandra?
- Могу ли я описать архитектуру masterless в Cassandra?
- Знаю ли я, как в Redis реализовать rate limiter с помощью sorted set?
- Понимаю ли я, как работает Lua-скрипт в Redis и зачем он нужен?
- Могу ли я объяснить, что такое vector clocks и зачем они нужны в распределённых системах?
- Знаю ли я, как в MongoDB использовать partial index?
- Понимаю ли я, как работает TTL-индекс в MongoDB?
- Могу ли я описать процесс компактификации sstables в Cassandra?
- Знаю ли я, как в Neo4j реализуется full-text search?
- Понимаю ли я, что такое GraphRAG и чем он отличается от классического RAG?
- Могу ли я объяснить, как NoSQL-системы интегрируются в архитектуру микросервисов?
- Знаю ли я, как реализовать паттерн Event Sourcing с использованием Cassandra?
- Понимаю ли я, как работает CQRS и почему NoSQL хорошо подходит для read-model?
- Могу ли я описать процесс бэкапа и восстановления в MongoDB?
- Знаю ли я, как в Cassandra настраивается replication strategy для нескольких дата-центров?
- Понимаю ли я, как работает token-aware routing в драйверах Cassandra?
- Могу ли я объяснить, зачем нужны tombstones в Cassandra?
- Знаю ли я, как в Redis реализовать очередь с приоритетом?
- Понимаю ли я, как работает HyperLogLog и для каких задач он применяется?
- Могу ли я описать сценарий использования Redis Streams вместо Pub/Sub?
- Знаю ли я, как в MongoDB реализовать валидацию схемы на уровне коллекции?
- Понимаю ли я, как работает GridFS и когда его следует использовать?
- Могу ли я объяснить, почему в Cassandra нельзя эффективно фильтровать по неключевым полям?
- Знаю ли я, как в Neo4j реализуется безопасность на уровне свойств узлов?
- Понимаю ли я, как NoSQL-системы поддерживают работу с векторными эмбеддингами?
- Могу ли я обосновать выбор конкретной NoSQL-СУБД для заданного бизнес-сценария?
- Могу ли я назвать три schema pattern для MongoDB (bucket, extended reference, outlier) и когда их применять?
- Понимаю ли я, почему при partition replica set меньшинство узлов не выбирает primary?
- Знаю ли я, что такое rollback oplog и где искать
.bsonв каталогеrollback/? - Могу ли я объяснить риск "firehose" при монотонном shard key и как его смягчить?
- Умею ли я настроить "бюджетный" hidden secondary с
priority: 0для бэкапа?
Подсказки к ключевым темам
Краткие ориентиры, если пункт чек-листа вызывает сомнения. Подробнее — в соответствующих главах раздела.
CAP, BASE, согласованность (п. 7–9)
- CAP: в распределённой системе при разделении сети (P) выбирают между строгой согласованностью (C) и доступностью (A). Большинство NoSQL по умолчанию ближе к AP.
- Eventual consistency: реплики сходятся со временем; сразу после записи чтение с другой реплики может вернуть старое значение.
- Strong consistency: чтение видит последнюю подтверждённую запись (кворум, транзакция,
SERIALв Cassandra). - BASE: Basically Available, Soft state, Eventual consistency — прагматичный компромисс, не "отказ от данных". См. Основы NoSQL.
- Schema-on-read / schema-on-write: гибкие документы vs фиксированная схема таблицы; см. MongoDB.
Cassandra — ключи и консистентность (п. 13–14, 17, 39–41)
- Partition key — на каком узле лежит строка; без него в
WHERE— full scan. - Clustering key — порядок строк внутри партиции; диапазоны по времени.
- Replication factor (RF) — число копий партиции; QUORUM ≈
floor(RF/2)+1реплик для подтверждения. - Consistency level — на каждый запрос —
ONE(быстро),LOCAL_QUORUM(типичный production),SERIAL(LWT). Таблица и примеры: Cassandra. - Tombstone — маркер удаления в SSTable; много tombstones замедляет compaction.
- Commit log — журнал записи на диск до memtable; durability (в других СУБД аналог — WAL). Путь записи: Cassandra.
- NetworkTopologyStrategy — реплики в нескольких ДЦ с явным числом копий в каждом.
Redis (п. 12, 18, 27–28, 42, 44)
- Блокировка:
SET key <токен> NX EX 30. Снятие — Lua "удали, еслиGET key == мой токен", не слепойDEL. См. практику. - TTL:
EX/EXPIRE; ключи с TTL — политикиvolatile-*приmaxmemory. Для MongoDB — TTL-индекс. MULTI/EXECvs pipeline: транзакция атомарна; pipeline — только RTT. Справочник.- Rate limiter: ZSET + Lua — глава.
- Streams vs Pub/Sub: Pub/Sub без истории; Streams — consumer groups и
XACK. KEYSvsSCAN: в production — толькоSCAN.
MongoDB (п. 3, 11, 19, 23–24, 30–31, 45–46, 51–55)
- Денормализация: дублировать имя автора в документе поста, чтобы не делать
$lookupна каждый запрос. - Агрегация: конвейер
$match→$group→$sort; ранний$matchиспользует индексы. - skip(): при большом offset сканирует лишние документы → курсорная пагинация по
_id/ дате. - Multi-doc transactions:
session.startTransaction()в 4.0+; для одного документа достаточно атомарногоupdateOne. - Практикум в shell: Первые шаги.
- Ссылки между коллекциями: поле с
_idсвязанного документа (companyId); целостность — в приложении или транзакции; DBRef/DBPointer — устарели. - Нет поля vs
null: отсутствие —$exists: false; явныйnull—{ field: null }. - GridFS:
fs.files+fs.chunks, чанки ~255 КиБ;mongofiles put/list/getилиGridFSBucket; в документе —fileId, не бинарник. См. теория, справочник §19.3, практикум. - Schema patterns: bucket (IoT), extended reference (заказ + дубли клиента), outlier (overflow). MongoDB — проектирование документной схемы.
- Majority / rollback: partition без majority → read-only; rollback сохраняет
.bsonвdbPath/rollback/. §10 справочника. - Shard key firehose: монотонный ключ → один hot shard; hashed или compound prefix. §11.
Графы и Cypher (п. 6, 15, 21, 33–34)
- Свойства на рёбрах — да, в property graph (Neo4j):
-[:KNOWS {since: 2020}]->. - Кратчайший путь:
shortestPath((a)-[*]-(b))или алгоритмы GDS. - Практикум Cypher: Графовые БД.
Memcached и кэш (см. также п. 4, 16)
- Не СУБД: нет запросов по значению, нет транзакций; только
get/set/deleteпо ключу. - Cache-aside — приложение сначала
get, при промахе — БД, затемsetс TTL. См. Memcached.
Vector clocks (п. 29)
- Механизм упорядочивания событий в распределённых системах (исторически Dynamo); в современной Cassandra чаще timestamps и LWW. Знать концепцию достаточно; не путать с "часами в Redis".
NewSQL (когда NoSQL не хватает ACID)
- Нужны распределённые транзакции + SQL + JOIN — смотрите NewSQL.
- CockroachDB совместим с протоколом PostgreSQL; Spanner — managed в GCP.
- NewSQL не заменяет Redis/Cassandra для кэша и потоков событий — часто идут вместе.