Sobes.tech
Back to questions
Middle
11

Что такое нормализация и денормализация баз данных?

Companies where asked
ЛеруаМерлен

Answer from AI

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-систем, где много записей и обновлений.
  • Денормализация часто используется в аналитике и отчётности, где важна скорость чтения.
  • Это не взаимоисключающие подходы: на практике часто нормализуют ядро данных и частично денормализуют витрины или отчёты.
  • Выбор зависит от баланса между скоростью запросов, стоимостью обновлений и требованиями к консистентности.