Получить доступ

Когда в документной БД (MongoDB) выгоднее embedding (вложение), а когда referencing (ссылки)?

MiddleДокументные БДMongoDB
Ещё спрашивают так:
  • Вкладывать документы или ссылаться на них в MongoDB?
Коротко

Вложение — для данных, которые читаются вместе и принадлежат одной сущности (заказ с позициями). Ссылки — для многие-ко-многим, неограниченного роста и данных, используемых отдельно.

  • Вложение: одно чтение и атомарное обновление (атомарность — на документ)
  • Ссылки: нет дублирования, но $lookup или второй запрос
  • Лимит документа — 16 МБ; растущие массивы — антипаттерн

А ещё Компромисс — дублировать в документ несколько нужных полей связанной сущности

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

В документной модели нет дешёвых join-ов, поэтому схему проектируют под паттерны доступа. Embedding кладёт связанные данные в один документ: одно чтение, и обновление документа атомарно (атомарность в MongoDB — на уровне одного документа). Это идеально для «читается вместе и принадлежит сущности» (адрес заказа, позиции заказа фиксированной длины). Referencing хранит id и подходит, когда: связь many-to-many, вложенный массив растёт неограниченно (комментарии), либо данные переиспользуются многими и должны быть единым источником правды. Анти-паттерн — безгранично растущие массивы внутри документа (упираются в лимит размера документа и дорого обновляются).

Что хотят услышать

  • Критерии вложения и ссылок.
  • Атомарность на уровне документа.
  • Неограниченный рост как аргумент за ссылки.

Частые ошибки

  • Вкладывать безгранично растущие массивы в один документ.
  • Ожидать атомарность между несколькими документами без транзакций.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Embedding — когда данные читаются вместе и принадлежат одному агрегату (атомарность на уровне документа); referencing — когда связь many-to-many, данные растут неограниченно или переиспользуются
  • ✗Embedding всегда лучше, ссылок в документных БД не бывает
  • ✗Referencing быстрее всегда, потому что документы меньше
  • ✗Выбор не влияет ни на что, кроме размера на диске

Что спросят дальше

  • Каков предел размера документа в MongoDB?
  • Что такое атомарность на уровне документа?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем