Data Warehouse Design для System Design
Зачем проектировать Warehouse
Data Warehouse — центральное хранилище аналитических данных. Правильный выбор модели определяет производительность запросов, гибкость schema evolution и стоимость поддержки.
Dimensional Modeling: Fact и Dimension Tables
Dimensional model разделяет данные на два типа таблиц:
Fact Table (события/метрики):
- order_id, customer_id, product_id, date_id
- amount, quantity, discount
- Миллионы/миллиарды строк
- Append-only (immutable events)
Dimension Table (контекст):
- customer: id, name, email, segment, city
- product: id, name, category, brand, price
- date: id, date, month, quarter, year, is_holiday
- Тысячи/миллионы строк
- Slowly changing (SCD)
Star vs Snowflake vs Data Vault
Star Schema
Dimensions денормализованы — один уровень JOIN от fact:
SELECT d.segment, SUM(f.amount)
FROM fact_orders f
JOIN dim_customer d ON f.customer_id = d.customer_id
GROUP BY d.segment
-- Один JOIN, максимальная скорость
Денормализованные wide tables в ClickHouse
Part anatomy — физический уровень хранения ClickHouse
Snowflake Schema
Dimensions нормализованы — несколько уровней:
dim_customer → dim_city → dim_country
-- Экономит storage, но запросы сложнее и медленнее
-- Используется редко в modern warehouses
Data Vault
Разделяет на Hubs (бизнес-ключи), Links (связи), Satellites (атрибуты с историей):
Hub_Customer: hash_key, business_key, load_date
Sat_Customer: hash_key, name, email, load_date, source
Link_Order_Customer: hash_key, hub_order_key, hub_customer_key
-- Максимальная гибкость, сложная реализация
-- Подходит для enterprise с множеством источников
| Модель | Joins | Гибкость | Сложность | Use Case |
|---|---|---|---|---|
| Star | 1 уровень | Средняя | Низкая | BI, аналитика (90% случаев) |
| Snowflake | N уровней | Средняя | Средняя | Экономия storage |
| Data Vault | Через Hubs/Links | Высокая | Высокая | Enterprise, множество sources |
SCD — Slowly Changing Dimensions
Как обрабатывать изменения в dimension tables:
| SCD Type | Стратегия | История | Пример |
|---|---|---|---|
| Type 0 | Не обновлять | Нет | Дата рождения |
| Type 1 | Overwrite | Нет | Исправление опечатки |
| Type 2 | Новая строка + valid_from/to | Полная | Смена города клиента |
| Type 3 | Доп. колонка (prev_value) | Частичная | current_city + previous_city |
SCD Type 2 — самый распространённый:
customer_id | name | city | valid_from | valid_to | is_current
1 | Иван | Москва | 2023-01-01 | 2024-06-15 | false
1 | Иван | Казань | 2024-06-15 | 9999-12-31 | true
JOIN fact → dimension по date range для historical accuracy
SCD в ClickHouse — практическая реализация
Warehouse vs Lakehouse — когда что
Warehouse (BigQuery, Snowflake, Redshift):
[OK] SQL-first, BI оптимизирован
[OK] Managed, auto-scaling
[OK] Structured data only
[NO] Дорого при TB+ scale
[NO] Vendor lock-in
Lakehouse (Databricks, Delta/Iceberg + Spark):
[OK] Open formats, no lock-in
[OK] ML + SQL на одних данных
[OK] Semi-structured data
[NO] Больше operational overhead
[NO] Оптимизация требует экспертизы
Правило выбора: Если 90%+ workload — SQL аналитика и BI → warehouse. Если есть ML, data science, streaming или unstructured data → lakehouse. Гибридный вариант: lakehouse для raw/staging + warehouse для serving layer.