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

Почему в документных БД схему проектируют от запросов, а не нормализуют как в реляционной?

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

В документной базе нет дешёвых JOIN, поэтому схему денормализуют под основные запросы: так, чтобы запрос обслуживался одним документом.

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

А ещё Тот же принцип в Cassandra и DynamoDB

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

Подробно

В реляционной модели нормализация убирает дублирование, а join-ы дёшевы. В документной БД join-ов между коллекциями либо нет, либо они дороги ($lookup), поэтому оптимизируют под чтение: связанные данные дублируют/вкладывают так, чтобы основной запрос обслуживался одним документом. Плата — контролируемая денормализация: при изменении продублированных данных их надо обновлять в нескольких местах (или мириться с устареванием). Поэтому сначала определяют ключевые запросы, потом схему — это обратный порядок относительно реляционного дизайна.

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

  • Почему проектирование от запросов.
  • Цена денормализации.
  • Где нормализация всё ещё уместна.

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

  • Слепо нормализовать документную схему «как в SQL» и упереться в дорогие $lookup.
  • Забывать про стоимость обновления продублированных данных.

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

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

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

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

  • Что такое $lookup и почему он дорог?
  • Как бороться с устареванием продублированных данных?

Разбор темы

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

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

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

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

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