Вопрос с собеседования · Базы данных

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

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

Разбор собеседования