- Зачем: - 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/*' — должно быть пусто.
4.4 KiB
4.4 KiB
Конвенции Нейминга 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.