Skip to content

Data Vault families

Twelve families write the vault layer. This page documents seven of them: vault-entity, vault-control, and the five load families.

The other five render the combined load, which emits one artifact per source rather than one per vault object: vault-combined-load (databricks/data_vault/sql/combined_load.jinja, roots source, tiers, load and behavior) and the four include-only pieces it composes, vault-piece-hub, vault-piece-link, vault-piece-satellite and vault-piece-link-satellite, each taking a single object root. They are indexed on the overview page and their field-by-field sections are still to be written. The combined load is generated but not yet routed into a build, so a change you make in those five does not reach a deployed pipeline until that wiring ships.

Vault templates split by how the object loads, not by what it is called: hubs and links share the keyed insert, all three satellite kinds share the versioned insert, and reference, bridge, and point-in-time each have their own. Two conventions hold across all five load families: this is the vault object being written (the catalog row passed through whole, with the fully qualified name dialect-cased and a snake-cased name added), and bridge and point-in-time carry no source roots at all. That last one is deliberate: they rebuild from the whole raw vault, and their own bridge.steps[] and pit.satellites[] already name every table they read.

Shared ghost-record block (ghost), where a family carries it:

FieldTypeMeaning
ghost.enabledbooleanWhether the ghost-row flow renders; defaults to true when ghost handling is unset.
ghost.zeroKeySqlstringThe all-zeros hash-key literal, UNHEX(REPEAT('0', ...)) at the hash algorithm’s width.
ghost.loadDateSqlstringThe epoch load date stamped on ghost rows: TIMESTAMP '1970-01-01 00:00:00'.
ghost.recordSourcestringThe SYSTEM record-source constant stamped on ghost rows.

Templates: databricks/data_vault/link.jinja

Roots: this, cdc, source, sources, hubHashKeys, dependentChildColumns (conditional), ghost

The streaming link entity definition. The link’s own columns are derived from the keys and hash-key roots rather than enumerated, so this.columns is empty and honest.

FieldTypeMeaning
this.namestringThe link’s logical name.
this.fqnstringThe link’s fully qualified name.
this.physicalNamestringThe finished physical table name (the link prefix applied to the snake-cased name).
this.descriptionstringThe link’s documentation text.
this.columnsarrayEmpty and honest: the link’s columns come from the key roots.
this.linkConfig.hashKeyColumnstringThe link’s own hash-key column.
this.linkConfig.loadDateColumnstringThe link’s load-date audit column.
this.linkConfig.recordSourceColumnstringThe link’s record-source column.
this.linkConfig.hubFqnsstring[]Fully qualified names of the participating hubs, in declared order.
this.linkConfig.hubHashKeyColumnsstring[]?Per-hub hash-key names stamped at decompose time; wins over pattern derivation when it length-matches hubFqns.
this.linkConfig.dependentChildColumnsstring[]?Dependent-child column source names designated on the link itself.
cdc.keysstring[]The change-feed KEYS clause: the link’s hash key.
cdc.sequenceBystringThe change-feed SEQUENCE BY column.
source / sourcestable ref + nameSnakeCaseThe streaming source, named rather than enumerated (columns empty); source.nameSnakeCase precomputed. sources holds the identical object.
hubHashKeysstring[]Participating hub hash-key column names, in hubFqns order (the stored stamp, or pattern-derived for legacy rows).
dependentChildColumnsstring[]Conditional: dependent-child columns resolved to their persisted physical names; absent entirely when none are designated.
ghostobjectThe shared ghost-record block above.

Templates: databricks/data_vault/control.jinja

Roots: source, tiers, threadCount

The per-source control notebook that runs a source’s vault loads in tiers. References, business vault, point-in-time, and bridge are deliberately absent: they run in the vault workflow’s pre-stage and post-stage, not in a source’s control notebook.

FieldTypeMeaning
source.namestringLeaf name of the staging source this control notebook drives.
source.fqnstringDialect-cased fully qualified name of that source.
tiers[]arrayOrdered execution tiers; an empty tier is filtered out before render.
tiers[].labelstringTier heading: hubs and links (tier one), satellites and link satellites (tier two).
tiers[].steps[].namestringThe load’s leaf name, for example hub_customer.
tiers[].steps[].notebookPathstringRelative path to the load notebook, ../loads/<leaf>.
threadCountnumberParallelism for the tier’s thread pool; the Build emits 4.

Templates: databricks/data_vault/loads/keyed_insert_load.jinja

Roots: kindLabel, this, keyColumn, source (conditional), sources, ghost, ghostHashKeyColumns, sequenceColumn, recordSourceColumn

The idempotent insert for the four keyed kinds: hub, link, business hub, business link. The one vault family whose columns carry ghost sentinels.

FieldTypeMeaning
kindLabelstringHuman label for the header comment: Hub, Link, Business hub, or Business link.
thisobjectThe vault object being written: the catalog row spread whole, fqn dialect-cased (replacing the raw one), nameSnakeCase added.
this.columns[].ghostSentinelSqlstringPer-column null-safe sentinel for the ghost row, by data type: 0 numeric, false boolean, DATE '1900-01-01', TIMESTAMP '1900-01-01 00:00:00', X'' binary, '' otherwise.
this.hubConfig / .linkConfig / .bhubConfig / .blinkConfigobject or nullThe kind’s configuration payload; each carries recordSourceColumn.
keyColumnstringThe object’s own hash-key column, which the insert keys on.
sourcetable ref?Conditional: sources[0], identical object; absent when the resolver returned none.
sources[]table ref[]Every upstream staging table feeding this load, in resolver order; columns ordinal-sorted, empty when unresolvable.
ghostobjectThe shared ghost-record block.
ghostHashKeyColumnsstring[]Every hash-key column taking the zero key on the ghost row: the object’s own keys, then the participating hub hash keys (links only, so a link ghost points at hub ghost rows).
sequenceColumnstringThe column the merge sequences on.
recordSourceColumnstringThe record-source column from whichever configuration payload the row carries; empty when none.

Templates: databricks/data_vault/loads/versioned_insert_load.jinja

Roots: kindLabel, this, source (conditional), sources, keyColumns, sequenceColumn

The versioned insert for the three satellite kinds. No ghost roots by design: a versioned load emits no ghost row.

FieldTypeMeaning
kindLabelstringSatellite, Link satellite, or Business satellite.
thisobjectSame shape as the keyed family’s this, except columns are raw (no ghost sentinels).
source / sourcestable refIdentical semantics to the keyed family.
keyColumnsstring[]The parent hub or link hash-key column(s) the versioning partitions by.
sequenceColumnstringThe merge sequence column; when the change-feed default _commit_timestamp resolves for a satellite kind, the vault load-date column substitutes.

Templates: databricks/data_vault/loads/reference_upsert_load.jinja

Roots: this, codeColumn, source (conditional), sources

FieldTypeMeaning
thisobjectThe reference table being written; same shape as the versioned family’s this.
codeColumnstringThe reference table’s code column: the upsert’s match key. Empty when absent.
source / sourcestable refIdentical semantics to the keyed family.

Templates: databricks/data_vault/loads/bridge_rebuild_load.jinja

Roots: this, bridge

The bridge rebuild. No source roots (the ratified exception): the traversal below carries every table the load reads.

FieldTypeMeaning
thisobjectThe bridge table being written.
bridge.anchor.fqnstringThe anchor hub (or business hub) the traversal starts from.
bridge.anchor.hashKeyColumnstringThe anchor’s hash-key column.
bridge.steps[]arrayOrdered traversal steps, each link joined to its far hub.
bridge.steps[].aliasstringSQL alias for the step’s link.
bridge.steps[].linkFqn / .linkHashKeyColumnstringThe step’s link and its hash-key column.
bridge.steps[].hubFqn / .hubHashKeyColumnstringThe far hub this step reaches and its hash-key column.
bridge.steps[].joinFromTableAlias / .joinFromHashKeyColumnstringThe alias this step joins from (the anchor, or an earlier step’s hub) and the hash-key column on it.

Templates: databricks/data_vault/loads/pit_snapshot_load.jinja

Roots: this, pit

The point-in-time snapshot rebuild. No source roots, same exception as bridge.

FieldTypeMeaning
thisobjectThe point-in-time table being written.
pit.anchor.fqnstringThe anchor hub or link supplying the spine’s keys.
pit.anchor.hashKeyColumn / .loadDateColumnstringThe anchor’s hash-key and load-date columns.
pit.satellites[].fqnstringA satellite the snapshot reaches back into.
pit.satellites[].columnPrefixstringOutput column prefix, de-duplicated when the satellite’s name already carries it (never sat_sat_customer_detail).
pit.snapshotDateColumnstringThe snapshot spine’s date column.
pit.cadenceIntervalSqlstringThe spine cadence as an INTERVAL literal: 1 HOUR, 1 DAY, 7 DAY, or 1 MONTH (daily when unset).
pit.satLoadDateColumnstringThe load-date audit column every satellite is scanned at-or-before.