diff --git a/dwh-modeling-ds.md b/dwh-modeling-ds.md new file mode 100644 index 0000000..88871a9 --- /dev/null +++ b/dwh-modeling-ds.md @@ -0,0 +1,363 @@ +Отлично! Я умею рисовать Mermaid-схемы и с удовольствием добавлю их в план. Вот переработанный вариант с дополнительными визуализациями для ключевых концепций. + +--- + +### **Структура статьи про хранилище данных (с визуализацией Mermaid)** + +```mermaid +flowchart TD + A[ ] --> B[1. Введение
Проблема аналитики в OLTP] + B --> C[2. Учебный пример
Интернет-магазин] + C --> D[3. Архитектура
Зачем слои?] + D --> E[4. Путешествие данных
STG→ODS→DDS→DM] + E --> F[5. Базовые понятия
Факты, Измерения, SCD] + F --> G[6. Модели данных
3NF, DV, Звезда] + G --> H[7. Практикум
Собираем витрину] + H --> I[8. Выбор модели
Дерево решений] + I --> J[9. Эксплуатация
Качество и эволюция] + J --> K[10. Заключение] +``` + +--- + +#### **1. Введение: Аналитика — это не оперативка** + +```mermaid +flowchart LR + subgraph OLTP[OLTP - Операционные системы] + A[CRM] + B[Заказы] + C[Склад] + end + + subgraph DWH[DWH - Аналитическое хранилище] + D[Единая модель
для анализа] + end + + OLTP -- Сложные JOIN
Медленные отчеты --> X[Проблемы] + X -- Слоистая архитектура
Оптимизированные модели --> 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[Таблицы-клоны
сырые данные] + end + + STG --> ODS + + subgraph ODS[ODS - Очищенные данные] + E[Стандартизированные
типы и форматы] + end + + ODS --> DDS + + subgraph DDS[DDS - Интегрированная модель] + F[Бизнес-сущности
SCD, интеграция] + end + + DDS --> DM + + subgraph DM[DM - Витрины для аналитики] + G[Звезда/снежинка
агрегаты] + end + + DM --> BI[BI-системы
и отчеты] +``` + +--- + +#### **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
SCD Type 2] + H[fact_orders
с суррогатными ключами] + end + + subgraph DM[DM - Готовые решения] + I[mart_sales
агрегированные данные] + J[mart_customer_360
обзор по клиентам] + 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
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[Оповещение
и остановка] +``` + +--- + +#### **10. Заключение: главное — понимать "почему"** + +```mermaid +mindmap + root((Хранилище данных)) + Архитектура + Слои STG→ODS→DDS→DM + Разделение ответственности + Управляемость изменений + Модели данных + 3NF: Целостность + Data Vault: Масштабируемость + Звезда: Производительность + Ключевые понятия + Факты и измерения + Суррогатные ключи + SCD Type 2 + Практика + Понимать бизнес-задачу + Выбирать подходящую модель + Строить итеративно +``` + +--- + +Такой визуализированный план поможет студентам: +1. **Быстрее понять сложные концепции** через схемы +2. **Увидеть связи между разделами** через общую навигацию +3. **Запомнить ключевые отличия** моделей через сравнительные диаграммы +4. **Поножить практическое применение** через конкретные примеры + +Все схемы готовы к использованию в статье и будут отлично работать в Markdown-редакторах с поддержкой Mermaid. \ No newline at end of file