offdataai
Real Estate · data model template

Real Estate EDW data model

Data Vault 2.0 raw vault for real estate: hubs (property/owner/tenant/lease/unit), links (property-owner, property-unit, unit-lease, lease-tenant, rent payments), and satellites (property, owner, tenant, unit details + lease-terms effectivity + rent ledger). Hash keys and load metadata are generated by the DDL layer.

Real estate enterprise data warehouse modeled as a Data Vault 2.0 raw vault: property, owner, tenant, lease, and unit hubs; ownership, unit, and leasing links plus a non-historized rent-payment link; and descriptive, effectivity, and ledger satellites — built for integrating property-management, CRM, and accounting systems with full historization and the tenant/owner-data lineage (GDPR) a property operator must retain across its portfolio. 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.0Real EstateGDPRSOXPII
17
tables
111
columns
16
relationships
12
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 immutable identifiers (property_id, lease_id, unit_id) into hubs lets new accounting and CRM source systems attach without reworking existing structures — the core agility of Data Vault for a growing portfolio acquired piecemeal.

  • Non-historized rent-payment link

    Rent payments are immutable ledger events, so the rent-payment link is insert-only and carries its measures directly — no satellite needed.

  • Effectivity satellite on the lease

    Lease terms and status (active, expired, renewed, terminated) change over time; an effectivity satellite records the valid period of each version for as-of occupancy and revenue reporting.

  • Rent ledger split into its own satellite

    Balances and aging update far more frequently than lease terms; a separate high-rate-of-change satellite keeps history compact and collections reporting efficient.

  • GDPR-driven tenant and owner PII handling

    National-id full-masking, email hashing, and per-attribute classification satisfy GDPR on tenant and owner records, while load_date + record_source give the lineage to honour access requests.

Tables in the Real Estate 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 (5)

hub_property

Grain: one row per unique hub_property business key

ColumnTypeKeys
property_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_owner

Grain: one row per unique hub_owner business key

ColumnTypeKeys
owner_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_tenant

Grain: one row per unique hub_tenant business key

ColumnTypeKeys
tenant_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_lease

Grain: one row per unique hub_lease business key

ColumnTypeKeys
lease_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_unit

Grain: one row per unique hub_unit business key

ColumnTypeKeys
unit_idvarcharBK
load_datetimestamp
record_sourcevarchar

Links (5)

lnk_property_owner

Grain: one row per lnk_property_owner relationship

Which owner holds title to which property.

ColumnTypeKeys
property_hkbinary
owner_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_property_unit

Grain: one row per lnk_property_unit relationship

Which units belong to which property.

ColumnTypeKeys
property_hkbinary
unit_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_unit_lease

Grain: one row per lnk_unit_lease relationship

Which lease covers which unit.

ColumnTypeKeys
unit_hkbinary
lease_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_lease_tenant

Grain: one row per lnk_lease_tenant relationship

Which tenants are party to which lease.

ColumnTypeKeys
lease_hkbinary
tenant_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_rent_payment

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

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

ColumnTypeKeys
lease_hkbinary
tenant_hkbinary
payment_event_idvarcharBK
payment_tstimestamp
payment_typevarchar
payment_methodvarchar
amountdecimal
currencyvarchar
load_datetimestamp
record_sourcevarchar

Satellites (6)

sat_property_details

Grain: one row per property_hk per change

Property descriptive history.

ColumnTypeKeys
property_hkbinaryPK
load_datetimestampPK
property_namevarchar
property_typevarchar
addressvarchar
cityvarchar
postal_codevarchar
year_builtsmallint
total_unitsinteger
assessed_valuedecimal
load_end_datetimestamp
record_sourcevarchar

sat_owner_details

Grain: one row per owner_hk per change

Owner descriptive history (PII).

ColumnTypeKeys
owner_hkbinaryPK
load_datetimestampPK
first_namevarcharPII
last_namevarcharPII
national_idvarcharPII
emailvarcharPII
phonevarcharPII
owner_typevarchar
mailing_addressvarcharPII
load_end_datetimestamp
record_sourcevarchar

sat_tenant_details

Grain: one row per tenant_hk per change

Tenant descriptive history (PII).

ColumnTypeKeys
tenant_hkbinaryPK
load_datetimestampPK
first_namevarcharPII
last_namevarcharPII
date_of_birthdatePII
national_idvarcharPII
emailvarcharPII
phonevarcharPII
credit_score_bandvarchar
employment_statusvarchar
load_end_datetimestamp
record_sourcevarchar

sat_lease_terms

Grain: one row per lease term per effectivity change

Effectivity satellite tracking lease terms and lifecycle over time.

ColumnTypeKeys
lease_hkbinaryPK
load_datetimestampPK
lease_statusvarchar
effective_fromdate
effective_todate
is_activeboolean
monthly_rentdecimal
security_depositdecimal
term_monthssmallint
load_end_datetimestamp
record_sourcevarchar

sat_unit_details

Grain: one row per unit_hk per change

Unit descriptive history.

ColumnTypeKeys
unit_hkbinaryPK
load_datetimestampPK
unit_numbervarchar
floorsmallint
bedroomssmallint
bathroomsdecimal
square_feetinteger
occupancy_statusvarchar
market_rentdecimal
load_end_datetimestamp
record_sourcevarchar

sat_rent_ledger

Grain: one row per lease per ledger update (high-rate-of-change satellite)

Rent-ledger satellite split out for its high rate of change.

ColumnTypeKeys
lease_hkbinaryPK
load_datetimestampPK
balance_duedecimal
amount_paiddecimal
late_fees_accrueddecimal
days_past_dueinteger
ledger_statusvarchar
statement_datedate
load_end_datetimestamp
record_sourcevarchar

Lookup tables (1)

ref_property_type

Grain: one row per property type

ColumnTypeKeys
property_type_codevarcharBK
property_type_namevarchar
asset_classvarchar

Relationships

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

  • lnk_property_owner.property_hk → hub_property (many-to-one)
  • lnk_property_owner.owner_hk → hub_owner (many-to-one)
  • lnk_property_unit.property_hk → hub_property (many-to-one)
  • lnk_property_unit.unit_hk → hub_unit (many-to-one)
  • lnk_unit_lease.unit_hk → hub_unit (many-to-one)
  • lnk_unit_lease.lease_hk → hub_lease (many-to-one)
  • lnk_lease_tenant.lease_hk → hub_lease (many-to-one)
  • lnk_lease_tenant.tenant_hk → hub_tenant (many-to-one)
  • lnk_rent_payment.lease_hk → hub_lease (many-to-one)
  • lnk_rent_payment.tenant_hk → hub_tenant (many-to-one)
  • sat_property_details.property_hk → hub_property (many-to-one)
  • sat_owner_details.owner_hk → hub_owner (many-to-one)
  • sat_tenant_details.tenant_hk → hub_tenant (many-to-one)
  • sat_lease_terms.lease_hk → hub_lease (many-to-one)
  • sat_unit_details.unit_hk → hub_unit (many-to-one)
  • sat_rent_ledger.lease_hk → hub_lease (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