Data Products (REQ-1634)¶
Продукт данных — это именованный, принадлежащий домену пакет таблиц, публикуемых вместе для потребления. Это единица, которую каталог раскрывает потребителям, — не отдельные таблицы, а курируемая поверхность, которую домен явно объявляет готовой. Поля следуют словарю ODPS (Open Data Product Standard) там, где Provisa уже является источником истины. [tool-verified: provisa/core/models.py:318-342, provisa-ui/src/i18n/locales/en/dataProductsTab.json]
Правило владения доменом¶
Каждый продукт данных принадлежит ровно одному домену (domain_id — обязательное поле). Таблица может войти в продукт данных только в том случае, если оба разделяют один и тот же domain_id. UI ограничивает выбор таблиц доменом продукта; backend отклоняет назначение product_id, чей домен не совпадает с доменом продукта, во время сохранения. [tool-verified: provisa/core/models.py:320, docs/arch/requirements.yaml:54573-54574]
Продукт, которому нужны данные из другого домена, должен сначала внести эти данные как представление домена, а затем включить это представление как участника.
Выходные порты¶
Таблицы и команды, назначенные продукту данных, являются его выходными портами — запрашиваемой поверхностью, которую видят потребители. Назначение таблицы устанавливает Table.product_id; снятие назначения удаляет членство. Таблица принадлежит не более чем одному продукту. Команды в том же домене также могут быть назначены участниками. [tool-verified: provisa/core/models.py:941, provisa-ui/src/i18n/locales/en/dataProductsTab.json:tablesLabel,commandsLabel]
Разделы панели детализации¶
При открытии продукта данных в административном UI показываются следующие панели:
| Панель | Что показывает |
|---|---|
| Output Ports | Таблицы-участники и их колонки; команды-участники; примеры запросов (GraphQL, SQL, Cypher, gRPC, JSON:API, REST) |
| Related Terms | Термины глоссария, связанные с таблицами-участниками продукта |
| Related Tables | Таблицы, достижимые из таблиц-участников через одобренные связи, но ещё не входящие в продукт |
| Relationships | Одобренные связи между таблицами-участниками этого продукта |
| Lineage | Граф происхождения колонок, показывающий таблицы-участники как опубликованную конечную точку плюс каждую вышестоящую таблицу. Требует возможность view_governance |
| Input Ports | Однохоповые входы → преобразование → выходы, выведенные из lineage. Требует view_governance |
| Data Quality | Таблицы-чекеры, чьи контракты сканируют выходные порты этого продукта; одна строка на проверку на прогон. Включает модальное окно с правилами и отображение тегов ПДн |
[tool-verified: provisa-ui/src/i18n/locales/en/dataProductsTab.json:detail]
Экспорт метаданных¶
По умолчанию во внешние каталоги публикуются только таблицы, назначенные продукту. build_snapshot применяет фильтр data_products_only: неназначенные таблицы отсекаются, вместе с их рёбрами связей, рёбрами lineage и тегами governance. Источники и домены публикуются всегда, независимо от этого. [tool-verified: provisa/api/metadata_export/builder.py:594,609,641]
Продукт без экспортированных участников не публикуется — пустой листинг заявлял бы о существовании продукта, за которым ничего не стоит. [tool-verified: provisa/api/metadata_export/model.py:106-113]
Только каталоги с нативным понятием продукта данных публикуют его как самостоятельную сущность; остальные публикуют (уже отфильтрованные) таблицы-участники без группировки в продукт:
| Каталог | Публикуется как |
|---|---|
| Snowflake Horizon | SHARE + организационный листинг (нативный Data Product); publish=false оставляет его в состоянии DRAFT, publish=true публикует его вживую |
| BigQuery Analytics Hub | Листинг Analytics Hub (нативный) |
| OpenMetadata | Сущность DataProduct (нативная) |
| DataHub | Нативная URN-сущность dataProduct с собственными аспектами properties/ownership |
| Collibra | Актив типа сообщества Data Product, связанный с таблицами-участниками |
| Apache Atlas | Пользовательский typedef provisa_data_product по принципу «лучшее из возможного» — у Atlas нет нативного типа продукта данных |
| Atlan | Пользовательский typedef-догадка DataProduct по принципу «лучшее из возможного» — у Atlan нет документированного стабильного типа для этого |
| OpenLineage | Не листинг — таблицы-участники несут пользовательский фасет provisa_data_product, называющий продукт |
[tool-verified: provisa/api/metadata_export/snowflake_horizon.py:389-418, provisa/api/metadata_export/bigquery_dataplex.py:112-136, provisa/api/metadata_export/openmetadata.py:326-344, provisa/api/metadata_export/datahub.py:133-136,443-483, provisa/api/metadata_export/collibra.py:129-133,371-388, provisa/api/metadata_export/atlas.py:134-147, provisa/api/metadata_export/atlan.py:60, provisa/api/metadata_export/openlineage.py:243,348]
Поля¶
| Поле | Обязательно | Примечания |
|---|---|---|
id |
Да | Машиночитаемый стабильный идентификатор, например customer_360 |
domain_id |
Да | Владеющий домен; правило членства применяется относительно него |
name |
Да | Отображаемое имя |
owner_role |
Нет | Роль, ответственная за этот продукт; отлична от стюарда домена |
team_role |
Нет | Роль, чьи держатели формируют повседневную рабочую команду; разрешается до отдельных лиц |
purpose |
Нет | Что публикует этот продукт и зачем |
limitations |
Нет | Известные ограничения, оговорки или исключения |
usage |
Нет | Как потреблять этот продукт |
version |
Нет | например, 1.2.0 |
status |
Нет | например, proposed, active, deprecated, retired |
sla |
Нет | Обязательства по уровню обслуживания; только текст — продукт охватывает несколько таблиц-участников, и структурированный SLA не может однозначно указать, какого участника он описывает |
support |
Нет | Произвольный текст с рекомендациями по поддержке |
support_contact |
Нет | Email или URL; требуется манифестами организационного листинга Snowflake Horizon Catalog (REQ-1635) |
publish |
Нет | true для немедленной публикации листингов Horizon Catalog; новые листинги по умолчанию находятся в DRAFT (REQ-1635) |
custom_properties |
Нет | Произвольные метаданные ключ-значение, не покрытые стандартными полями |
[tool-verified: provisa/core/models.py:318-342, provisa/api/admin/types.py:104-118,538-551]