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

В документе пользователя хранится массив всех его действий, который постоянно пополняется. Чем плоха такая модель?

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

Неограниченный массив: документ растёт без предела, упирается в лимит 16 МБ, каждое обновление и чтение дорожает вместе с ним, индексы по массиву раздуваются.

  • Действия пользователя — отдельная коллекция со ссылкой user_id
  • Или бакеты: документ на день или на 100 действий
  • Во вложенном массиве — только ограниченные данные (последние 10 событий)

А ещё Тот же антипаттерн — растущая партиция в Cassandra

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

Подробно

У документа есть жёсткий лимит размера, и рано или поздно запись перестанет проходить — причём у самых активных пользователей, то есть в худший момент. Ещё до этого начнёт деградировать производительность: чтение документа поднимает всю историю, даже если нужны имя и почта, а обновление переписывает документ и раздувает журнал. Правильные варианты: выносить историю в отдельную коллекцию со ссылкой на пользователя, применять схему с корзинами, где один документ хранит ограниченный отрезок событий, либо ограничивать массив только последними элементами при вставке. Общее правило моделирования: вкладывать стоит то, что ограничено по размеру и читается вместе с родителем.

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

  • Почему растущий документ плох.
  • Альтернативы: отдельная коллекция, бакеты, ограниченный массив.

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

  • Вкладывать коллекции, размер которых растёт со временем без предела.
  • Оценивать модель только по удобству чтения, забыв про стоимость записи.

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

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

Показать варианты и ответ
  • ✓Неограниченно растущий массив упирается в лимит размера документа, а каждое чтение и обновление тянет весь документ целиком
  • ✗Массивы в документах не индексируются
  • ✗Документная база не поддерживает массивы объектов
  • ✗Проблем нет — это рекомендуемый способ хранения истории

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

  • Что такое схема с корзинами (bucket pattern)?
  • Какой критерий выбора между вложением и ссылкой?

Разбор темы

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

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

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

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

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