offdataai
Banking & Financial Services · data model template

Banking EDW data model

Data Vault 2.0 raw vault for core banking: hubs (customer/account/product/branch), links (customer-account, account-branch, account-product, transactions), and satellites (customer, account, balance, branch, product details + a customer-account effectivity satellite). Hash keys and load metadata are generated by the DDL layer.

Banking enterprise data warehouse modeled as a Data Vault 2.0 raw vault: customer, account, product, and branch hubs; ownership, management, and product links; a non-historized transaction link; and descriptive plus effectivity satellites — built for integrating many source systems with full historization and the audit lineage (BCBS-239, Basel, GLBA) that makes Data Vault the standard for regulated banking EDWs. It is a Data Vault 2.0 raw vault: hubs for business keys, links for relationships and satellites for descriptive history, with hash keys and hash diffs generated in the DDL.

Data Vault 2.0Banking & Financial ServicesBCBS-239Basel-IIIGLBASOXGDPR
15
tables
92
columns
14
relationships
7
PII columns

Opening the template creates a project with the ERD, platform-native DDL, a dbt project and documentation already generated (recommended platform: Snowflake). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

hubslinkssatellitesreference

Design decisions

  • Hubs hold only business keys

    Separating the immutable business keys (customer_id, account_number) into hubs lets new source systems and relationships attach without reworking existing structures — the core agility of Data Vault.

  • Non-historized transaction link

    Transactions are immutable events, so the transaction link is insert-only and carries its measures directly — no satellite needed.

  • Balance split into its own satellite

    Account balances change far more frequently than account attributes; a separate high-rate-of-change satellite keeps history compact and loads efficient (satellite-per-rate-of-change).

  • Effectivity satellite on the customer-account link

    Joint/primary ownership changes over time; an effectivity satellite records the valid period of each relationship for as-of reporting.

  • Auditability drives Data Vault in banking

    Load_date + record_source on every row provide a queryable audit trail for BCBS-239 lineage and Basel/GLBA reporting without scraping logs.

Tables in the Banking EDW model

Every table with its grain, columns, types and keys. PK marks a primary key, BK a business key and PII a column classified as personal data, which gets a masking strategy by default.

Hubs (4)

hub_customer

Grain: one row per unique hub_customer business key

ColumnTypeKeys
customer_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_account

Grain: one row per unique hub_account business key

ColumnTypeKeys
account_numbervarcharBK
load_datetimestamp
record_sourcevarchar

hub_product

Grain: one row per unique hub_product business key

ColumnTypeKeys
product_codevarcharBK
load_datetimestamp
record_sourcevarchar

hub_branch

Grain: one row per unique hub_branch business key

ColumnTypeKeys
branch_codevarcharBK
load_datetimestamp
record_sourcevarchar

Links (4)

lnk_customer_account

Grain: one row per lnk_customer_account relationship

Which customer owns which account.

ColumnTypeKeys
customer_hkbinary
account_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_account_branch

Grain: one row per lnk_account_branch relationship

Which branch manages which account.

ColumnTypeKeys
account_hkbinary
branch_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_account_product

Grain: one row per lnk_account_product relationship

Which product an account is an instance of.

ColumnTypeKeys
account_hkbinary
product_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_transaction

Grain: one row per posted transaction (non-historized link)

Transactional (non-historized) link — insert-only ledger events.

ColumnTypeKeys
account_hkbinary
customer_hkbinary
transaction_idvarcharBK
transaction_tstimestamp
transaction_typevarchar
directionvarchar
amountdecimal
currencyvarchar
load_datetimestamp
record_sourcevarchar

Satellites (6)

sat_customer_details

Grain: one row per customer_hk per change

Customer descriptive history.

ColumnTypeKeys
customer_hkbinaryPK
load_datetimestampPK
first_namevarcharPII
last_namevarcharPII
date_of_birthdatePII
tax_idvarcharPII
emailvarcharPII
phonevarcharPII
customer_segmentvarchar
kyc_statusvarchar
risk_ratingvarchar
load_end_datetimestamp
record_sourcevarchar

sat_account_details

Grain: one row per account_hk per change

Account descriptive history.

ColumnTypeKeys
account_hkbinaryPK
load_datetimestampPK
account_typevarchar
currencyvarchar
open_datedate
account_statusvarchar
interest_ratedecimal
load_end_datetimestamp
record_sourcevarchar

sat_account_balance

Grain: one row per account per balance change (high-rate-of-change satellite)

Balance satellite split out for its high rate of change.

ColumnTypeKeys
account_hkbinaryPK
load_datetimestampPK
closing_balancedecimal
available_balancedecimal
interest_accrueddecimal
is_overdrawnboolean
load_end_datetimestamp
record_sourcevarchar

sat_branch_details

Grain: one row per branch_hk per change

Branch descriptive history.

ColumnTypeKeys
branch_hkbinaryPK
load_datetimestampPK
branch_namevarchar
cityvarchar
statevarchar
regionvarchar
manager_namevarcharPII
load_end_datetimestamp
record_sourcevarchar

sat_product_details

Grain: one row per product_hk per change

Product descriptive history.

ColumnTypeKeys
product_hkbinaryPK
load_datetimestampPK
product_namevarchar
product_categoryvarchar
base_interest_ratedecimal
monthly_feedecimal
load_end_datetimestamp
record_sourcevarchar

sat_customer_account_role

Grain: one row per ownership relationship per effectivity change

Effectivity satellite on the customer-account link.

ColumnTypeKeys
customer_account_hkbinaryPK
load_datetimestampPK
relationship_typevarchar
effective_fromdate
effective_todate
is_activeboolean
load_end_datetimestamp
record_sourcevarchar

Lookup tables (1)

ref_currency

Grain: one row per ISO currency

ColumnTypeKeys
currency_codevarcharBK
currency_namevarchar
minor_unitssmallint

Relationships

Each relationship is a foreign key on the first table referencing the second.

  • lnk_customer_account.customer_hk → hub_customer (many-to-one)
  • lnk_customer_account.account_hk → hub_account (many-to-one)
  • lnk_account_branch.account_hk → hub_account (many-to-one)
  • lnk_account_branch.branch_hk → hub_branch (many-to-one)
  • lnk_account_product.account_hk → hub_account (many-to-one)
  • lnk_account_product.product_hk → hub_product (many-to-one)
  • lnk_transaction.account_hk → hub_account (many-to-one)
  • lnk_transaction.customer_hk → hub_customer (many-to-one)
  • sat_customer_details.customer_hk → hub_customer (many-to-one)
  • sat_account_details.account_hk → hub_account (many-to-one)
  • sat_account_balance.account_hk → hub_account (many-to-one)
  • sat_branch_details.branch_hk → hub_branch (many-to-one)
  • sat_product_details.product_hk → hub_product (many-to-one)
  • sat_customer_account_role.customer_account_hk → lnk_customer_account (many-to-one)

Related templates

All templates →
Start for $1

From requirements to AI-ready context, in one platform.

Describe your business in a conversation, start from a template or connect your own database. Your first model is ready in minutes.

Get startedBook a demo

Plans from $1/month · cancel any time