"Three contracts, three homes, wired only by name." Zero regression; decoupled grains, time windows, and attribute ranks.
Clusters raw hub hashes (hk_raw) into a single durable surrogate key (hk_durable).
identityMapName
Declares temporal eligibility windows for source systems. Compiled directly into SQL WHERE bounds.
sourceCalendarName
Field-level rank arbitration (Rank 1 > Rank 2) across multi-satellite timeline histories.
field_mapping.rankHow raw Data Vault assets pass through the three stages to materialize a consolidated BV SCD2 table
WHERE ts >= from AND ts < to
hk_raw ➔ hk_durable
Rank 1 > Rank 2
An identity map resolves duplicate raw keys (hk_raw) across disparate source systems into a unified durable surrogate key (hk_durable).
BvIdentityMapIdentityLookup
When a cluster forms, hk_durable is created from MDM ID or the initial master raw hash. Once created, it is frozen forever.
If CRM flips the preferred master from O100 to K100, hk_master and rule_version update, but hk_durable never changes. Downstream marts never break!
The human-readable preferred_bk is carried as payload. It can be corrected in place without driving a spurious new SCD2 version row.
Durable key is minted and snapshotted into map_person table.
Master pointer updates to K100, but the durable key remains immutable!
unmappedPolicy)| Policy | Action When No Map Interval Found | Timeline Impact |
|---|---|---|
| self (default) | Substitutes hk_durable = hk_raw. |
Entity passes through with its own raw identity until mapped. |
| quarantine | Suppresses the row from main SCD2 stream and routes to quarantine. | Only explicitly resolved business keys enter the Business Vault. |
| drop | Silently discards the unmapped raw satellite row. | Strict whitelist: unmapped history is ignored. |
Controls when legacy and modern source systems are authorized to feed Business Vault timelines. It is pure shared metadata—not a warehouse table!
BvSourceCalendarTableInput SQL pushdown// Generated TableInput SQL for sat_person_oracle leg
SELECT person_hk, x_load_ts, email, city
FROM sat_person_oracle
WHERE x_load_ts >= '1900-01-01 00:00:00' AND x_load_ts < '2024-03-01 00:00:00'
ORDER BY person_hk COLLATE "C", x_load_ts;
When multiple satellite streams disagree on a column value, SurvivorshipMerge deterministically resolves the winning value based on explicit column ranks, null policies, and delta operations.
rank on SCD2 field mappingSortedSchemaMerge
Rank 1 beats Rank 2. Ranks can disagree across fields! Kafka can win email while Oracle wins city.
inherit: null skips rank & keeps existing value (delta/event stream).
apply: null explicitly clears the field (full snapshot/CRUD).
Present Flag tells "omitted from JSON" from "explicit null". seed fills initial gaps without overwriting existing upsert values.
'oracle@example.com'
Because Kafka is inherit, null is treated as sparse omission. It falls back to Rank 2!
NULL
Present flag explicitly confirms the field was cleared, overriding inherit!
Step through the exact scenario tested by update-bv-resolution.hwf. Straddles calendar cutovers, same-as link master flipping, and survivorship resolution.
O100 (Oracle): KEPT (in window)K100 (Kafka, Liege): EXCLUDED (Kafka starts 03-01)O100 ➔ Dup: K100hk_durable = MD5('O100')rule_version = 1| Cluster Keys | City | Active Source | |
|---|---|---|---|
| K100 | O100 | oracle@old.example | Brussels | ORACLE |
| O200 | only-oracle@example | Ghent | ORACLE |