Hi everyone,
I completed my Data Vault 2.0 certification about three years ago, and there is one modelling problem that keeps coming back in our implementations. I would be very interested to hear how other experienced Data Vault practitioners handle it, and whether there is a canonical DV 2.0 pattern that I may have overlooked.
A small disclaimer: I used ChatGPT to help me formulate this question as precisely as possible. I am very much a technical / IT person by background, and when trying to explain this kind of modelling problem I tend to disappear into implementation details and lose sight of the actual question. ![]()
( It’s a bit long but it contains everything so… hum… be prepared
)
The problem
We have source systems that provide the complete historical timeline of an assignment, including explicit business validity dates.
For example, consider the assignment of an employee to an organizational unit.
At load time T1, the source provides:
| Employee | Unit | Valid From | Valid To |
|---|---|---|---|
| Mr. X | Finance | 2020-01-01 | 2020-12-31 |
| Mr. X | IT | 2021-01-01 | 2025-12-31 |
| Mr. X | Finance | 2026-01-01 | NULL |
A few days later, at T2, the source provides the complete history again, but the history has been retroactively corrected:
| Employee | Unit | Valid From | Valid To |
|---|---|---|---|
| Mr. X | Finance | 2020-01-01 | 2021-06-30 |
| Mr. X | IT | 2021-07-01 | 2024-12-31 |
| Mr. X | Finance | 2025-01-01 | NULL |
So this is not simply a new assignment becoming effective.
The source has changed its statement about the past.
For example:
- the end of the first Finance assignment moved from
2020-12-31to2021-06-30; - the start and end of the IT assignment both changed;
- the second Finance assignment moved from
2026-01-01to2025-01-01.
Where I struggle with the canonical Data Vault pattern
A natural Raw Vault model would seem to contain:
H_EMPLOYEE
H_ORG_UNIT
L_EMPLOYEE_ORG_UNIT
Employee_HK
OrgUnit_HK
with the source-provided effectivity stored separately.
However, the employee can return to the same organizational unit.
At T1, for example, the same Employee–Unit relationship has two distinct business-valid periods:
Mr. X → Finance
2020-01-01 → 2020-12-31
Mr. X → Finance
2026-01-01 → NULL
Therefore, for the same Link hash key and the same technical load timestamp, we need to represent multiple effectivity intervals.
This starts to look structurally like a Multi-Active Satellite, for example:
Link_HK
Load_DTS
Valid_From
Valid_To
Record_Source
with something such as Valid_From acting as a discriminator within (Link_HK, Load_DTS).
But semantically I am uncomfortable calling this a Multi-Active Satellite.
Mr. X is not multi-active in the business sense. At any given business point in time, he has only one organizational assignment.
What is “multi-active” is really the set of historical intervals reported by the source during one technical observation.
The second dimension: preserving what we knew
Since this is Raw Vault, we also do not want T2 to overwrite what was loaded at T1.
Ideally, we want to retain both:
What did the source tell us at T1?
and:
What does the source currently tell us about that same historical period?
This effectively gives us two timelines:
- technical/system time — when we received a version of the history;
- business/effective time — when the assignment was supposedly valid.
In other words, the problem starts looking distinctly bitemporal.
Possible approaches I see
I can think of several approaches, but none feels completely canonical:
- Treat the source effectivity as descriptive data in a regular Satellite.
This immediately creates the issue of multiple rows for the same Link and Load_DTS when an Employee–Unit relationship occurs several times in the source history. - Use a Multi-Active Satellite (or a MAS-like structure), with
Valid_Fromor another sequence/discriminator identifying each interval.
Technically this works, and it is a solution we already use, but I am not convinced that this represents the intended semantics of a MAS in DV 2.0. - Include the start date in the grain/identity of the assignment.
This is problematic because the source can retroactively change the start date itself. A correction from2021-01-01to2021-07-01would then appear to create a different business object rather than correcting the same assignment. - Introduce an Assignment Hub / Link based on a source-provided Assignment ID.
This would probably solve the identity problem nicely, but many of our source systems simply do not provide such an identifier.
My questions
For those following Data Vault 2.0 modelling practices closely:
What would you consider the canonical Raw Vault pattern for this situation?
More specifically:
- How would you model a source that repeatedly delivers a complete, retroactively mutable business timeline?
- Would you consider a MAS appropriate even though the records are not simultaneously active from a business perspective?
- Should an Effectivity Satellite be used here, or is an Effectivity Satellite intended for a different problem?
- Would you model each reported interval as a separate occurrence, and if so, what would you use as its stable identity when the source provides no interval/assignment identifier?
- How do you preserve both the original history received at T1 and the retroactively corrected history received at T2 without inventing business keys that do not exist in the source?
- Is there an established DV 2.0 pattern for this kind of bitemporal, source-provided effectivity, or is this one of those cases where a pragmatic extension of the standard is expected?
This is a recurring problem in our environment, rather than a theoretical edge case, so I am especially interested in solutions that have been used successfully in production.
I would also be very interested in references to the DV 2.0 literature, training material, or modelling standards that explicitly address this scenario.
Thanks in advance for any insights.