Перейти к содержанию

Принципы доменной модели


1. Governance

Базовые принципы

  1. Каждый ресурс должен принадлежать домену. Таблицы, представления и связи — всё это ресурсы домена. Неуправляемых «плавающих» ресурсов не существует. Домен — единица подотчётности.
  2. У каждого домена должен быть куратор (steward). Домен может существовать в состоянии ожидания, пока куратор не назначен, но он не может обслуживать управляемые данные без него.
  3. Администратор владеет источниками. Источники — это инфраструктура, а не ресурсы домена. Администратор регистрирует подключения к внешним системам данных и управляет ими.
  4. Кураторы могут заявлять таблицы для домена. Заявка (claiming) эксклюзивна — таблица принадлежит ровно одному домену. Это управляемый акт, соединяющий инфраструктуру и семантический слой.
  5. Кураторы могут создавать внутридоменные представления из ресурсов домена. Представления выражают бизнес-логику — соединения, агрегации, производные метрики — над ресурсами, которыми куратор владеет в рамках того же домена. Представления создают новый семантический смысл и требуют одобрения куратора.
  6. Аналитики могут создавать междоменные запросы из одобренных связей. Запросы — это междоменные представления, выраженные на любом поддерживаемом языке запросов. Они не создают новую семантику — они проходят по одобренным путям связей. Дополнительное одобрение не требуется: governance обрабатывается выше по потоку, на уровнях связей и видимости столбцов. Каталог — это механизм принудительного исполнения: компилятор отклоняет переходы, не входящие в одобренный каталог связей.
  7. Любой может запросить доступ к ресурсу домена. Доступ предоставляется на уровне ресурса, а не запроса. Если у вас есть доступ к ресурсу, вы можете его запрашивать. Governance применяется во время выполнения через конвейер.

Ресурсы: таблицы и представления как равноправные сущности

Различие между таблицей и представлением — только в происхождении: таблица заявлена из источника, представление определено куратором. Как только любая из них существует как ресурс домена, модель governance обращается с ними одинаково:

  • Оба — полноценные ресурсы домена, видимые в каталоге
  • Оба могут быть целью связи
  • Оба могут быть предоставлены по Принципу 6
  • Оба подчиняются одному и тому же конвейеру governance

Куратор может заявлять таблицы приватно и раскрывать только курируемые представления как публичные продукты данных.

Композиция представлений

Представление всегда принадлежит одному домену — существует только один тип представления, всегда внутридоменный. Представление существует для одной из двух целей:

  • Междоменный импорт — источник находится вне домена. Междоменные данные могут попасть в домен только через представление, которое действует как адаптер только для чтения, именующий внешние данные как бизнес-концепцию домена.
  • Локальная деривация — источник в том же домене. Представление производит новые или вычисляемые данные из существующих ресурсов домена. Новые или производные данные могут существовать только как представление.

Представление может ссылаться на:

  • Заявленные таблицы в рамках того же домена
  • Поля, импортированные из другого домена по гранту доступа к полям
  • Одно другое представление в рамках того же домена, где вариация целенаправленна: ограничение полей, агрегация или обогащение через дополнительное соединение

Глубина композиции технически не ограничена — суждение куратора при HITL-проверке является механизмом контроля качества.

Каждое представление несёт заявленную бизнес-цель, указанную на момент создания:

  • Часть управляемого артефакта — кураторы одобряют, зная, для чего предназначено представление
  • На неё ссылаются запросы доступа по Принципу 7, чтобы куратор мог оценить соответствие
  • Она сопровождает представление через весь рабочий процесс governance

Запросы

Запрос проходит по одобренным путям связей над ресурсами домена. В отличие от представлений, запросы не создают новый семантический смысл — они проходят по одобренной структуре модели. Запросы могут быть выражены на любом поддерживаемом языке запросов (SQL, GraphQL, Cypher).

Структурное принуждение: Каталог связей — это механизм принудительного исполнения. Компилятор проверяет каждый переход по одобренным записям каталога и отклоняет запросы, ссылающиеся на неодобренные пути. Governance структурен, а не является проверкой во время выполнения.

Одобрение не требуется: Governance происходит выше по потоку — на уровнях связей и видимости столбцов. Если у пользователя есть доступ к столбцам и путь перехода одобрен, запрос является допустимым использованием. Дополнительного барьера нет.

Отличие от представлений:

  • Представления: внутридоменные, вносят новый семантический смысл, курируются куратором
  • Запросы: проходят по одобренным связям, без новой семантики, без барьера одобрения

Выражение домена по языку запроса:

Каждый поддерживаемый язык раскрывает домен как структурное пространство имён, естественное для этого языка:

Язык Выражение домена Пример
GraphQL Префикс имени типа и поля type sales__Order { ... }, query { sales__orders { ... } }
SQL Имя схемы SELECT * FROM sales.orders
Cypher Дополнительная метка узла (домен требуется только при неоднозначности имени типа) MATCH (o:Sales:Order)

Компилятор разрешает принадлежность к домену из этих структурных позиций — аннотация или подсказка не требуются.

Связи

Связь — это одобренный путь перехода между двумя ресурсами. Границы доменов не имеют значения для того, что представляет собой связь, — они определяют лишь то, кто её одобряет.

Одобрение:

  • Одобрение требуется от каждого отдельного куратора, владеющего ресурсом, вовлечённым в связь
  • Если один куратор владеет обоими ресурсами, требуется одно одобрение. Если вовлечены два куратора, требуется два одобрения
  • Классификации «внутридоменная/междоменная» не существует — принадлежность естественным образом определяет бремя одобрения
  • Одобрение связи выстраивает граф зависимостей каждого куратора, обеспечивая проактивные уведомления об эволюции схемы

Связи создаются по требованию, а не заранее. Первая команда с бизнес-потребностью выполняет работу; последующие команды наследуют инфраструктуру.

Следствие для оптимизации: Объявление связи — это не только артефакт governance, но и структурное описание формы соединения. Две таблицы, два столбца и тип соединения, определяющие связь, — это ровно то, что нужно оптимизатору запросов для предварительной материализации этого соединения. Межисточниковые связи автоматически генерируют предварительно материализованные таблицы соединений; связи в рамках одного источника могут подключить это через materialize: true. Кураторы, продумывающие и одобряющие корректные связи, получают ускорение запросов как прямой побочный эффект — работа по governance и работа по оптимизации — это одно и то же действие.

Гранты доступа к полям

Грант доступа к полям — это разрешение между доменами: домен A может использовать определённые поля из домена B в своих представлениях.

Жизненный цикл гранта:

  • Инициируется при создании представления, когда выявлена потребность во внешних полях
  • Одобряется один раз куратором целевого домена
  • Принадлежит запрашивающему домену, а не представлению, которое его инициировало
  • Любое последующее представление в запрашивающем домене может использовать предоставленные поля без дальнейшего междоменного вовлечения
  • Дополнительные негрантованные поля требуют нового запроса

Уведомление после использования: Когда представление создаётся с использованием предоставленных полей, куратор источника уведомляется — но не должен одобрять. Уведомление включает имя представления, заявленную бизнес-цель, конкретные использованные поля и то, какой куратор её одобрил. Это даёт куратору источника:

  • Видимость — осведомлённость о том, как используются его данные
  • Надзор — основания поднять вопрос, если использование выглядит неуместным
  • Средство защиты — возможность отозвать грант, аннулировав зависимые представления

Компромисс: домен-источник одобряет доступ к полям, не зная каждое будущее использование. Одобрение для каждого представления корректно в теории и неработоспособно на практике.

Рабочий процесс создания запроса

Три этапа по порядку.

Этап 1 — Формирование (SQL discovery, со страницы Relationships):

  • Аналитик открывает инструмент Shaping со страницы Relationships для исследования потенциальных путей соединения в сыром SQL
  • SQL выполняется над доступными данными, с учётом существующих RLS и маскирования столбцов
  • JOIN'ы в SQL разбираются и раскрываются как кандидаты предложений Relationship
  • Кандидаты, предложенные машиной (вывод FK, семантический вывод), показываются вместе с SQL-исследованием аналитика в одном и том же представлении
  • Аналитик выбирает кандидатов для повышения до формального запроса Relationship

Этап 2 — Одобрение связи (значимо — структурно и постоянно):

  • Поднимается на каждого отдельного куратора, владеющего ресурсом, вовлечённым в связь
  • Является ли этот путь перехода легитимным? Семантически ли корректно соединение?
  • Все вовлечённые кураторы должны одобрить; связь становится постоянной записью каталога

Этап 3 — Создание запроса:

  • Аналитик строит запрос на любом поддерживаемом языке (SQL, GraphQL, Cypher), проходя по одобренным путям связей
  • Проходимы только одобренные связи каталога — компилятор обеспечивает это структурно
  • Одобрение не требуется — видимость столбцов и одобрение связи — единственные барьеры

HITL как основной механизм контроля

Технические правила обрабатывают то, что объективно — отслеживание происхождения полей, применение границ домена, проверка компилятором. Контекстное суждение остаётся за куратором. Такие ограничения, как глубина композиции представлений, требования к цели каждого запроса и решения об одобрении связей, — это вопросы HITL, а не правила, применяемые компилятором.

Нейтральность домена-источника: Куратор домена-источника одобряет связь один раз и грант на поля один раз. После этого нижестоящие домены работают в рамках этих предоставленных границ:

  • Высокая тщательность при решении о пересечении границы
  • Лёгкая осведомлённость впоследствии через уведомления и историю запросов

2. Обнаруживаемость (Discoverability)

Уровни обнаружения

Обнаружение структурировано по пяти уровням возрастающего governance. Каждый уровень — предпосылка для следующего.

Уровень Описание Состояние governance
1 — Схема зарегистрированного источника Каждая таблица, столбец и тип из зарегистрированного источника. Видимость на уровне администратора. Отсутствует — сырой инвентарь
2 — Незаявленные таблицы Таблицы, интроспектированные из зарегистрированных источников без владельца-домена. Видны кураторам с доступом к источнику. Доступны, но неуправляемы
3 — Ресурсы домена Заявленные таблицы и представления, определённые куратором. Полностью управляемы, принадлежат владельцу, видны в каталоге. Полностью управляемо
4 — Связи Одобренные пути переходов между ресурсами уровня 3. Предпосылка для создания междоменных представлений. Одобрено обоими кураторами
5 — Гранты на поля Разрешения доступа к полям между доменами. Самый специфичный и целенаправленный управляемый доступ. Одобрено куратором источника

Незаявленная таблица — это сигнал пробела: если необходимые данные существуют только на уровне 2, куратор должен заявить её, прежде чем governance сможет продолжиться. Отсутствие любого кандидата на всех уровнях требует эскалации к администратору.

Ограничения FK

Ограничения внешнего ключа (FK) — это конструкция уровня источника — они не могут охватывать несколько источников данных. Пути соединения между источниками полностью выводятся из одобренных связей каталога (уровень 4), которые сильнее, поскольку были проверены обоими кураторами.

В рамках источника:

  • Ограничения FK автоматически раскрываются как кандидаты связей при регистрации источника
  • Они представляют явное намерение моделирования — не принуждаемое в большинстве аналитических SQL-систем, но целенаправленно объявленное
  • Проверка куратора всё равно требуется, прежде чем кандидат станет одобренной связью

Иерархия достоверности связей

Свидетельство Достоверность
Одобренная связь каталога — межисточниковая, проверена обоими кураторами Наивысшая
Ограничение FK внутри источника — явное намерение моделирования, не принуждается, но целенаправленно Высокая
Семантический вывод внутри источника — сходство имён/типов столбцов в рамках согласованной схемы Средняя
Семантический вывод между источниками — соглашения об именовании расходятся между системами; высокий риск ложных срабатываний Низкая

Предложения, подтверждённые несколькими типами свидетельств, накапливают достоверность.

Проверка данных и корреляция

Для семантически выведенных кандидатов проверка данных обеспечивает этап валидации:

  • Перекрытие значений — доля значений столбца-источника, встречающихся в целевом столбце
  • Кардинальность — соответствует ли распределение ожидаемому типу связи
  • Доля null — доля значений столбца-источника, равных null, что указывает на опциональность

Высокая корреляция повышает достоверность; низкая — подавляет или понижает кандидата. Проверка — это подтверждающее свидетельство, а не доказательство: целочисленные диапазоны могут пересекаться случайно, а частичная ссылочная целостность распространена в аналитических системах. Значительный простор для ошибки остаётся. Семантическое суждение куратора — единственная надёжная финальная проверка.

Обнаружение с помощью LLM

LLM работает одновременно на всех пяти уровнях, предлагая связи, кандидатов на заявку и пути перехода, ранжированные по достоверности.

Что раскрывает LLM:

  • Кандидаты связей, ранжированные по достоверности
  • Незаявленные таблицы, которые могут удовлетворить потребность в данных, с предложением инициировать заявку
  • Отсутствие кандидатов — сигнал для эскалации к администратору

Проектирование представления из бизнес-описания:

Аналитик предоставляет описание на естественном языке и опциональные ограничения. LLM производит предлагаемую структуру представления.

Вход:

  • Бизнес-описание: сущности, метрики, связи, намерение
  • Опциональные ограничения: фильтры, временные окна, агрегации, исключённые поля, ограничения чувствительности

Пример:

«Ежедневные объёмы торгов по контрагентам за последние 30 дней, только активные контрагенты, с отображением юридического названия контрагента и кредитного рейтинга. Без PII.»

Процесс LLM:

  1. Разбор — определение сущностей, метрик, измерений, фильтров, исключений
  2. Поиск — все уровни каталога на предмет подходящих ресурсов
  3. Предложение — ресурсы домена, связи, поля, структура агрегации
  4. Оценка — достоверность каждого компонента на основе свидетельств уровня
  5. Предпосылки — упорядоченный список заявок, связей и грантов на поля, необходимых для выполнения
  6. Пробелы — сущности или поля без кандидата на любом уровне, помечаются для эскалации к администратору

Выход:

  • Черновик запроса для проверки и уточнения аналитиком
  • Оценки достоверности по компонентам
  • Упорядоченный список предпосылок
  • Список пробелов

Бизнес-описание становится заявленной бизнес-целью представления, как только представление формально создано.

Обнаружение связей на основе SQL (инструмент Modeling):

Доступен как модальное окно со страницы Relationships. Цель — построить семантическую модель, выявляя структурные пути соединения до их формализации как управляемых связей.

  1. Аналитик пишет свободный SQL над доступными таблицами (RLS и маскирование всё ещё применяются)
  2. AST SQL разбирается — каждое условие JOIN становится кандидатом предложения Relationship
  3. Список кандидатов показывается вместе с кандидатами, предложенными машиной (вывод FK, семантический вывод), для единого обзора
  4. Аналитик повышает выбранных кандидатов до формальных запросов Relationship
  5. Одобренные связи добавляются в каталог и становятся проходимыми в запросах

Инструмент Modeling может показывать все зарегистрированные таблицы для структурного исследования, даже там, где аналитик не может видеть базовые данные — одобрение куратора управляет фактическим доступом к данным, а не видимостью схемы.


3. Использование

Журнал аудита запросов

Каждый запрос, затрагивающий ресурс домена, записывается в журнал только для добавления query_audit_log. Каждая запись фиксирует:

  • tenant_id, user_id, role_id — контекст идентичности
  • Хеш SHA-256 запроса — дословный текст запроса никогда не сохраняется
  • table_ids — ресурсы домена, которые затронул запрос
  • source, status_code, duration_ms
  • logged_at — временная метка

Журнал доступен только для добавления (DELETE и UPDATE заблокированы на уровне базы данных) и индексирован по (tenant_id, logged_at) и (user_id, logged_at).

Отчёт истории запросов куратора — это агрегированное представление над этим журналом, фильтруемое по ресурсу, роли и временному окну. Каталог — это живой инструмент governance — кураторы поддерживают осведомлённость о том, как используются их ресурсы, в режиме реального времени, а не постфактум.

Два механизма видимости:

  • Push — уведомления после использования для структурных актов (новое представление было создано с использованием ваших полей)
  • Pull — история запросов для паттернов использования во время выполнения