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

Что такое нормализация и когда оправдана денормализация?

MiddleМоделирование данныхSQL
Ещё спрашивают так:
  • Зачем нормализовать базу данных?
  • Когда денормализация оправдана?
Коротко

Нормализация — каждый факт хранится в одном месте: нет дублей, а значит нет аномалий обновления. Денормализация — сознательное дублирование ради быстрого чтения.

  • Аномалии без нормализации: обновили адрес в одной строке, в другой остался старый
  • Денормализуют, когда чтение доминирует и JOIN дороги: счётчики, витрины, модели чтения
  • Цена денормализации — синхронизация копий (триггеры, события, пересчёт)

А ещё Начинают с нормализованной схемы, денормализуют точечно по измерениям

Подробно

Нормализация — разбиение данных так, чтобы каждый факт хранился один раз. Если имя клиента записано в каждой строке заказа, то при смене имени нужно обновить тысячи строк, а пропущенная строка создаёт противоречие — аномалия обновления. Есть и аномалии вставки (нельзя завести клиента без заказа) и удаления (удалив последний заказ, теряем клиента). Нормальные формы (1НФ–3НФ, НФБК) формализуют правила.

Плюсы: целостность, компактность, простые изменения, гибкость для новых запросов.

Денормализация — дублирование ради чтения:

  • хранить order.total, а не считать сумму позиций при каждом показе;
  • счётчик комментариев в посте;
  • имя автора в документе поиска;
  • модели чтения в CQRS, витрины в аналитике, колоночные хранилища.

Когда оправдана: чтение намного чаще записи, JOIN и агрегаты стали узким местом по измерениям, данные меняются редко или допустима задержка.

Цена: копии нужно синхронизировать — в той же транзакции, триггерами, событиями или периодическим пересчётом, и следить за расхождениями.

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

  • Цель нормализации и примеры аномалий.
  • Когда и зачем денормализуют, с примерами.
  • Цена денормализации и способы синхронизации.

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

  • Денормализовать заранее «для скорости» без измерений.
  • Хранить производные данные без механизма их обновления.

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

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

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

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

  • Что такое 3NF простыми словами?
  • Как поддерживать согласованность денормализованных данных?

Разбор темы

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

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

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

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

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