Перейти к основному содержимому

NoSQL — чек-лист

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Загрузка вопросов…

Чек-лист самопроверки

  1. Понимаю ли я, что NoSQL — это семейство моделей хранения данных?
  2. Могу ли я объяснить разницу между документоориентированной, ключ-значение, колоночной и графовой моделями?
  3. Знаю ли я, какие типичные сценарии лучше всего решать с помощью MongoDB?
  4. Понимаю ли я, почему Redis часто используется как кэш, а не как основное хранилище?
  5. Могу ли я описать архитектурные преимущества Cassandra при работе с потоками событий?
  6. Умею ли я формулировать запрос к графовой базе данных на языке Cypher?
  7. Понимаю ли я концепцию CAP-теоремы и как она влияет на выбор СУБД?
  8. Могу ли я объяснить разницу между eventual consistency и strong consistency?
  9. Знаю ли я, что такое schema-on-read и чем он отличается от schema-on-write?
  10. Понимаю ли я, почему в NoSQL часто отказываются от JOIN’ов?
  11. Могу ли я привести пример денормализации данных в MongoDB?
  12. Знаю ли я, как в Redis реализовать распределённую блокировку?
  13. Понимаю ли я, как работает партиционирование в Cassandra?
  14. Могу ли я объяснить, что такое partition key и clustering key?
  15. Знаю ли я, как в Neo4j хранятся свойства у связей?
  16. Понимаю ли я, почему JSON-файлы не заменяют NoSQL-СУБД в production?
  17. Могу ли я описать процесс репликации в Cassandra?
  18. Знаю ли я, как настроить TTL для автоматического удаления данных в Redis и MongoDB?
  19. Понимаю ли я, как работает агрегационный конвейер в MongoDB?
  20. Могу ли я написать CQL-запрос для выборки данных из Cassandra по диапазону времени?
  21. Знаю ли я, как в Neo4j найти кратчайший путь между двумя узлами?
  22. Понимаю ли я, зачем нужны индексы в NoSQL и как они влияют на производительность?
  23. Могу ли я объяснить, почему skip() неэффективен при глубокой пагинации?
  24. Знаю ли я, как в MongoDB реализовать много-документные транзакции?
  25. Понимаю ли я, как работает commit log в Cassandra?
  26. Могу ли я описать архитектуру masterless в Cassandra?
  27. Знаю ли я, как в Redis реализовать rate limiter с помощью sorted set?
  28. Понимаю ли я, как работает Lua-скрипт в Redis и зачем он нужен?
  29. Могу ли я объяснить, что такое vector clocks и зачем они нужны в распределённых системах?
  30. Знаю ли я, как в MongoDB использовать partial index?
  31. Понимаю ли я, как работает TTL-индекс в MongoDB?
  32. Могу ли я описать процесс компактификации sstables в Cassandra?
  33. Знаю ли я, как в Neo4j реализуется full-text search?
  34. Понимаю ли я, что такое GraphRAG и чем он отличается от классического RAG?
  35. Могу ли я объяснить, как NoSQL-системы интегрируются в архитектуру микросервисов?
  36. Знаю ли я, как реализовать паттерн Event Sourcing с использованием Cassandra?
  37. Понимаю ли я, как работает CQRS и почему NoSQL хорошо подходит для read-model?
  38. Могу ли я описать процесс бэкапа и восстановления в MongoDB?
  39. Знаю ли я, как в Cassandra настраивается replication strategy для нескольких дата-центров?
  40. Понимаю ли я, как работает token-aware routing в драйверах Cassandra?
  41. Могу ли я объяснить, зачем нужны tombstones в Cassandra?
  42. Знаю ли я, как в Redis реализовать очередь с приоритетом?
  43. Понимаю ли я, как работает HyperLogLog и для каких задач он применяется?
  44. Могу ли я описать сценарий использования Redis Streams вместо Pub/Sub?
  45. Знаю ли я, как в MongoDB реализовать валидацию схемы на уровне коллекции?
  46. Понимаю ли я, как работает GridFS и когда его следует использовать?
  47. Могу ли я объяснить, почему в Cassandra нельзя эффективно фильтровать по неключевым полям?
  48. Знаю ли я, как в Neo4j реализуется безопасность на уровне свойств узлов?
  49. Понимаю ли я, как NoSQL-системы поддерживают работу с векторными эмбеддингами?
  50. Могу ли я обосновать выбор конкретной NoSQL-СУБД для заданного бизнес-сценария?
  51. Могу ли я назвать три schema pattern для MongoDB (bucket, extended reference, outlier) и когда их применять?
  52. Понимаю ли я, почему при partition replica set меньшинство узлов не выбирает primary?
  53. Знаю ли я, что такое rollback oplog и где искать .bson в каталоге rollback/?
  54. Могу ли я объяснить риск "firehose" при монотонном shard key и как его смягчить?
  55. Умею ли я настроить "бюджетный" 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) — число копий партиции; QUORUMfloor(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/EXEC vs pipeline: транзакция атомарна; pipeline — только RTT. Справочник.
  • Rate limiter: ZSET + Lua — глава.
  • Streams vs Pub/Sub: Pub/Sub без истории; Streams — consumer groups и XACK.
  • KEYS vs SCAN: в 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 для кэша и потоков событий — часто идут вместе.