Что такое нормализация и денормализация баз данных?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Нормализация — это способ спроектировать таблицы так, чтобы убрать дублирование данных и избежать аномалий при вставке, обновлении и удалении. Денормализация — осознанное добавление избыточности ради ускорения чтения и упрощения запросов. Обычно ожидают понимание компромисса между целостностью данных и производительностью.
Определение:
Нормализация — это разбиение данных на связанные таблицы так, чтобы каждый факт хранился в одном месте и связи между сущностями задавались через ключи. Это снижает дублирование и делает данные согласованнее.
Денормализация — это обратный подход: часть данных намеренно дублируют или объединяют в одной таблице, чтобы уменьшить число JOIN-ов и ускорить чтение. Такой подход повышает скорость запросов, но усложняет обновление и поддержание согласованности.
Пример использования:
Допустим, есть таблица заказов, где в каждой строке повторяются имя клиента и его адрес. При нормализации данные клиента выносят в отдельную таблицу customers, а в orders оставляют только customer_id.
-- Нормализованная схема
customers(
id,
name,
address
)
orders(
id,
customer_id,
order_date,
total
)
Если система в основном часто строит отчёты по заказам и клиентам, можно денормализовать и хранить имя клиента прямо в orders, чтобы реже делать JOIN.
-- Денормализованный вариант
orders(
id,
customer_id,
customer_name,
order_date,
total
)
Пояснение кода:
В нормализованной схеме customers.id — это первичный ключ, а orders.customer_id — внешний ключ на клиента. Благодаря этому данные о клиенте меняются в одном месте: если адрес исправили, он обновился только в customers.
В денормализованной схеме customer_name в orders дублирует данные из customers. Это ускоряет чтение, потому что запросу не нужно каждый раз объединять таблицы, но если имя клиента изменится, придётся обновить его в нескольких строках заказов, иначе появится рассогласование.
Ключевые моменты:
- Нормализация уменьшает дублирование и повышает целостность данных.
- Денормализация ускоряет чтение, но увеличивает риск несогласованности.
- Нормализация обычно полезна для OLTP-систем, где много записей и обновлений.
- Денормализация часто используется в аналитике и отчётности, где важна скорость чтения.
- Это не взаимоисключающие подходы: на практике часто нормализуют ядро данных и частично денормализуют витрины или отчёты.
- Выбор зависит от баланса между скоростью запросов, стоимостью обновлений и требованиями к консистентности.