Нормализация и денормализация

Нормализация уменьшает избыточность и аномалии изменения, раскладывая данные по отношениям. Это инструмент проектирования модели, а не соревнование за максимальную нормальную форму.

Зависимости

Если order_id -> user_id, state, total, то по идентификатору заказа однозначно определяются остальные атрибуты заказа. Нормальные формы опираются на такие функциональные зависимости.

Основные формы

1NF

Значение ячейки атомарно для выбранной модели, нет повторяющихся групп столбцов.

Плохо: orders.sku_1, orders.sku_2, orders.sku_3.

Правильно: отдельная таблица items, где каждой позиции соответствует строка.

2NF

Для составного ключа неключевой атрибут зависит от всего ключа, а не от его части.

Например, в строке (order_id, sku, order_created_at) дата заказа зависит только от order_id, поэтому ей место в orders.

3NF

Неключевой атрибут не должен зависеть от другого неключевого атрибута.

Хранение (user_id, postal_code, city) может дублировать зависимость postal_code -> city, если она действительно верна для домена.

BCNF

Для каждой нетривиальной функциональной зависимости определитель должен быть потенциальным ключом. BCNF строже 3NF и иногда требует компромисса с сохранением зависимостей.

Аномалии

  • update anomaly: одно значение надо менять во многих строках;
  • insert anomaly: объект нельзя сохранить без несвязанного объекта;
  • delete anomaly: удаление одной строки случайно удаляет единственную информацию о другом факте.

Денормализация

Это осознанное хранение производного или дублированного факта ради чтения:

  • orders.total при наличии позиций;
  • счетчик заказов пользователя;
  • проекция для отчета;
  • материализованное представление.

Перед этим нужен ответ:

  1. Какой измеренный запрос выигрывает?
  2. Где единственный источник истины?
  3. Как обновлять копии атомарно или асинхронно?
  4. Как обнаруживать и исправлять расхождения?

Связано: Влияние денормализации на производительность SQL запросов, Ключи БД, Ограничения, constraints, Оперативная обработка транзакций.

Вопросы

Зачем нормализовать? Чтобы хранить факт в одном месте и уменьшать аномалии изменения.

Что такое функциональная зависимость? Если значение X однозначно определяет Y, записывают X -> Y.

Всегда ли нужна BCNF? Нет; учитывают целостность, простоту и реальные операции.

Когда допустима денормализация? После измерения, с явным источником истины и механизмом согласования.