Чистка заголовков
This commit is contained in:
+31
-30
@@ -1,9 +1,9 @@
|
||||
# **Хранилище данных: как устроена аналитика «под капотом»**
|
||||
# Хранилище данных: как устроена аналитика «под капотом»
|
||||
*Для тех, кто знает SQL, но хочет понять, как хранить данные не в Excel, а по-взрослому*
|
||||
|
||||
---
|
||||
|
||||
## **Что вы уже умеете — и что узнаете здесь**
|
||||
## Что вы уже умеете — и что узнаете здесь
|
||||
|
||||
✅ Уже знаете:
|
||||
- `SELECT`, `JOIN`, `GROUP BY`;
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
---
|
||||
|
||||
## **1. Введение: почему нельзя просто SELECT из базы заказов?**
|
||||
## 1. Введение: почему нельзя просто SELECT из базы заказов?
|
||||
|
||||
Представьте: вы — аналитик в интернет-магазине. Вам нужно ответить на вопрос:
|
||||
> **«Сколько заказов сделал клиент с email `a@ex.com` за 2023 год, и сколько он потратил?»**
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
---
|
||||
|
||||
## **2. Учебный пример: интернет-магазин**
|
||||
## 2. Учебный пример: интернет-магазин
|
||||
|
||||
Чтобы всё было на пальцах — разберём простой, но живой пример.
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
---
|
||||
|
||||
## **3. Зачем делить DWH на слои?**
|
||||
## 3. Зачем делить DWH на слои?
|
||||
|
||||
Представьте, что вы строите дом. Вы же не будете сразу вбивать гвозди в стены — сначала:
|
||||
1. Привезли стройматериалы (песок, доски, кирпич) — **сырьё**;
|
||||
@@ -121,7 +121,7 @@ flowchart TD
|
||||
|
||||
---
|
||||
|
||||
## **4. Путешествие данных: от STG до DM**
|
||||
## 4. Путешествие данных: от STG до DM
|
||||
|
||||
Давайте проследим, как превращается строка заказа.
|
||||
|
||||
@@ -189,7 +189,7 @@ flowchart TD
|
||||
|
||||
---
|
||||
|
||||
## **5. Базовые понятия: факты, измерения, SCD**
|
||||
## 5. Базовые понятия: факты, измерения, SCD
|
||||
|
||||
Представьте отчёт:
|
||||
> *«10 января 2024 года клиент из Москвы (сегмент Premium) купил Phone за 100 ₽»*.
|
||||
@@ -245,7 +245,7 @@ erDiagram
|
||||
}
|
||||
```
|
||||
|
||||
### **SCD Type 2 — как хранить историю**
|
||||
### SCD Type 2 — как хранить историю
|
||||
|
||||
Клиент №101:
|
||||
- с 1 янв по 15 мая — `email = a@ex.com`, `city = Москва`;
|
||||
@@ -272,11 +272,11 @@ fact_sales.order_date BETWEEN dim_customer.valid_from AND dim_customer.valid_to
|
||||
|
||||
---
|
||||
|
||||
## **6. Модели данных для слоя DDS: 4 подхода — и когда какой выбрать**
|
||||
## 6. Модели данных для слоя DDS: 4 подхода — и когда какой выбрать
|
||||
|
||||
В DDS мы можем хранить данные по-разному. Это не «правильно/неправильно», а **выбор под задачу**.
|
||||
|
||||
### **1. 3NF (третья нормальная форма)**
|
||||
### 1. 3NF (третья нормальная форма)
|
||||
*Источник: Билл Инмон (Bill Inmon)*
|
||||
|
||||
✅ **Плюсы**:
|
||||
@@ -295,7 +295,7 @@ fact_sales.order_date BETWEEN dim_customer.valid_from AND dim_customer.valid_to
|
||||
|
||||
---
|
||||
|
||||
### **2. Звезда (Star Schema)**
|
||||
### 2. Звезда (Star Schema)
|
||||
*Источник: Ральф Кимболл (Ralph Kimball)*
|
||||
|
||||
✅ **Плюсы**:
|
||||
@@ -314,7 +314,7 @@ fact_sales.order_date BETWEEN dim_customer.valid_from AND dim_customer.valid_to
|
||||
|
||||
---
|
||||
|
||||
### **3. Data Vault 2.0 — «конструктор Lego» для больших DWH**
|
||||
### 3. Data Vault 2.0 — «конструктор Lego» для больших DWH
|
||||
|
||||
*Идея: Дэн Линстедт (Dan Linstedt). Цель — так организовать хранилище, чтобы можно было спокойно добавлять новые источники и хранить историю, не ломая старую модель.*
|
||||
|
||||
@@ -416,7 +416,8 @@ fact_sales.order_date BETWEEN dim_customer.valid_from AND dim_customer.valid_to
|
||||
|
||||
---
|
||||
|
||||
### **4. Anchor Modeling (анкерное моделирование)**
|
||||
### 4. Anchor Modeling (анкерное моделирование)
|
||||
|
||||
*Источник: Ларс Рёне (Lars Rönnbäck)*
|
||||
|
||||
Ещё более атомарный подход:
|
||||
@@ -439,7 +440,7 @@ fact_sales.order_date BETWEEN dim_customer.valid_from AND dim_customer.valid_to
|
||||
|
||||
---
|
||||
|
||||
### **Сравнение моделей — наглядно**
|
||||
### Сравнение моделей — наглядно
|
||||
|
||||
```mermaid
|
||||
quadrantChart
|
||||
@@ -459,11 +460,11 @@ quadrantChart
|
||||
|
||||
---
|
||||
|
||||
## **7. Практикум: как собрать первую витрину**
|
||||
## 7. Практикум: как собрать первую витрину
|
||||
|
||||
Покажем на примере `mart_daily_sales` — таблицу, которую можно сразу подключить к BI.
|
||||
|
||||
### **Этапы сборки**
|
||||
### Этапы сборки
|
||||
|
||||
1. Из STG → ODS:
|
||||
- `stg.orders_raw` → `ods.orders` (привели `order_date` к `DATE`);
|
||||
@@ -509,9 +510,9 @@ flowchart TD
|
||||
DM_SALES --> BI
|
||||
```
|
||||
|
||||
### **Готовые SQL-скрипты**
|
||||
### Готовые SQL-скрипты
|
||||
|
||||
Все необходимые скрипты для построения хранилища находятся в папке [`sql/`](dwh-modeling/sql/):
|
||||
Все необходимые скрипты для построения хранилища находятся в папке [`sql/`](sql/):
|
||||
|
||||
- [`01_ddl_stg-dds.sql`](sql/01_ddl_stg-dds.sql) — создание схем и таблиц (STG, ODS, DDS)
|
||||
- [`02_dml_stg-dds.sql`](sql/02_dml_stg-dds.sql) — загрузка данных и трансформация
|
||||
@@ -520,7 +521,7 @@ flowchart TD
|
||||
- [`05_ddl_dm.sql`](sql/05_ddl_dm.sql) — создание витрин (Data Marts)
|
||||
- [`06_dml_dm.sql`](sql/06_dml_dm.sql) — наполнение витрин данными
|
||||
|
||||
### **Пример SQL-запроса для витрины**
|
||||
### Пример SQL-запроса для витрины
|
||||
|
||||
```sql
|
||||
-- mart_daily_sales: ежедневные продажи с сегментацией
|
||||
@@ -547,7 +548,7 @@ GROUP BY d.date_actual, p.product_name, c.customer_segment;
|
||||
|
||||
---
|
||||
|
||||
## **8. Как выбрать модель данных? Советы от практиков**
|
||||
## 8. Как выбрать модель данных? Советы от практиков
|
||||
|
||||
Выбор модели — **не техническая задача, а стратегическая**.
|
||||
Это как решать: строить дом из кирпича, дерева или SIP-панелей. У каждой технологии — свои плюсы, но **главное — подходит ли она *вам* сегодня**.
|
||||
@@ -636,7 +637,7 @@ GROUP BY d.date_actual, p.product_name, c.customer_segment;
|
||||
|
||||
---
|
||||
|
||||
## **9. Эксплуатация: качество данных — это не «опция»**
|
||||
## 9. Эксплуатация: качество данных — это не «опция»
|
||||
|
||||
Самая красивая архитектура бессмысленна, если в `mart_daily_sales` — нули.
|
||||
Поэтому в каждом слое — **контроль качества (DQ, Data Quality)**.
|
||||
@@ -679,7 +680,7 @@ SELECT 'OK' WHERE EXISTS (
|
||||
|
||||
---
|
||||
|
||||
## **10. Заключение: главное — понимать «почему»**
|
||||
## 10. Заключение: главное — понимать «почему»
|
||||
|
||||
Хранилище данных — это не про «крутые технологии», а про **мышление**:
|
||||
|
||||
@@ -705,7 +706,7 @@ SELECT 'OK' WHERE EXISTS (
|
||||
|
||||
---
|
||||
|
||||
## **Приложения**
|
||||
## Приложения
|
||||
|
||||
### 📚 Мини-глоссарий (RU / EN)
|
||||
|
||||
@@ -747,11 +748,11 @@ SELECT 'OK' WHERE EXISTS (
|
||||
|
||||
---
|
||||
|
||||
## **ЧАСТЬ C. Мини-датасет (для практики)**
|
||||
## ЧАСТЬ C. Мини-датасет (для практики)
|
||||
|
||||
Все данные для практики находятся в папке [`data/`](data/) — тренируйтесь:
|
||||
|
||||
[**`customers.csv`**](data/customers.csv):
|
||||
[`customers.csv`](data/customers.csv):
|
||||
```csv
|
||||
customer_id,email,phone,city
|
||||
101,a@ex.com,700,Москва
|
||||
@@ -759,14 +760,14 @@ customer_id,email,phone,city
|
||||
102,c@ex.com,701,СПб
|
||||
```
|
||||
|
||||
[**`orders.csv`**](data/orders.csv):
|
||||
[`orders.csv`](data/orders.csv):
|
||||
```csv
|
||||
order_id,order_date,customer_id
|
||||
5001,2024-01-10,101
|
||||
5002,2024-02-05,102
|
||||
```
|
||||
|
||||
[**`order_items.csv`**](data/order_items.csv):
|
||||
[`order_items.csv`](data/order_items.csv):
|
||||
```csv
|
||||
order_item_id,order_id,product_id,qty,price_at_sale
|
||||
1,5001,9001,2,100.00
|
||||
@@ -774,14 +775,14 @@ order_item_id,order_id,product_id,qty,price_at_sale
|
||||
3,5002,9001,1,100.00
|
||||
```
|
||||
|
||||
[**`products.csv`**](data/products.csv):
|
||||
[`products.csv`](data/products.csv):
|
||||
```csv
|
||||
product_id,name
|
||||
9001,Phone
|
||||
9002,Case
|
||||
```
|
||||
|
||||
[**`prices.csv`**](data/prices.csv):
|
||||
[`prices.csv`](data/prices.csv):
|
||||
```csv
|
||||
product_id,valid_from,valid_to,price
|
||||
9001,2023-12-01,2024-01-31,100
|
||||
@@ -792,7 +793,7 @@ product_id,valid_from,valid_to,price
|
||||
|
||||
---
|
||||
|
||||
## **ЧАСТЬ D. DDL-скелеты (PostgreSQL)**
|
||||
## ЧАСТЬ D. DDL-скелеты (PostgreSQL)
|
||||
|
||||
Полные DDL-скрипты для всех слоёв хранилища находятся в файле [`01_ddl_stg-dds.sql`](sql/01_ddl_stg-dds.sql).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user