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

↑ 1.1 Реляционная модель и SQL · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: junior

Зачем это на собесе

Проверяют, понимаете ли вы, зачем нормализуют и почему иногда сознательно нарушают нормальные формы.

Аномалии в плохой схеме

Таблица orders(order_id, customer_name, customer_phone, product, price):

  • аномалия вставки: нельзя добавить клиента без заказа;
  • аномалия обновления: телефон клиента хранится в каждом заказе, легко получить расхождения;
  • аномалия удаления: удалив последний заказ, теряем клиента.

Нормальные формы

НФУсловиеПример нарушения
1НФзначения атомарны, нет повторяющихся группстолбец phones = '111, 222'
2НФ1НФ + нет частичных зависимостей от части составного ключа(order_id, product_id) → product_name зависит только от product_id
3НФ2НФ + нет транзитивных зависимостейzip → city, а ключ — user_id
BCNFкаждая детерминанта — потенциальный ключусиленная 3НФ
4НФ и вышемногозначные зависимости и др.применяют редко

Запоминалка: «данные зависят от ключа, от всего ключа и ни от чего, кроме ключа».

Пример

-- до: всё в одной таблице
orders(order_id, customer_email, customer_city, product_name, product_price, qty)
 
-- после (3НФ)
customers(id, email, city)
products(id, name, price)
orders(id, customer_id)
order_items(order_id, product_id, qty, price_at_order)

Обратите внимание на price_at_order: цена на момент заказа — это исторический факт, а не дубль; менять её при обновлении прайса нельзя.

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

Осознанное нарушение нормальных форм ради скорости чтения.

ПриёмПримерЦена
Дублирование поляorders.customer_name для списка без JOINрассинхронизация
Счётчикиposts.comments_countобновление при каждом изменении
Материализованные агрегатысводные таблицы, materialized viewобновление и задержка
JSONB-снимокадрес доставки на момент заказасложность запросов
Хранилище для аналитикизвезда, снежинкаотдельная модель

Поддержка согласованности: транзакции, триггеры, пересчёт в фоне, события.

Когда что

  • OLTP: нормализуем до 3НФ, денормализуем точечно по измеренным узким местам;
  • OLAP: денормализованные широкие таблицы, схемы «звезда»;
  • документные БД — данные, читаемые вместе, хранят вместе.

Вопросы с ответами