Files
de-roadmap/dwh-modeling-ds.md
T
2025-11-04 23:15:14 +03:00

10 KiB
Raw Blame History

Отлично! Я умею рисовать Mermaid-схемы и с удовольствием добавлю их в план. Вот переработанный вариант с дополнительными визуализациями для ключевых концепций.


**Структура статьи про хранилище данных **

1. Введение. Проблема аналитики в OLTP
2. Учебный пример. Интернет-магазин
3. Архитектура. Зачем слои?
4. Путешествие данных. STG→ODS→DDS→DM
5. Базовые понятия. Факты, Измерения, SCD
6. Модели данных. 3NF, DV, Звезда
7. Практикум. Собираем витрину
8. Выбор моделию Дерево решений
9. Эксплуатация. Качество и эволюция
10. Заключение

1. Введение: Аналитика — это не оперативный учет

OLTP - Оперативный учет

  • CRM
  • Заказы
  • Склад

DWH - Аналитическое хранилище -> Единая модель
для анализа

OLTP - Сложные JOIN -> Медленные отчеты -> Проблемы

Ообенности DWH

  • Слоистая архитектура
  • Оптимизированные модели

Ключевые тезисы:

  • OLTP vs OLAP: транзакции против анализа
  • Почему "одна большая таблица" не работает на истории
  • 3 преимущества слоев: управляемость, производительность, прозрачность

2. Учебный пример: интернет-магазин

(Оставляю вашу отличную ER-диаграмму без изменений)

erDiagram
    CUSTOMER ||--o{ ORDER : places
    ORDER ||--|{ ORDER_ITEM : contains
    PRODUCT ||--o{ ORDER_ITEM : referenced
    PRODUCT ||--o{ PRICE : has
    PROMO ||--o{ ORDER_ITEM : applied

3. Архитектура хранилища: зачем делить на слои?

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. Путешествие данных по слоям

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. Базовые понятия: Факты, Измерения, Ключи

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 - Визуализация истории:

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:

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
    }

Сравнение моделей:

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. Практикум: собираем витрину

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 для витрины:

-- Витрина ежедневных продаж
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. Выбор модели: дерево решений

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. Эксплуатация: качество и эволюция

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. Заключение: главное — понимать "почему"

mindmap
  root((Хранилище данных))
    Архитектура
      Слои STG→ODS→DDS→DM
      Разделение ответственности
      Управляемость изменений
    Модели данных
      3NF: Целостность
      Data Vault: Масштабируемость
      Звезда: Производительность
    Ключевые понятия
      Факты и измерения
      Суррогатные ключи
      SCD Type 2
    Практика
      Понимать бизнес-задачу
      Выбирать подходящую модель
      Строить итеративно

Такой визуализированный план поможет студентам:

  1. Быстрее понять сложные концепции через схемы
  2. Увидеть связи между разделами через общую навигацию
  3. Запомнить ключевые отличия моделей через сравнительные диаграммы
  4. Поножить практическое применение через конкретные примеры

Все схемы готовы к использованию в статье и будут отлично работать в Markdown-редакторах с поддержкой Mermaid.