docs(modeling): исправлены ссылки на папки и markdown для сайта
- Зачем: - относительные ссылки на каталоги sql/ и data/ давали 404 на GitHub Pages; - em-dash в заголовках нарушает правило AGENTS.md (расходятся слаги GitHub/MkDocs); - 2-пробельная вложенность и списки без пустой строки ломали рендер в MkDocs - Что: - ссылки на папки заменены на GitHub-tree-ссылки (работают на обеих платформах); - в 26 заголовках « — » заменено на «: » или убрано (README, SCD, DataVault, домашка); - пустая строка перед списком «Главные правила» в DataVault; - вложенные списки DataVault переведены на 4-пробельный отступ - Проверка: - mkdocs build --strict (без ошибок); - grep по репо — якорных ссылок на старые слаги заголовков нет; - grep по site/dwh-modeling/*.html — списки рендерятся <ul>/<li>, вложенность сохранена Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -126,7 +126,7 @@ erDiagram
|
|||||||
|
|
||||||
Чуть менее «сказочно», чуть более технично.
|
Чуть менее «сказочно», чуть более технично.
|
||||||
|
|
||||||
### 3.1. Hub — сущность и её бизнес-ключ
|
### 3.1. Hub: сущность и её бизнес-ключ
|
||||||
|
|
||||||
**Hub** содержит:
|
**Hub** содержит:
|
||||||
|
|
||||||
@@ -137,6 +137,7 @@ erDiagram
|
|||||||
* иногда — хэш бизнес‑ключа (hk_customer).
|
* иногда — хэш бизнес‑ключа (hk_customer).
|
||||||
|
|
||||||
Главные правила:
|
Главные правила:
|
||||||
|
|
||||||
* один бизнес‑ключ — один хаб (одна строка на сущность, без истории);
|
* один бизнес‑ключ — один хаб (одна строка на сущность, без истории);
|
||||||
* хаб не знает про атрибуты (имя, email) — только идентичность.
|
* хаб не знает про атрибуты (имя, email) — только идентичность.
|
||||||
|
|
||||||
@@ -153,7 +154,7 @@ CREATE TABLE hub_customer (
|
|||||||
|
|
||||||
Конкретные типы данных (`BYTEA`, длины `VARCHAR`, детали `hashdiff`) и реализации хэш‑ключей можно не запоминать: на старте важнее понять саму идею — у сущностей есть стабильные ключи, а все изменения атрибутов мы записываем отдельными версиями в сателлитах.
|
Конкретные типы данных (`BYTEA`, длины `VARCHAR`, детали `hashdiff`) и реализации хэш‑ключей можно не запоминать: на старте важнее понять саму идею — у сущностей есть стабильные ключи, а все изменения атрибутов мы записываем отдельными версиями в сателлитах.
|
||||||
|
|
||||||
### 3.2. Link — связи между сущностями
|
### 3.2. Link: связи между сущностями
|
||||||
|
|
||||||
**Link** описывает факт связи, например:
|
**Link** описывает факт связи, например:
|
||||||
|
|
||||||
@@ -178,7 +179,7 @@ CREATE TABLE link_order_customer (
|
|||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3.3. Satellite — атрибуты и история
|
### 3.3. Satellite: атрибуты и история
|
||||||
|
|
||||||
**Satellite** хранит:
|
**Satellite** хранит:
|
||||||
|
|
||||||
@@ -249,7 +250,7 @@ Star Schema]
|
|||||||
* **Raw Vault** — это про приём и хранение данных «как есть», но уже в форме Hub / Link / Satellite.
|
* **Raw Vault** — это про приём и хранение данных «как есть», но уже в форме Hub / Link / Satellite.
|
||||||
* **Business Vault** — это про приведение этих данных в более «деловой» вид: с бизнес-правилами, PIT/Bridge и подготовленными представлениями.
|
* **Business Vault** — это про приведение этих данных в более «деловой» вид: с бизнес-правилами, PIT/Bridge и подготовленными представлениями.
|
||||||
|
|
||||||
### 5.1. Raw Vault — «всё прилетевшее, аккуратно разложенное по ящичкам»
|
### 5.1. Raw Vault: «всё прилетевшее, аккуратно разложенное по ящичкам»
|
||||||
|
|
||||||
Raw DV — первый слой поверх STG / ODS:
|
Raw DV — первый слой поверх STG / ODS:
|
||||||
|
|
||||||
@@ -265,7 +266,7 @@ Raw DV — первый слой поверх STG / ODS:
|
|||||||
* все источники показываются «как есть», только приведены к общим ключам;
|
* все источники показываются «как есть», только приведены к общим ключам;
|
||||||
* структура стабильна: добавился новый источник → появился новый Satellite к тому же Hub.
|
* структура стабильна: добавился новый источник → появился новый Satellite к тому же Hub.
|
||||||
|
|
||||||
### 5.2. Business Vault — «там, где из Lego собирают модули»
|
### 5.2. Business Vault: «там, где из Lego собирают модули»
|
||||||
|
|
||||||
Business Vault (BV) — следующий слой над Raw DV:
|
Business Vault (BV) — следующий слой над Raw DV:
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ customer_id,status,event_ts,_load_id,_load_ts
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. Часть 1 — STG → ODS (обязательно)
|
## 3. Часть 1: STG → ODS (обязательно)
|
||||||
|
|
||||||
**Задача:** загрузить CSV в STG и переложить данные в ODS с приведением типов.
|
**Задача:** загрузить CSV в STG и переложить данные в ODS с приведением типов.
|
||||||
|
|
||||||
@@ -145,7 +145,7 @@ ORDER BY customer_id, event_ts;
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. Часть 2 — ODS → DDS (SCD Type 2, обязательно)
|
## 4. Часть 2: ODS → DDS (SCD Type 2, обязательно)
|
||||||
|
|
||||||
**Задача:** по событиям в `ods.customer_status` построить измерение `dds.dim_customer_status`, где каждая строка — период действия статуса.
|
**Задача:** по событиям в `ods.customer_status` построить измерение `dds.dim_customer_status`, где каждая строка — период действия статуса.
|
||||||
|
|
||||||
@@ -216,7 +216,7 @@ ORDER BY customer_bk, valid_from;
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. Часть 3 — инкрементальная загрузка (по желанию)
|
## 5. Часть 3: инкрементальная загрузка (по желанию)
|
||||||
|
|
||||||
Если хочется потренироваться глубже:
|
Если хочется потренироваться глубже:
|
||||||
|
|
||||||
@@ -241,7 +241,7 @@ cat dwh-modeling/data/customer_status_events_increment.csv | ./postgres-bookings
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 6. Часть 4 — витрина в DM (по желанию)
|
## 6. Часть 4: витрина в DM (по желанию)
|
||||||
|
|
||||||
Опциональное задание для закрепления: собрать небольшую витрину с количеством клиентов по статусам на каждую дату.
|
Опциональное задание для закрепления: собрать небольшую витрину с количеством клиентов по статусам на каждую дату.
|
||||||
|
|
||||||
|
|||||||
+12
-12
@@ -145,7 +145,7 @@ flowchart TD
|
|||||||
|
|
||||||
Давайте проследим, как превращается строка заказа.
|
Давайте проследим, как превращается строка заказа.
|
||||||
|
|
||||||
### **STG (Staging / Bronze)** — «как пришло»
|
### **STG (Staging / Bronze)**: «как пришло»
|
||||||
|
|
||||||
- Таблицы: `stg.orders_raw`, `stg.customers_raw`;
|
- Таблицы: `stg.orders_raw`, `stg.customers_raw`;
|
||||||
- Структура — *точно как в источнике* (может быть `VARCHAR` даже у дат);
|
- Структура — *точно как в источнике* (может быть `VARCHAR` даже у дат);
|
||||||
@@ -158,7 +158,7 @@ flowchart TD
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### **ODS (Operational Data Store / Silver)** — «почистили, но не трогали смысл»
|
### **ODS (Operational Data Store / Silver)**: «почистили, но не трогали смысл»
|
||||||
|
|
||||||
- Таблицы: `ods.orders`, `ods.customers`;
|
- Таблицы: `ods.orders`, `ods.customers`;
|
||||||
- Здесь:
|
- Здесь:
|
||||||
@@ -174,7 +174,7 @@ flowchart TD
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### **DDS (Data Delivery Store / Core / Conformed)** — «интеграция + история»
|
### **DDS (Data Delivery Store / Core / Conformed)**: «интеграция + история»
|
||||||
|
|
||||||
Здесь рождается *единая бизнес-модель*.
|
Здесь рождается *единая бизнес-модель*.
|
||||||
Появляются понятия: **измерения**, **факты**, **суррогатные ключи**, **SCD**.
|
Появляются понятия: **измерения**, **факты**, **суррогатные ключи**, **SCD**.
|
||||||
@@ -199,7 +199,7 @@ flowchart TD
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### **DM (Data Mart / Gold/ «Витрины»)** — «готово к употреблению»
|
### **DM (Data Mart / Gold / «Витрины»)**: «готово к употреблению»
|
||||||
|
|
||||||
Здесь — таблицы и представления для конкретных задач:
|
Здесь — таблицы и представления для конкретных задач:
|
||||||
|
|
||||||
@@ -266,7 +266,7 @@ erDiagram
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### SCD Type 2 — как хранить историю
|
### SCD Type 2: как хранить историю
|
||||||
|
|
||||||
Клиент №101:
|
Клиент №101:
|
||||||
|
|
||||||
@@ -418,7 +418,7 @@ WHERE c.city = 'Москва'
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 3. Data Vault 2.0 — «конструктор Lego» для больших DWH
|
### 3. Data Vault 2.0: «конструктор Lego» для больших DWH
|
||||||
|
|
||||||
*Идея: Дэн Линстедт (Dan Linstedt). Цель — так организовать хранилище, чтобы можно было спокойно добавлять новые источники и хранить историю, не ломая старую модель.*
|
*Идея: Дэн Линстедт (Dan Linstedt). Цель — так организовать хранилище, чтобы можно было спокойно добавлять новые источники и хранить историю, не ломая старую модель.*
|
||||||
|
|
||||||
@@ -468,7 +468,7 @@ Anchor Modeling - ещё более атомарный подход к моде
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Сравнение моделей — наглядно
|
### Сравнение моделей наглядно
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
quadrantChart
|
quadrantChart
|
||||||
@@ -540,7 +540,7 @@ flowchart TD
|
|||||||
|
|
||||||
### Готовые SQL-скрипты
|
### Готовые SQL-скрипты
|
||||||
|
|
||||||
Все необходимые скрипты для построения хранилища находятся в папке [`sql/`](sql/):
|
Все необходимые скрипты для построения хранилища находятся в папке [`sql/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/sql):
|
||||||
|
|
||||||
- [`01_ddl_stg-dds.sql`](sql/01_ddl_stg-dds.sql) — создание схем и таблиц (STG, ODS, DDS);
|
- [`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) — первичная загрузка данных и демонстрация SCD2 через полный пересчёт (`full backfill`) из STG;
|
- [`02_dml_stg-dds.sql`](sql/02_dml_stg-dds.sql) — первичная загрузка данных и демонстрация SCD2 через полный пересчёт (`full backfill`) из STG;
|
||||||
@@ -605,7 +605,7 @@ GROUP BY d.date_actual, p.product_name,
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### ✅ Базовые советы — с чего начать, если вы учитесь или делаете первый DWH
|
### ✅ Базовые советы: с чего начать, если вы учитесь или делаете первый DWH
|
||||||
|
|
||||||
1. **Начните с витрины в формате Звезды (Star Schema).**
|
1. **Начните с витрины в формате Звезды (Star Schema).**
|
||||||
— Это просто: одна таблица фактов + несколько «плоских» измерений.
|
— Это просто: одна таблица фактов + несколько «плоских» измерений.
|
||||||
@@ -660,7 +660,7 @@ GROUP BY d.date_actual, p.product_name,
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 📌 Кратко — что выбрать *сегодня*, если вы только учитесь
|
### 📌 Кратко: что выбрать *сегодня*, если вы только учитесь
|
||||||
|
|
||||||
| У вас… | Делайте… |
|
| У вас… | Делайте… |
|
||||||
|--------|----------|
|
|--------|----------|
|
||||||
@@ -791,7 +791,7 @@ SELECT 'OK' WHERE EXISTS (
|
|||||||
|
|
||||||
### Мини-датасет (для практики)
|
### Мини-датасет (для практики)
|
||||||
|
|
||||||
Все данные для практики находятся в папке [`data/`](data/) — тренируйтесь:
|
Все данные для практики находятся в папке [`data/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/data) — тренируйтесь:
|
||||||
|
|
||||||
[`customers.csv`](data/customers.csv):
|
[`customers.csv`](data/customers.csv):
|
||||||
```csv
|
```csv
|
||||||
@@ -832,7 +832,7 @@ product_id,valid_from,valid_to,price
|
|||||||
9002,2023-01-01,,50
|
9002,2023-01-01,,50
|
||||||
```
|
```
|
||||||
|
|
||||||
> 📂 Все SQL-скрипты для построения хранилища находятся в папке [`sql/`](sql/).
|
> 📂 Все SQL-скрипты для построения хранилища находятся в папке [`sql/`](https://github.com/dementev-dev/de-roadmap/tree/main/dwh-modeling/sql).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+7
-7
@@ -28,15 +28,15 @@ SCD — это подход к хранению изменений в измер
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. Типы SCD — простыми словами
|
## 3. Типы SCD простыми словами
|
||||||
|
|
||||||
Существует несколько стандартных стратегий обработки изменений. Рассмотрим самые важные.
|
Существует несколько стандартных стратегий обработки изменений. Рассмотрим самые важные.
|
||||||
|
|
||||||
### **Type 0 — Никогда не меняется**
|
### **Type 0: никогда не меняется**
|
||||||
Атрибут фиксирован навсегда. Например, дата рождения клиента.
|
Атрибут фиксирован навсегда. Например, дата рождения клиента.
|
||||||
Такие поля не требуют специальной обработки — они просто не обновляются.
|
Такие поля не требуют специальной обработки — они просто не обновляются.
|
||||||
|
|
||||||
### **Type 1 — Просто перезаписать**
|
### **Type 1: просто перезаписать**
|
||||||
Вы просто делаете `UPDATE`, и старое значение исчезает.
|
Вы просто делаете `UPDATE`, и старое значение исчезает.
|
||||||
|
|
||||||
✅ Просто.
|
✅ Просто.
|
||||||
@@ -44,7 +44,7 @@ SCD — это подход к хранению изменений в измер
|
|||||||
|
|
||||||
> Подходит, если изменение — это исправление ошибки (например, опечатка в имени).
|
> Подходит, если изменение — это исправление ошибки (например, опечатка в имени).
|
||||||
|
|
||||||
### **Type 2 — Новая строка для новой версии**
|
### **Type 2: новая строка для новой версии**
|
||||||
Каждое изменение порождает **новую строку** в таблице. Старая строка остаётся, но помечается как «устаревшая».
|
Каждое изменение порождает **новую строку** в таблице. Старая строка остаётся, но помечается как «устаревшая».
|
||||||
|
|
||||||
✅ Полная история.
|
✅ Полная история.
|
||||||
@@ -53,7 +53,7 @@ SCD — это подход к хранению изменений в измер
|
|||||||
|
|
||||||
> Это **самый распространённый** подход в аналитике.
|
> Это **самый распространённый** подход в аналитике.
|
||||||
|
|
||||||
### **Type 3 — Добавить колонку «предыдущее значение»**
|
### **Type 3: добавить колонку «предыдущее значение»**
|
||||||
В таблице появляются поля вроде `previous_category`, `category_change_date`.
|
В таблице появляются поля вроде `previous_category`, `category_change_date`.
|
||||||
|
|
||||||
✅ Простая история «до/после».
|
✅ Простая история «до/после».
|
||||||
@@ -61,7 +61,7 @@ SCD — это подход к хранению изменений в измер
|
|||||||
|
|
||||||
> Используется редко, чаще как компромисс в очень простых системах.
|
> Используется редко, чаще как компромисс в очень простых системах.
|
||||||
|
|
||||||
### **Type 4, 5, 6 — Продвинутые гибриды**
|
### **Type 4, 5, 6: продвинутые гибриды**
|
||||||
Эти типы существуют, но **встречаются редко** и почти не используются новичками:
|
Эти типы существуют, но **встречаются редко** и почти не используются новичками:
|
||||||
|
|
||||||
- **Type 4**: история выносится в отдельную таблицу («мини-хранилище» для одного измерения).
|
- **Type 4**: история выносится в отдельную таблицу («мини-хранилище» для одного измерения).
|
||||||
@@ -99,7 +99,7 @@ WHERE customer_id = 1;
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Type 2: сохраняем историю — подробнее
|
### Type 2: сохраняем историю (подробнее)
|
||||||
|
|
||||||
Чтобы хранить историю, мы меняем структуру таблицы. Вот ключевые поля:
|
Чтобы хранить историю, мы меняем структуру таблицы. Вот ключевые поля:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user