В документе пользователя хранится массив всех его действий, который постоянно пополняется. Чем плоха такая модель?
- Почему нельзя хранить бесконечный массив в документе?
Неограниченный массив: документ растёт без предела, упирается в лимит 16 МБ, каждое обновление и чтение дорожает вместе с ним, индексы по массиву раздуваются.
- Действия пользователя — отдельная коллекция со ссылкой user_id
- Или бакеты: документ на день или на 100 действий
- Во вложенном массиве — только ограниченные данные (последние 10 событий)
А ещё Тот же антипаттерн — растущая партиция в Cassandra
Подробно
У документа есть жёсткий лимит размера, и рано или поздно запись перестанет проходить — причём у самых активных пользователей, то есть в худший момент. Ещё до этого начнёт деградировать производительность: чтение документа поднимает всю историю, даже если нужны имя и почта, а обновление переписывает документ и раздувает журнал. Правильные варианты: выносить историю в отдельную коллекцию со ссылкой на пользователя, применять схему с корзинами, где один документ хранит ограниченный отрезок событий, либо ограничивать массив только последними элементами при вставке. Общее правило моделирования: вкладывать стоит то, что ограничено по размеру и читается вместе с родителем.
Что хотят услышать
- Почему растущий документ плох.
- Альтернативы: отдельная коллекция, бакеты, ограниченный массив.
Частые ошибки
- Вкладывать коллекции, размер которых растёт со временем без предела.
- Оценивать модель только по удобству чтения, забыв про стоимость записи.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Документная база не поддерживает массивы объектов
- ✗Проблем нет — это рекомендуемый способ хранения истории
- ✓Массив упрётся в лимит размера документа, а каждое чтение тянет его целиком
- ✗Массивы в документах нельзя индексировать, поиск будет перебором
Что спросят дальше
- Что такое схема с корзинами (bucket pattern)?
- Какой критерий выбора между вложением и ссылкой?
Разбор темы
- Документоориентированные БД (MongoDB)
Модель документа, embedding против referencing, индексы, aggregation pipeline, атомарность документа и шардирование.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.