value of a series for a period/vintage). Types: transaction, periodic snapshot, accumulating snapshot.value временного ряда за период/версию). Типы: транзакция, периодический снимок, накапливающий снимок.| Aspect | Star | Snowflake |
|---|---|---|
| Dimensions | Denormalized (1 hop) | Normalized into sub-dims (multi-hop) |
| Joins / read speed | Fewer joins, faster, simpler BI | More joins, slower, more complex |
| Redundancy | Higher | Lower |
| Dim maintenance | Harder if dim is huge/volatile | Easier; shared sub-dims reused |
| Default? | Yes — esp. on columnar warehouses (Snowflake/BigQuery make denorm cheap) | Only for very large/volatile dims |
| Аспект | Звезда | Снежинка |
|---|---|---|
| Измерения | Денормализованы (1 хоп) | Нормализованы в под-измерения (много хопов) |
| JOIN'ы / скорость чтения | Меньше JOIN'ов, быстрее, проще для BI | Больше JOIN'ов, медленнее, сложнее |
| Избыточность | Выше | Ниже |
| Обслуживание измерений | Сложнее, если измерение огромное/изменчивое | Легче; общие под-измерения переиспользуются |
| По умолчанию? | Да — особенно на колоночных хранилищах (Snowflake/BigQuery делают денорм. дешёвой) | Только для очень больших/изменчивых измерений |
| Type | Behaviour | Use when |
|---|---|---|
| Type 1 | Overwrite, no history | Fix bad data nobody audits (typo in country name) |
| Type 2 | New row per change; full history | Must answer "what did this look like at time T" |
| Type 3 | Keep a "previous value" column | One step of history is enough |
| Type 4 | Separate history table | Keep current table thin |
| Type 6 | 1 + 2 + 3 hybrid | Want current + historical + prior-value |
| Тип | Поведение | Когда использовать |
|---|---|---|
| Type 1 | Перезапись, нет истории | Исправление плохих данных, которые никто не аудирует (опечатка в названии страны) |
| Type 2 | Новая строка на изменение; полная история | Надо отвечать на "как это выглядело в момент T" |
| Type 3 | Хранить колонку "предыдущее значение" | Достаточно одного шага истории |
| Type 4 | Отдельная таблица истории | Держать текущую таблицу тонкой |
| Type 6 | Гибрид 1 + 2 + 3 | Нужны текущие + исторические + предыдущие значения |
SCD2 columns: surrogate_key, business_key, valid_from, valid_to, is_current, often version. Use half-open intervals [valid_from, valid_to) to avoid overlap bugs.
Колонки SCD2: surrogate_key, business_key, valid_from, valid_to, is_current, часто version. Используй полуоткрытые интервалы [valid_from, valid_to), чтобы избежать багов пересечения.
A single (series, period) observation has many values over time: Q1 GDP printed in April, revised in May, rewritten at the annual benchmark. Clients need both "latest" and "as-it-was-on-date-X" (point-in-time / vintage).
Одно наблюдение (series, period) имеет много значений во времени: ВВП за Q1 опубликован в апреле, пересмотрен в мае, переписан при годовом бенчмарке. Клиенты нуждаются в обоих: «последнее» и «каким-оно-было-на-дату-X» (point-in-time / vintage).
Model it bi-temporally — two time axes:
Моделируй это битемпорально — две временные оси:
reference_period: the economic period the number describes (2026-Q1).vintage_date: when the value became known to us (the release/as-of date).reference_period: экономический период, который описывает число (2026-Q1).vintage_date: когда значение стало нам известно (дата релиза / as-of).Physical model = append-only ledger = effectively SCD Type 2 on the measurement. Never UPDATE; each revision is a new row.
Физическая модель = append-only журнал = фактически SCD Type 2 на измерении. Никогда UPDATE; каждая ревизия — новая строка.
-- LATEST view: newest known value per period SELECT series_id, reference_period, value FROM fct_observation QUALIFY ROW_NUMBER() OVER ( PARTITION BY series_id, reference_period ORDER BY vintage_date DESC) = 1; -- POINT-IN-TIME view: value as known on :as_of (no look-ahead bias) SELECT series_id, reference_period, value FROM fct_observation WHERE vintage_date <= :as_of_date QUALIFY ROW_NUMBER() OVER ( PARTITION BY series_id, reference_period ORDER BY vintage_date DESC) = 1;
| Normalization (3NF) | Denormalization | |
|---|---|---|
| Goal | Eliminate redundancy, integrity | Optimize reads, avoid joins |
| Fits | OLTP / write-heavy / sources | OLAP / analytics / read-heavy |
| Risk | Many joins | Update anomalies, drift, storage |
| Нормализация (3NF) | Денормализация | |
|---|---|---|
| Цель | Устранить избыточность, целостность | Оптимизировать чтения, избежать JOIN'ов |
| Подходит | OLTP / write-heavy / источники | OLAP / аналитика / read-heavy |
| Риск | Много JOIN'ов | Аномалии обновления, рассинхронизация, хранилище |
Normal forms ladder: 1NF (atomic values) → 2NF (no partial-key dependency) → 3NF (no transitive dependency).
Лестница нормальных форм: 1NF (атомарные значения) → 2NF (нет частичной зависимости от ключа) → 3NF (нет транзитивной зависимости).
Best practice: normalized core → denormalized serving layer rebuilt from it (the dbt staging → marts pattern). Denormalize derived from a single source so it can't drift.
Лучшая практика: нормализованное ядро → денормализованный serving-слой, пересобранный из него (паттерн dbt staging → marts). Денормализуй производное из единого источника, чтобы оно не могло рассинхронизироваться.
An integration / raw-history modelling pattern. Not for direct querying — you build dimensional marts on top of it. Insert-only, highly auditable, integrates many sources by business key → well suited to multi-vendor economics data & revisions.
Паттерн моделирования для интеграции / сырой истории. Не для прямых запросов — ты строишь размерные marts поверх него. Insert-only, высокая аудируемость, интегрирует много источников по бизнес-ключу → отлично подходит для экономических данных от разных вендоров и ревизий.
| Construct | Holds | Note |
|---|---|---|
| Hub | Business keys (e.g. series_id) + hash key | One row per unique key |
| Link | Relationships between hubs | Hash-keyed associations |
| Satellite | Descriptive, time-stamped attributes | Insert-only — this is where SCD2 / vintage history lives |
| Конструкт | Содержит | Замечание |
|---|---|---|
| Hub | Бизнес-ключи (например, series_id) + хеш-ключ | Одна строка на уникальный ключ |
| Link | Связи между хабами | Ассоциации с хеш-ключами |
| Satellite | Описательные атрибуты с временными метками | Insert-only — здесь живёт SCD2 / история версий |
| Type | Examples |
|---|---|
| Technical | Schemas, types, partitions, formats, locations |
| Business | Definitions, owners, glossary, classification, semantics ("what does this series mean") |
| Operational | Freshness, row counts, run history, quality scores, lineage |
| Тип | Примеры |
|---|---|
| Technical | Схемы, типы, партиции, форматы, расположения |
| Business | Определения, владельцы, глоссарий, классификация, семантика («что означает этот ряд») |
| Operational | Свежесть, число строк, история запусков, оценки качества, линедж |
Data catalog = searchable inventory of assets + metadata. Enables discovery ("is there already a CPI series?"), trust (owner/freshness/quality), governance (classification/access), and onboarding.
Каталог данных (Data catalog) = поисковый инвентарь активов + метаданные. Обеспечивает поиск («есть ли уже ряд CPI?»), доверие (владелец/свежесть/качество), управление (классификация/доступ) и онбординг.
Tools: DataHub, OpenMetadata, Collibra, Alation, Atlan, Unity Catalog. (At Meta, the internal catalog plays this role.)
Инструменты: DataHub, OpenMetadata, Collibra, Alation, Atlan, Unity Catalog. (В Meta эту роль играет внутренний каталог.)
Lineage = documented flow of data from source → every transform → consumption. Answers "where did this number come from" and "what breaks if I change this."
Линедж (Lineage) = задокументированный поток данных от источника → все трансформации → потребление. Отвечает на «откуда это число» и «что сломается, если я это изменю».
| Table-level | Column-level | |
|---|---|---|
| Granularity | Dataset A → B → dashboard C | fct.value = stg.raw * fx_rate |
| Good for | Orchestration / dependency graph | Precise impact analysis of a schema change |
| Table-level | Column-level | |
|---|---|---|
| Гранулярность | Датасет A → B → дашборд C | fct.value = stg.raw * fx_rate |
| Для чего | Оркестрация / граф зависимостей | Точный анализ влияния изменения схемы |
Produced by: parsing SQL (dbt column-level lineage via DAG + manifest.json), orchestration capture (Airflow), or a catalog (OpenMetadata, DataHub, Collibra, Atlan).
Создаётся: парсингом SQL (dbt column-level lineage через DAG + manifest.json), захватом оркестрации (Airflow) или каталогом (OpenMetadata, DataHub, Collibra, Atlan).
Profiling = analyzing data to understand structure, content & quality before/while modelling. Profiling feeds your DQ tests: it defines the expected ranges/domains you later assert.
Профилирование (Profiling) = анализ данных для понимания структуры, содержимого и качества до/во время моделирования. Профилирование питает DQ-тесты: оно определяет ожидаемые диапазоны/домены, которые ты потом проверяешь.
| Dimension | What you measure |
|---|---|
| Structure | Types, formats, lengths, patterns |
| Content | Min/max/mean, distributions, distinct counts, null/blank rate, outliers |
| Relationships | Candidate keys (uniqueness), FK validity, cardinality, functional dependencies |
| Измерение | Что измеряешь |
|---|---|
| Структура | Типы, форматы, длины, паттерны |
| Содержимое | Min/max/mean, распределения, число distinct, процент null/blank, выбросы |
| Связи | Кандидаты в ключи (уникальность), валидность FK, кардинальность, функциональные зависимости |
Tools: SQL (COUNT DISTINCT, GROUP BY, histograms), pandas .describe(), Great Expectations profiler, dbt_profiler, ydata-profiling.
Инструменты: SQL (COUNT DISTINCT, GROUP BY, гистограммы), pandas .describe(), Great Expectations profiler, dbt_profiler, ydata-profiling.
-999, 9999), mixed date formats, encoding issues, silently changed units, blanks-as-zero.-999, 9999), смешанные форматы дат, проблемы кодировки, молча изменённые единицы измерения, blanks-as-zero.Data governance = the system of decision rights & accountabilities for data: who can do what, with which data, under what circumstances. Spans ownership, quality, metadata, security/access, privacy, retention, standards.
Data governance = система прав на решения и ответственностей за данные: кто может делать что, с какими данными, при каких обстоятельствах. Охватывает владение, качество, метаданные, безопасность/доступ, конфиденциальность, хранение, стандарты.
| Role | RACI | Typically |
|---|---|---|
| Owner | Accountable — decisions, funding, sign-off | Business / domain leader |
| Steward | Responsible — day-to-day quality, definitions, metadata, issues | The DE / analyst (you) |
| Роль | RACI | Обычно |
|---|---|---|
| Owner | Accountable — решения, финансирование, подпись | Бизнес / руководитель домена |
| Steward | Responsible — ежедневное качество, определения, метаданные, проблемы | DE / аналитик (ты) |
Explicit, versioned agreement between producer & consumer: schema, semantics, SLAs (freshness/volume), quality guarantees, change/deprecation policy. Enforced in CI (schema diff fails the build) so producers can't silently break consumers.
Явное, версионируемое соглашение между продюсером и консьюмером: схема, семантика, SLA (свежесть/объём), гарантии качества, политика изменений/устаревания. Проверяется в CI (diff схемы фейлит билд), чтобы продюсеры не могли тихо ломать консьюмеров.
Validate at boundaries: on ingest (contract check), after transform (business rules), before publish (gate).
Валидируй на границах: при ingest (проверка контракта), после transform (бизнес-правила), перед publish (gate).
| Check class | Examples |
|---|---|
| Schema / structural | Column presence, types, not-null, enum domains, drift detection |
| Volume / freshness | Row count in band, partition arrived on SLA |
| Statistical / profiling | Ranges, distribution drift, null %, uniqueness, RI |
| Domain rules | GDP growth plausible, FX > 0, sum-of-parts = total |
| Класс проверок | Примеры |
|---|---|
| Схема / структура | Наличие колонок, типы, not-null, enum-домены, детекция дрейфа |
| Объём / свежесть | Число строк в диапазоне, партиция прибыла по SLA |
| Статистика / профилирование | Диапазоны, дрейф распределения, % null, уникальность, RI |
| Доменные правила | Рост ВВП разумен, FX > 0, сумма частей = целое |
Tools: dbt tests (unique, not_null, accepted_values, relationships, dbt_expectations), Great Expectations / Soda, custom Python anomaly detection.
Инструменты: dbt tests (unique, not_null, accepted_values, relationships, dbt_expectations), Great Expectations / Soda, кастомная детекция аномалий на Python.
For vintages: ingest → validate → model (revisions) → serve (latest + PIT) → archive old vintages to cold storage → rarely delete (PIT history is the product), entitlement-aware access.
Для версий: ingest → валидация → модель (ревизии) → serve (latest + PIT) → архив старых версий в холодное хранилище → редко удаляешь (PIT-история и есть продукт), доступ с учётом прав.
Single, authoritative, deduplicated golden record for core entities (customer, account, security, geography), shared across systems. Components: matching/dedup, survivorship rules, reference data, stewardship workflow.
Единственная, авторитетная, дедуплицированная золотая запись (golden record) для ключевых сущностей (customer, account, security, география), разделяемая между системами. Компоненты: matching/dedup, правила выживания, справочные данные, процесс stewardship.
Your analogue: canonical series_id / geography / source dimensions shared across systems so the same indicator means the same thing everywhere. (= your Career.io spine, one level up.)
Твой аналог: каноничный series_id / география / измерения источника, разделяемые между системами, чтобы один индикатор означал одно и то же везде. (= твой spine из Career.io, уровнем выше.)
Tap a card to flip. Answer cold before flipping.
Нажми на карточку, чтобы перевернуть. Отвечай до переворота.
★ = top-5 most likely.
★ = топ-5 наиболее вероятных.