Денормализация на собеседовании системного аналитика

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем denormalization

Normalization (3НФ) — minimize duplication. Хорошо для writes / consistency.

Но joins дороги. Read-heavy workload + complex joins → slow queries.

Denormalization — duplicate data для read performance.

Trade-off. Faster reads, slower writes (need sync), risk inconsistency.

Виды denormalization

Pre-computed columns. Add denormalized field на main table.

Wide tables. Combine multiple tables в одну.

Materialized views. Pre-computed query results.

Aggregates. Daily / hourly summaries сохранены.

Pre-computed columns

Часто нужный data в FK related table → copy.

-- normalized
orders: id, customer_id, ...
customers: id, name, country, ...

-- denormalized
orders: id, customer_id, customer_name, customer_country, ...

Pros: join not needed для display.

Cons: при изменении customer_name — нужно update orders.

Sync. ON UPDATE trigger / async job / CDC.

Wide tables

Combine fact + frequently-used dimensions.

fact_orders + dim_customer + dim_product → fact_orders_wide

В DWH analytics — стандартный подход. ClickHouse loves wide tables (no joins).

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Materialized views

Query result сохранён как table. Refresh периодически.

CREATE MATERIALIZED VIEW daily_revenue AS
SELECT DATE, SUM(amount) FROM orders GROUP BY DATE;

REFRESH MATERIALIZED VIEW daily_revenue;

В Postgres — manual refresh. В ClickHouse — auto-refresh при insert (incrementally maintained).

Trade-off. Read fast (already aggregated). Write slower (need refresh).

Sync challenges

Главная боль denormalization — keep duplicate data в sync.

Strategies:

  • Trigger-based. ON UPDATE — sync. Tightly coupled с DB.
  • Application-level. Code updates everywhere. Easy to miss.
  • CDC. Listen на source changes, propagate. Standard в modern.
  • Recompute. Drop denormalized, rebuild периодически.

Eventual consistency. Window когда old data visible. Часто OK для analytics, не для финансов.

Связанные темы

FAQ

Это официальная информация?

Нет. Статья основана на стандартных подходах database design.


Тренируйте системный анализ — откройте тренажёр с 1500+ вопросами для собесов.