Почему в документных БД схему проектируют от запросов, а не нормализуют как в реляционной?
- Почему в MongoDB не нормализуют данные?
В документной базе нет дешёвых JOIN, поэтому схему денормализуют под основные запросы: так, чтобы запрос обслуживался одним документом.
- Начинают со списка запросов, а не с сущностей
- Плата — дублирование и синхронизация копий
- Нормализация остаётся там, где данные часто меняются и читаются отдельно
А ещё Тот же принцип в Cassandra и DynamoDB
Подробно
В реляционной модели нормализация убирает дублирование, а join-ы дёшевы. В документной БД join-ов между коллекциями либо нет, либо они дороги ($lookup), поэтому оптимизируют под чтение: связанные данные дублируют/вкладывают так, чтобы основной запрос обслуживался одним документом. Плата — контролируемая денормализация: при изменении продублированных данных их надо обновлять в нескольких местах (или мириться с устареванием). Поэтому сначала определяют ключевые запросы, потом схему — это обратный порядок относительно реляционного дизайна.
Что хотят услышать
- Почему проектирование от запросов.
- Цена денормализации.
- Где нормализация всё ещё уместна.
Частые ошибки
- Слепо нормализовать документную схему «как в SQL» и упереться в дорогие $lookup.
- Забывать про стоимость обновления продублированных данных.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Потому что документные БД не умеют хранить связи в принципе
- ✗Движок сам денормализует данные при записи, поэтому ручная нормализация лишь дублирует его работу и мешает
- ✗Потому что документы всегда меньше реляционных строк
- ✓Join-ы между коллекциями дороги, поэтому данные раскладывают под типовой запрос, допуская денормализацию
Что спросят дальше
- Что такое $lookup и почему он дорог?
- Как бороться с устареванием продублированных данных?
Разбор темы
- Документоориентированные БД (MongoDB)
Модель документа, embedding против referencing, индексы, aggregation pipeline, атомарность документа и шардирование.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.