Data Products¶
A data product is a named, owned bundle of tables published together for consumption. It is the unit the catalog exposes to consumers, a curated set of tables that a domain has declared ready. Fields follow the ODPS (Open Data Product Standard) vocabulary where Provisa already has the source of truth.
Domain ownership rule¶
Every data product is owned by exactly one domain (domain_id is a required field). A table may join a data product only when both share the same domain_id. The UI scopes the table picker to the product's domain; the backend rejects a product_id assignment whose domain does not match the product's at save time.
A product that needs data from another domain must bring that data in as a domain view first, then include the view as a member.
Output ports¶
The tables and commands assigned to a data product are its output ports, the queryable surface consumers see. Assigning a table sets Table.product_id; clearing it removes the membership. A table belongs to at most one product. Commands in the same domain may also be assigned as members.
Contracts¶
Each member table is an output port with its own data contract, in the ODCS format. A table gets a draft contract at version 0.1.0 when it joins a product, declaring every column it has. The contract has its own version, separate from the product's. A checker table that a product owns is not an output port and has no contract.
A contract holds:
| Field | Notes |
|---|---|
version |
Required. Changed when the contract removes a column or declares it as another type |
status |
proposed, draft, active, deprecated or retired |
description |
What the port is for |
terms |
usage, limitations and notice_period (for example P3M) |
sla |
Service levels such as availability or retention. Freshness is not declared here; it comes from the table's cache TTL |
columns |
The columns the port declares: name, type, description and whether the column is never null |
Two rules keep a contract and its table in step:
- A contract saved at the same version may not drop a declared column or change its type. Save it at a new version.
- A table save may not drop or retype a column its contract declares. Release a new contract version without the column first. In a configuration file, the table and its new contract can change in the same save.
Edit contracts on the product's form, in its Contracts panel, or declare them in configuration on the table:
tables:
- source_id: warehouse
schema_name: public
table_name: daily_revenue
product_id: revenue
contract:
version: 1.0.0
status: active
terms: {usage: Join on day}
sla:
- {property: availability, value: 99.9, unit: "%"}
columns:
- {name: day, type: date, required: true}
- {name: amount, type: "numeric(12, 2)"}
The ODPS export writes each output port with its contract's version and the contract itself, at /data-products/{id}/contracts/{source.schema.table}.yaml.
Detail panel sections¶
Opening a data product in the admin UI shows these panels:
| Panel | What it shows |
|---|---|
| Output Ports | Member tables and their columns; member commands; sample queries (GraphQL, SQL, Cypher, gRPC, JSON:API, REST) |
| Contracts | Each output port's contract: its version and status, terms, service levels and columns |
| Related Terms | Glossary terms linked to the product's member tables |
| Related Tables | Tables reachable from member tables through approved relationships but not yet part of the product |
| Relationships | Approved relationships between this product's member tables |
| Lineage | Column lineage graph showing member tables as the published endpoint plus every upstream table. Requires the view_governance capability |
| Input Ports | One-hop inputs → transform → outputs derived from lineage. Requires view_governance |
| Data Quality | Checker tables whose contracts scan this product's output ports; one row per check per run. Includes a rules modal and PII tag display |
Metadata export¶
Only tables assigned to a product publish to external catalogs by default. build_snapshot applies a data_products_only filter, which withholds unassigned tables along with their relationship edges, lineage edges and governance tags. Sources and domains always publish regardless.
A product with no exported members does not publish. An empty listing would claim a product exists with nothing behind it.
Only catalogs with a native data-product concept publish it as an entity of its own; the rest publish the (already-filtered) member tables without a product grouping:
| Catalog | Published as |
|---|---|
| Snowflake Horizon | SHARE + organization listing (native Data Product); publish=false keeps it DRAFT, publish=true takes it live. The listing's data dictionary covers every member and column; the first five members are featured and masked columns are hidden in the preview |
| BigQuery Analytics Hub | Analytics Hub listing (native) |
| OpenMetadata | DataProduct entity (native) |
| DataHub | Native dataProduct URN entity with its own properties/ownership aspects |
| Collibra | Asset of a Data Product community type, related to member tables |
| Apache Atlas | Best-effort custom provisa_data_product typedef, because Atlas has no native data-product type |
| Atlan | Best-effort custom DataProduct typedef guess, because Atlan has no documented stable type for this |
| OpenLineage | Not a listing. Member tables carry a provisa_data_product custom facet naming the product |
Fields¶
| Field | Required | Notes |
|---|---|---|
id |
Yes | Machine-readable stable identifier, e.g. customer_360 |
domain_id |
Yes | Owning domain; membership rule enforced against this |
name |
Yes | Display name |
owner_role |
No | Role accountable for this product; distinct from the domain steward. Naming a role here lets it edit the products that name it (see row rules) |
team_role |
No | Role whose holders form the day-to-day working team; resolves to individuals |
purpose |
No | What this product publishes and why |
limitations |
No | Known constraints, caveats, or exclusions |
usage |
No | How to consume this product |
version |
No | e.g. 1.2.0 |
status |
No | e.g. proposed, active, deprecated, retired |
support |
No | Free-text support guidance |
support_contact |
No | Email or URL; required by Snowflake Horizon Catalog organization listing manifests |
publish |
No | true to publish Horizon Catalog listings immediately; new listings default to DRAFT |
custom_properties |
No | Arbitrary key-value metadata not covered by the standard fields |