Files
de-roadmap/dwh-modeling/dwh-modeling-basics.md
T

289 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Структура хранилища данных (для студентов SQL/Postgres)
> **Цель**: объяснить, как раскладывать данные в аналитической БД и почему именно так принято. Рус/Eng термины приводятся вместе (например, «витрина (Data Mart)»).
Статья для учениковп про то, чтобы понимать модели и уметь пользоваться моделированнаыми хранилищами, знать их структуру. У нее нет цели научить проектировать хранилища. Цель - научить понимать структуру и ее смысл
---
## 0. Навигация по статье
* [1. Введение: зачем слои и почему не «всё в одну таблицу»](#1)
* [2. Учебный домен/пример](#2)
* [3. Типичная структура слоёв (STG → ODS → DDS → DM)](#3)
* [4. Слои по отдельности](#4)
* [5. Модели данных для DDS/DM: 3NF, Звезда/Снежинка, Data Vault, Anchor](#5)
* [6. Ключевые понятия: факт/измерение, зерно, SK vs BK, SCD](#6)
* [7. Выбор подхода: дерево решений](#7)
* [8. Эволюция схемы и эксплуатации](#8)
* [9. MVP учебного проекта](#9)
* [10. Заключение](#10)
---
## 1. Введение: зачем слои и почему не «всё в одну таблицу»
**Коротко**: OLTP vs OLAP, управляемость, прозрачность, стоимость.
**Заглушки для текста**:
* Что такое слои и какую проблему решают.
* Почему «одна большая таблица» ломается на истории и изменениях.
* 3–4 тезиса о выгодах послойной архитектуры.
---
## 2. Учебный домен/пример (интернет-магазин)
**Описание**: используем один домен сквозь статью: клиенты, товары, заказы, позиции заказа, цены, акции.
**Диаграмма ER (эскиз)**:
```mermaid
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ ORDER_ITEM : contains
PRODUCT ||--o{ ORDER_ITEM : referenced
PRODUCT ||--o{ PRICE : has
PROMO ||--o{ ORDER_ITEM : applied
CUSTOMER {
int customer_id PK
string email
string phone
}
PRODUCT {
int product_id PK
string name
}
ORDER {
int order_id PK
date order_date
int customer_id FK
}
ORDER_ITEM {
int order_item_id PK
int order_id FK
int product_id FK
int qty
numeric price_at_sale
}
PRICE {
int product_id FK
date valid_from
date valid_to
numeric price
}
PROMO {
int promo_id PK
string code
}
```
**Заглушки**: 2–3 абзаца с пояснениями domain-гранулярности и бизнес-ключей (BK).
---
## 3. Типичная структура слоёв (STG → ODS → DDS → DM)
**Картинка-конвейер (эскиз)**:
```mermaid
flowchart TD
subgraph Sources[Источники]
A[CRM] --> STG
B[Billing] --> STG
C[E-comm] --> STG
end
STG[STG<br/>Staging / Bronze] --> ODS[ODS<br/>Operational / Silver]
ODS --> DDS[DDS<br/>Integrated / Conformed]
DDS --> DM[DM<br/>Data Marts / Gold]
DM --> BI[BI / Отчёты / Дашборды]
```
**Заглушки**:
* Соответствие Bronze/Silver/Gold.
* Что происходит на каждом переходе в 1–2 фразы.
---
## 4. Слои по отдельности
### 4.1 STG (Staging/Bronze)
**Коротко**: «как пришло». Идемпотентность, дедупликация, неизменяемость/переигрузка.
**TODO**: список «что можно» / «что нельзя»; форматы; контроль качества на входе.
### 4.2 ODS (Operational Data Store/Silver)
**Коротко**: чистка и выравнивание типов, базовая унификация кодов, ещё без тяжёлой бизнес-логики.
**TODO**: правила именования, ключи, простая история.
### 4.3 DDS (Integrated/Conformed Layer)
**Коротко**: интеграция источников, общие справочники, SK/BK, SCD. Здесь уже начинаются модели данных. Какие модели испольуют.
**TODO**: где хранить историю, антидубли, конформные измерения.
### 4.4 DM (Data Marts/Gold)
**Коротко**: модели под задачи BI (звезда/снежинка). Агрегаты, материализации.
**TODO**: границы ответственности витрин.
---
## 5. Модели данных для DDS/DM: 3NF, Звезда/Снежинка, Data Vault, Anchor
### 5.1 3NF (по Инмону, 3-я нормальная форма)
**Идея**: целостная интегрированная модель предприятия.
**Мини-эскиз (ER, нормализовано)**:
```mermaid
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ ORDER_ITEM : contains
PRODUCT ||--o{ ORDER_ITEM : referenced
CATEGORY ||--o{ PRODUCT : classifies
PRICE ||--o{ PRODUCT : defines
```
**TODO**: плюсы/минусы, когда выбирать.
### 5.2 Звезда/Снежинка (по Кимбаллу)
**Идея**: простые и быстрые аналитические запросы. 
Упомянуть, что самая часто испольуемая модель.
**Эскиз звезды: факт + измерения**:
```mermaid
flowchart LR
F[fact_orders<br/>order_id, date_key, customer_key, product_key, qty, amount]
D1[dim_date] --> F
D2[dim_customer] --> F
D3[dim_product] --> F
D4[dim_store] --> F
```
**Эскиз снежинки (нормализация измерения продукта)**:
```mermaid
graph LR
D3[dim_product] --> C[dim_category]
```
**TODO**: зерно факта, типы измерений, агрегаты.
### 5.3 Data Vault 2.0 (HubLinkSatellite)
**Идея**: масштабируемая интеграция многоисточниковых данных с полной историей.
**Эскиз DV (упорядоченная колонками)**:
```mermaid
flowchart LR
%% Hubs (слева)
HC[Hub_Customer]
HO[Hub_Order]
HP[Hub_Product]
%% Links (центр)
LOC[Link_OrderCustomer]
LOP[Link_OrderProduct]
%% Satellites (справа)
SC[SAT_Customer]
SO[SAT_Order]
SP[SAT_Product]
%% Связи к сателлитам
HC --> SC
HO --> SO
HP --> SP
%% Связи между хабами и линками
HC --> LOC
HO --> LOC
HO --> LOP
HP --> LOP
```
**TODO**: Raw Vault vs Business Vault, плюс/минус.
На каких слоях используем, зачем там оно нам.
Схема часто используется. Пишем, почему.
### 5.4 Anchor Modeling (Анкерное моделирование)
**Идея**: эволюционируемость атрибутов с версионированием на уровне «якорей/атрибутов/узлов».
**Эскиз (упрощённый)**:
```mermaid
flowchart LR
AC[Anchor CUSTOMER]
KC[Knot CUSTOMER_ID]
AC --> KC
AC --> AN[Attr NAME]
AC --> AE[Attr EMAIL]
AN --> NV[Name values history]
AE --> EV[Email values history]
```
**TODO**: где уместно, порог входа.
**TODO**: где уместно, порог входа.
Редко используется. Сложна для людей и для машин. Обосновываем.
---
## 6. Ключевые понятия (минимум для практики)
* **Факты (Facts)** и **Измерения (Dimensions)**; **зерно (grain)** факта.
* **Натуральные ключи (BK)** и **суррогатные ключи (SK)**.
* **SCD (Slowly Changing Dimensions)**: типы 1 / 2 / 4 / 6.
* **Bridge/Junk dimensions**, календарь, валюта, часовой пояс.
* **Поздно прибывающие события (late arriving)**.
**Эскиз SCD‑истории (Type 2) как лента времени**:
```mermaid
gantt
dateFormat YYYY-MM-DD
title SCD Type 2: dim_customer.name
section Customer 42
Version_1 :active, v1, 2023-01-01, 2023-06-14
Version_2 : v2, 2023-06-15, 2024-02-28
Version_3 : v3, 2024-03-01, 2025-10-26
```
**TODO**: короткие примеры для Type 1/2/4/6.
---
## 7. Эволюция схемы и эксплуатационные практики
* Совместимость назад/вперёд, view‑based миграции.
* Идемпотентные пайплайны, дедупликация, инкрементальные загрузки (CDC).
* Data Quality: уникальность, ссылочная целостность, распределения, «contracts».
* Каталог/линейка (Data Catalog / Lineage), словарь данных (Business Glossary), владение.
**TODO**: чек-лист из 8–10 пунктов.
---
## 10. Заключение
**Заглушки**: повторить ключевые тезисы, дать ссылки на дополнительные темы: CDC, оркестрация, тестирование данных, наблюдаемость.
---
## Примечания к иллюстрациям
* Диаграммы — **эскизы**: заменить/уточнить, когда будет готов текст.
* При необходимости добавить отдельные рисунки: «что можно/нельзя в слоях», SCD типы на одном полотне, пример late arriving events.