Нормализация и денормализация
Нормализация уменьшает избыточность и аномалии изменения, раскладывая данные по отношениям. Это инструмент проектирования модели, а не соревнование за максимальную нормальную форму.
Зависимости
Если 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при наличии позиций;- счетчик заказов пользователя;
- проекция для отчета;
- материализованное представление.
Перед этим нужен ответ:
- Какой измеренный запрос выигрывает?
- Где единственный источник истины?
- Как обновлять копии атомарно или асинхронно?
- Как обнаруживать и исправлять расхождения?
Связано: Влияние денормализации на производительность SQL запросов, Ключи БД, Ограничения, constraints, Оперативная обработка транзакций.
Вопросы
Зачем нормализовать? Чтобы хранить факт в одном месте и уменьшать аномалии изменения.
Что такое функциональная зависимость? Если значение X однозначно определяет Y, записывают X -> Y.
Всегда ли нужна BCNF? Нет; учитывают целостность, простоту и реальные операции.
Когда допустима денормализация? После измерения, с явным источником истины и механизмом согласования.