363 lines
11 KiB
Markdown
363 lines
11 KiB
Markdown
Отлично! Я умею рисовать Mermaid-схемы и с удовольствием добавлю их в план. Вот переработанный вариант с дополнительными визуализациями для ключевых концепций.
|
||
|
||
---
|
||
|
||
### **Структура статьи про хранилище данных (с визуализацией Mermaid)**
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[ ] --> B[1. Введение<br>Проблема аналитики в OLTP]
|
||
B --> C[2. Учебный пример<br>Интернет-магазин]
|
||
C --> D[3. Архитектура<br>Зачем слои?]
|
||
D --> E[4. Путешествие данных<br>STG→ODS→DDS→DM]
|
||
E --> F[5. Базовые понятия<br>Факты, Измерения, SCD]
|
||
F --> G[6. Модели данных<br>3NF, DV, Звезда]
|
||
G --> H[7. Практикум<br>Собираем витрину]
|
||
H --> I[8. Выбор модели<br>Дерево решений]
|
||
I --> J[9. Эксплуатация<br>Качество и эволюция]
|
||
J --> K[10. Заключение]
|
||
```
|
||
|
||
---
|
||
|
||
#### **1. Введение: Аналитика — это не оперативка**
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
subgraph OLTP[OLTP - Операционные системы]
|
||
A[CRM]
|
||
B[Заказы]
|
||
C[Склад]
|
||
end
|
||
|
||
subgraph DWH[DWH - Аналитическое хранилище]
|
||
D[Единая модель<br>для анализа]
|
||
end
|
||
|
||
OLTP -- Сложные JOIN<br>Медленные отчеты --> X[Проблемы]
|
||
X -- Слоистая архитектура<br>Оптимизированные модели --> DWH
|
||
```
|
||
|
||
**Ключевые тезисы**:
|
||
- OLTP vs OLAP: транзакции против анализа
|
||
- Почему "одна большая таблица" не работает на истории
|
||
- 3 преимущества слоев: управляемость, производительность, прозрачность
|
||
|
||
---
|
||
|
||
#### **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
|
||
```
|
||
|
||
---
|
||
|
||
#### **3. Архитектура хранилища: зачем делить на слои?**
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
subgraph Sources[Источники OLTP]
|
||
A[CRM]
|
||
B[Заказы]
|
||
C[Склад]
|
||
end
|
||
|
||
A --> STG
|
||
B --> STG
|
||
C --> STG
|
||
|
||
subgraph STG[STG - Сырые данные]
|
||
D[Таблицы-клоны<br>сырые данные]
|
||
end
|
||
|
||
STG --> ODS
|
||
|
||
subgraph ODS[ODS - Очищенные данные]
|
||
E[Стандартизированные<br>типы и форматы]
|
||
end
|
||
|
||
ODS --> DDS
|
||
|
||
subgraph DDS[DDS - Интегрированная модель]
|
||
F[Бизнес-сущности<br>SCD, интеграция]
|
||
end
|
||
|
||
DDS --> DM
|
||
|
||
subgraph DM[DM - Витрины для аналитики]
|
||
G[Звезда/снежинка<br>агрегаты]
|
||
end
|
||
|
||
DM --> BI[BI-системы<br>и отчеты]
|
||
```
|
||
|
||
---
|
||
|
||
#### **4. Путешествие данных по слоям**
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
subgraph STG[STG - Сырье]
|
||
A[raw_orders.json]
|
||
B[raw_customers.csv]
|
||
C[Формат как в источнике]
|
||
end
|
||
|
||
subgraph ODS[ODS - Очистка]
|
||
D[stg_orders]
|
||
E[stg_customers]
|
||
F[Типизация, валидация]
|
||
end
|
||
|
||
subgraph DDS[DDS - Интеграция]
|
||
G[dim_customer<br>SCD Type 2]
|
||
H[fact_orders<br>с суррогатными ключами]
|
||
end
|
||
|
||
subgraph DM[DM - Готовые решения]
|
||
I[mart_sales<br>агрегированные данные]
|
||
J[mart_customer_360<br>обзор по клиентам]
|
||
end
|
||
|
||
STG --> ODS
|
||
ODS --> DDS
|
||
DDS --> DM
|
||
```
|
||
|
||
---
|
||
|
||
#### **5. Базовые понятия: Факты, Измерения, Ключи**
|
||
|
||
```mermaid
|
||
erDiagram
|
||
dim_date ||--o{ fact_sales : "дата"
|
||
dim_customer ||--o{ fact_sales : "клиент"
|
||
dim_product ||--o{ fact_sales : "товар"
|
||
|
||
dim_customer {
|
||
bigint customer_sk PK
|
||
varchar customer_bk
|
||
varchar customer_name
|
||
varchar email
|
||
date valid_from
|
||
date valid_to
|
||
boolean is_current
|
||
}
|
||
|
||
fact_sales {
|
||
bigint sale_id PK
|
||
bigint customer_sk FK
|
||
bigint product_sk FK
|
||
date date_sk FK
|
||
int quantity
|
||
decimal amount
|
||
}
|
||
```
|
||
|
||
**SCD Type 2 - Визуализация истории**:
|
||
|
||
```mermaid
|
||
gantt
|
||
title SCD Type 2: История изменений клиента (ID = 123)
|
||
dateFormat YYYY-MM-DD
|
||
axisFormat %Y-%m
|
||
|
||
section Москва, premium@email.com
|
||
Версия 1 :active, 2023-01-01, 2023-05-15
|
||
|
||
section Москва, new_premium@email.com
|
||
Версия 2 :active, 2023-05-16, 2023-09-30
|
||
|
||
section Санкт-Петербург, new_premium@email.com
|
||
Версия 3 :active, 2023-10-01, 2024-12-31
|
||
```
|
||
|
||
---
|
||
|
||
#### **6. Модели данных для DDS**
|
||
|
||
**Data Vault 2.0**:
|
||
|
||
```mermaid
|
||
erDiagram
|
||
hub_customer ||--o{ sat_customer_info : "хаб"
|
||
hub_order ||--o{ sat_order_details : "хаб"
|
||
hub_product ||--o{ sat_product_info : "хаб"
|
||
|
||
hub_customer ||--o{ link_order_customer : "участвует"
|
||
hub_order ||--o{ link_order_customer : "включает"
|
||
|
||
hub_order ||--o{ link_order_product : "содержит"
|
||
hub_product ||--o{ link_order_product : "входит в"
|
||
|
||
hub_customer {
|
||
string customer_hash_key PK
|
||
string customer_id BK
|
||
datetime load_dttm
|
||
}
|
||
|
||
sat_customer_info {
|
||
string customer_hash_key PK,FK
|
||
datetime load_dttm PK
|
||
string customer_name
|
||
string email
|
||
string phone
|
||
}
|
||
|
||
link_order_customer {
|
||
string order_customer_hash_key PK
|
||
string order_hash_key FK
|
||
string customer_hash_key FK
|
||
datetime load_dttm
|
||
}
|
||
```
|
||
|
||
**Сравнение моделей**:
|
||
|
||
```mermaid
|
||
quadrantChart
|
||
title Сравнение моделей данных по сложности и гибкости
|
||
x-axis "Низкая сложность" --> "Высокая сложность"
|
||
y-axis "Низкая гибкость" --> "Высокая гибкость"
|
||
"Звезда": [0.2, 0.3]
|
||
"3NF": [0.6, 0.5]
|
||
"Data Vault": [0.8, 0.8]
|
||
"Anchor": [0.9, 0.9]
|
||
```
|
||
|
||
---
|
||
|
||
#### **7. Практикум: собираем витрину**
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[Источники] --> STG
|
||
STG[STG: сырые заказы, товары] --> ODS
|
||
ODS[ODS: очищенные данные] --> DDS
|
||
|
||
subgraph DDS[DDS: интегрированная модель]
|
||
B[dim_customer<br>SCD Type 2]
|
||
C[dim_product]
|
||
D[dim_date]
|
||
E[fact_sales]
|
||
end
|
||
|
||
DDS --> F{Сборка витрины}
|
||
|
||
F --> G[mart_daily_sales]
|
||
F --> H[mart_customer_lifetime]
|
||
|
||
G --> I[Дашборд продаж]
|
||
H --> J[Отчет по клиентам]
|
||
```
|
||
|
||
**Пример SQL для витрины**:
|
||
```sql
|
||
-- Витрина ежедневных продаж
|
||
CREATE TABLE mart_daily_sales AS
|
||
SELECT
|
||
d.date,
|
||
p.product_name,
|
||
c.customer_segment,
|
||
SUM(f.quantity) as total_quantity,
|
||
SUM(f.amount) as total_amount
|
||
FROM fact_sales f
|
||
JOIN dim_date d ON f.date_key = d.date_key
|
||
JOIN dim_product p ON f.product_key = p.product_key
|
||
JOIN dim_customer c ON f.customer_key = c.customer_key
|
||
WHERE c.is_current = true
|
||
GROUP BY d.date, p.product_name, c.customer_segment;
|
||
```
|
||
|
||
---
|
||
|
||
#### **8. Выбор модели: дерево решений**
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start[Выбор модели DDS] --> Q1{Количество источников?}
|
||
|
||
Q1 -->|Один источник| Q2{Требования к истории?}
|
||
Q1 -->|Несколько источников| Q3{Частота изменений схемы?}
|
||
|
||
Q2 -->|Простая история| Model1[Звезда/Снежинка]
|
||
Q2 -->|Полная аудируемая история| Model2[Data Vault]
|
||
|
||
Q3 -->|Редко| Model3[3NF]
|
||
Q3 -->|Часто| Model4[Data Vault]
|
||
|
||
Model1 --> Final[Рекомендация]
|
||
Model2 --> Final
|
||
Model3 --> Final
|
||
Model4 --> Final
|
||
```
|
||
|
||
---
|
||
|
||
#### **9. Эксплуатация: качество и эволюция**
|
||
|
||
```mermaid
|
||
graph TB
|
||
A[Данные] --> B{Контроль качества}
|
||
|
||
B --> C[Проверка уникальности]
|
||
B --> D[Проверка полноты]
|
||
B --> E[Валидация форматов]
|
||
B --> F[Свежесть данных]
|
||
|
||
C --> G[✅ Успех]
|
||
D --> G
|
||
E --> G
|
||
F --> G
|
||
|
||
C --> H[❌ Ошибка]
|
||
D --> H
|
||
E --> H
|
||
F --> H
|
||
|
||
G --> I[Загрузка в слой]
|
||
H --> J[Оповещение<br>и остановка]
|
||
```
|
||
|
||
---
|
||
|
||
#### **10. Заключение: главное — понимать "почему"**
|
||
|
||
```mermaid
|
||
mindmap
|
||
root((Хранилище данных))
|
||
Архитектура
|
||
Слои STG→ODS→DDS→DM
|
||
Разделение ответственности
|
||
Управляемость изменений
|
||
Модели данных
|
||
3NF: Целостность
|
||
Data Vault: Масштабируемость
|
||
Звезда: Производительность
|
||
Ключевые понятия
|
||
Факты и измерения
|
||
Суррогатные ключи
|
||
SCD Type 2
|
||
Практика
|
||
Понимать бизнес-задачу
|
||
Выбирать подходящую модель
|
||
Строить итеративно
|
||
```
|
||
|
||
---
|
||
|
||
Такой визуализированный план поможет студентам:
|
||
1. **Быстрее понять сложные концепции** через схемы
|
||
2. **Увидеть связи между разделами** через общую навигацию
|
||
3. **Запомнить ключевые отличия** моделей через сравнительные диаграммы
|
||
4. **Поножить практическое применение** через конкретные примеры
|
||
|
||
Все схемы готовы к использованию в статье и будут отлично работать в Markdown-редакторах с поддержкой Mermaid. |