Concept 01
Satellite Anatomy & Structure
🧠 ELI5 — Explain Like I’m Five
A Satellite is attached to either a Hub or a Link. It stores all the descriptive attributes — names, addresses, amounts, statuses — that describe that entity or relationship. Because it’s insert-only and every row has a timestamp, you automatically get complete historical tracking of every attribute change — for free. If a customer changes their email address on March 5th, a new satellite row is inserted with the new email. The old row stays forever. No data is ever lost.
📚 Analogy
Think of a satellite as a versioned snapshot log. Every time something about an entity changes, the satellite appends a new entry stamped with the exact moment that version was recorded. It’s like Git commits for your business data — every state of every attribute is preserved, and you can always “checkout” any point in time by filtering on LOAD_DATE.
Required Columns
Every satellite — regardless of how many payload columns it has — must include these mandatory metadata columns. They are the backbone of DV2’s auditability and change-detection patterns.
| Column | Type | Rule |
|---|---|---|
HUB_{ENTITY}_HK or LINK_{NAME}_HK |
CHAR(32) |
Foreign key to the parent Hub or Link. Part of the composite primary key. |
LOAD_DATE |
TIMESTAMP |
When this version was loaded into the vault. Part of the composite PK. Never the business event date — always the technical load timestamp. |
LOAD_END_DATE |
TIMESTAMP NULL |
When the next version arrived, closing this one. NULL = still the current active record. Optional — can be derived dynamically via PIT tables instead. |
HASH_DIFF |
CHAR(32) |
MD5 or SHA-256 hash of all payload columns concatenated. Used for efficient change detection: matching HashDiff means no insert needed. |
RECORD_SOURCE |
VARCHAR(100) |
The source system that provided this row (e.g., CRM_SALESFORCE, ERP_SAP). Enables lineage and conflict resolution between sources. |
[payload columns] |
Various | The actual descriptive data. All payload columns are concatenated and hashed to produce HASH_DIFF. |
Naming Conventions
- Hub satellite:
SAT_{ENTITY}_{CONTEXT}— e.g.,SAT_CUSTOMER_DEMOGRAPHICS,SAT_CUSTOMER_CONTACT_INFO - Link satellite:
SAT_L_{LINK_NAME}_{CONTEXT}— e.g.,SAT_L_CUSTOMER_ORDER_DETAILS - Effectivity satellite:
SAT_EFF_{LINK_NAME}— e.g.,SAT_EFF_EMPLOYEE_DEPARTMENT
The {CONTEXT} suffix differentiates satellites by source system, rate of change, or business domain. Without it, you end up with a single monolithic satellite per entity — the most common DV anti-pattern.
-- SAT_CUSTOMER_DEMOGRAPHICS: demographic attributes only -- Split from SAT_CUSTOMER_CONTACT and SAT_CUSTOMER_FINANCIALS by classification CREATE TABLE SAT_CUSTOMER_DEMOGRAPHICS ( HUB_CUSTOMER_HK CHAR(32) NOT NULL, -- FK to HUB_CUSTOMER; part of PK LOAD_DATE TIMESTAMP NOT NULL, -- when this version was loaded LOAD_END_DATE TIMESTAMP NULL, -- NULL = current active record HASH_DIFF CHAR(32) NOT NULL, -- hash of all payload columns RECORD_SOURCE VARCHAR(100) NOT NULL, -- e.g. 'CRM_SALESFORCE' -- Payload: demographic attributes only FIRST_NAME VARCHAR(100), LAST_NAME VARCHAR(100), DATE_OF_BIRTH DATE, GENDER_CODE CHAR(1), NATIONALITY CHAR(3), COUNTRY_CODE CHAR(3), LANGUAGE_PREF VARCHAR(10), CONSTRAINT pk_sat_cust_demo PRIMARY KEY (HUB_CUSTOMER_HK, LOAD_DATE), CONSTRAINT fk_sat_cust_demo FOREIGN KEY (HUB_CUSTOMER_HK) REFERENCES HUB_CUSTOMER(HUB_CUSTOMER_HK) );
-- SAT_PRODUCT_PRICING: fast-changing pricing data only -- Split from SAT_PRODUCT_DESCRIPTION (rare change) by rate of change CREATE TABLE SAT_PRODUCT_PRICING ( HUB_PRODUCT_HK CHAR(32) NOT NULL, LOAD_DATE TIMESTAMP NOT NULL, LOAD_END_DATE TIMESTAMP NULL, HASH_DIFF CHAR(32) NOT NULL, RECORD_SOURCE VARCHAR(100) NOT NULL, -- Payload: pricing attributes only LIST_PRICE DECIMAL(18,4), SALE_PRICE DECIMAL(18,4), COST_PRICE DECIMAL(18,4), CURRENCY_CODE CHAR(3), PRICE_TIER VARCHAR(20), -- STANDARD, PREMIUM, BULK EFFECTIVE_DATE DATE, -- business date price became active CONSTRAINT pk_sat_prod_price PRIMARY KEY (HUB_PRODUCT_HK, LOAD_DATE), CONSTRAINT fk_sat_prod_price FOREIGN KEY (HUB_PRODUCT_HK) REFERENCES HUB_PRODUCT(HUB_PRODUCT_HK) );