Вариант от deepseek
This commit is contained in:
@@ -0,0 +1,363 @@
|
|||||||
|
Отлично! Я умею рисовать 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.
|
||||||
Reference in New Issue
Block a user