- Зачем: - docs/internal/ превратился в свалку: дизайн-документы, ревью, планы и справочники лежали вперемешку. - архивные планы были неотличимы от живых документов. - Что: - docs/internal/ удалён; файлы распределены по docs/design/, docs/reference/, docs/archive/, docs/plans/, docs/assignment/. - educational-tasks.md убран из корня в архив (устарел). - обновлены все перекрёстные ссылки в AGENTS.md, TODO.md, README.md, docs/README.md и внутри design/reference/. - актуализированы architecture_review.md (статус DM-слоя), db_schema.md (DM-слой), TESTING.md, dag_execution_order.md, pxf_bookings.md. - добавлены заглушки docs/assignment/README.md и docs/plans/README.md. - Проверка: - make test && make lint - rg 'docs/internal' --glob '!docs/archive/*' — должно быть пусто.
67 lines
4.4 KiB
Markdown
67 lines
4.4 KiB
Markdown
# Конвенции Нейминга DWH (Единый Источник)
|
|
|
|
> Статус: активный стандарт для новых реализаций в этом репозитории.
|
|
>
|
|
> Основа: учебные материалы `de-roadmap/dwh-modeling`.
|
|
|
|
## Зачем этот документ
|
|
|
|
Чтобы имена полей не «плыли» между слоями, DAG и SQL-скриптами:
|
|
- студенты видят один и тот же словарь во всех задачах;
|
|
- новые реализации (ODS/DDS/DM) не расходятся с тем, как уже учили на `dwh-modeling`;
|
|
- ревью становится проще: сразу видно, где отклонение от стандарта.
|
|
|
|
## 1. Базовые правила
|
|
|
|
- Имена колонок: `snake_case`, на английском.
|
|
- Бизнес-ключи источника не переименовываем без необходимости (`book_ref`, `ticket_no`, `route_no`).
|
|
- Булевы поля начинаются с `is_` (`is_outbound`, `is_boarded`).
|
|
- Денежные/количественные поля называем явно (`total_amount`, `segment_amount`, `range_km`).
|
|
|
|
## 2. Каноничные служебные поля
|
|
|
|
| Поле | Тип (рекомендация) | Смысл | Где применять |
|
|
|---|---|---|---|
|
|
| `_load_id` | `TEXT NOT NULL` | Идентификатор загрузки/батча | STG/ODS (новые объекты), при необходимости DDS |
|
|
| `_load_ts` | `TIMESTAMP NOT NULL` | Когда запись попала в слой | STG/ODS (новые объекты) |
|
|
| `event_ts` | `TIMESTAMP` | Когда событие произошло в источнике (effective time) | ODS/DDS при событийной природе данных |
|
|
| `created_at` | `TIMESTAMP NOT NULL` | Когда строка создана в таблице слоя | DDS/DM, где есть lifecycle строки |
|
|
| `updated_at` | `TIMESTAMP NOT NULL` | Когда строка обновлена в таблице слоя | DDS/DM, где есть UPDATE |
|
|
| `valid_from` | `DATE NOT NULL` (базовый трек) | Начало действия версии SCD2 | DDS SCD2 |
|
|
| `valid_to` | `DATE` | Конец действия версии SCD2 (`NULL` = current) | DDS SCD2 |
|
|
| `hashdiff` | `TEXT NOT NULL` | Хэш атрибутов версии для детекта изменений | DDS SCD2 |
|
|
|
|
## 3. Ключи в DDS
|
|
|
|
- Бизнес-ключ измерения: суффикс `_bk` (`customer_bk`, `airport_bk`).
|
|
- Суррогатный ключ измерения: суффикс `_sk` (`customer_sk`, `airport_sk`).
|
|
|
|
## 4. Правило времени (важно для обучения)
|
|
|
|
- `event_ts` (effective time) и `_load_ts` (load time) — разные сущности, не смешиваем.
|
|
- Если `event_ts` отсутствует в источнике, используем `_load_ts` как fallback и явно документируем это в SQL/доке.
|
|
- Для snapshot-справочников (airports, airplanes, routes, seats) в STG нет бизнес-события с точным временем: `event_ts` заполняется через `now()` при загрузке. Это намеренно и задокументировано в каждом load-скрипте.
|
|
|
|
## 5. Применение по слоям
|
|
|
|
### STG
|
|
|
|
- Используем канон `_load_id`, `_load_ts`, `event_ts` для всех таблиц.
|
|
|
|
### ODS
|
|
|
|
- Используем канон `_load_id`, `_load_ts`, `event_ts`.
|
|
- Базовый эталон ODS в этом стенде: SCD Type 1 (current state + UPSERT).
|
|
|
|
### DDS
|
|
|
|
- Для SCD2 используем:
|
|
- `valid_from`, `valid_to`, `hashdiff`, `created_at`, `updated_at`.
|
|
- Интервалы считаем как `[valid_from, valid_to)`, current-версия: `valid_to IS NULL`.
|
|
|
|
## 6. Что проверяем в ревью
|
|
|
|
- Нет новых техполей-синнонимов вроде `loaded_at`, `ingested_at`, `batch_key`, если уже есть канон.
|
|
- Нет смешивания `event_ts` и `_load_ts` в одном смысле.
|
|
- В SCD2 не используются альтернативы `dw_start_date/dw_end_date`, если в проекте принят `valid_from/valid_to`.
|