offdataai
HR & People · data model template

HR Workforce EDW data model

Data Vault 2.0 raw vault for HR/HCM: hubs (employee/position/department/location/job), links (employee-position assignment, position-department, employee-location, employee-job), and satellites (employee details with full-masked SSN and hashed email, position, department, location details, an assignment effectivity satellite, and a compensation satellite). Hash keys and load metadata are generated by the DDL layer.

HR / workforce enterprise data warehouse modeled as a Data Vault 2.0 raw vault: employee, position, department, location, and job hubs; assignment, organizational, and location links; and descriptive plus effectivity satellites — built for integrating Workday/ADP/HRIS source systems with full historization and the personal-data lineage (GDPR access and erasure) that makes Data Vault attractive for sensitive workforce data. 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.0HR & PeopleGDPRSOXEEOC
16
tables
101
columns
14
relationships
11
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 workforce business keys

    Isolating employee_id, position_code, and department_code into hubs lets payroll, recruiting, and benefits source systems attach over time without reworking existing structures — the core agility of Data Vault.

  • Assignment modeled as a link with an effectivity satellite

    An employee's position assignment changes over time (promotions, transfers, acting roles); a link plus an effectivity satellite records the valid period of each assignment for as-of org reporting.

  • Compensation split into its own satellite

    Compensation is more sensitive and changes on a different cadence than core employee attributes; a dedicated satellite isolates restricted pay data and keeps history compact (satellite-per-rate-of-change).

  • GDPR-driven masking on the employee satellite

    SSN is full-masked and email is hashed so the governance report flags the most sensitive identifiers; load_date + record_source give the queryable lineage needed for GDPR access and erasure requests.

Tables in the HR Workforce 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_employee

Grain: one row per unique hub_employee business key

ColumnTypeKeys
employee_idvarcharBK
load_datetimestamp
record_sourcevarchar

hub_position

Grain: one row per unique hub_position business key

ColumnTypeKeys
position_codevarcharBK
load_datetimestamp
record_sourcevarchar

hub_department

Grain: one row per unique hub_department business key

ColumnTypeKeys
department_codevarcharBK
load_datetimestamp
record_sourcevarchar

hub_location

Grain: one row per unique hub_location business key

ColumnTypeKeys
location_codevarcharBK
load_datetimestamp
record_sourcevarchar

hub_job

Grain: one row per unique hub_job business key

ColumnTypeKeys
job_codevarcharBK
load_datetimestamp
record_sourcevarchar

Links (4)

lnk_employee_position

Grain: one row per lnk_employee_position relationship

Which position an employee is assigned to (assignment).

ColumnTypeKeys
employee_hkbinary
position_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_position_department

Grain: one row per lnk_position_department relationship

Which department a position belongs to.

ColumnTypeKeys
position_hkbinary
department_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_employee_location

Grain: one row per lnk_employee_location relationship

Which work location an employee reports to.

ColumnTypeKeys
employee_hkbinary
location_hkbinary
load_datetimestamp
record_sourcevarchar

lnk_employee_job

Grain: one row per lnk_employee_job relationship

Which job/role classification an employee holds.

ColumnTypeKeys
employee_hkbinary
job_hkbinary
load_datetimestamp
record_sourcevarchar

Satellites (6)

sat_employee_details

Grain: one row per employee_hk per change

Employee descriptive history (sensitive PII).

ColumnTypeKeys
employee_hkbinaryPK
load_datetimestampPK
first_namevarcharPII
last_namevarcharPII
date_of_birthdatePII
ssnvarcharPII
emailvarcharPII
phonevarcharPII
gendervarcharPII
nationalityvarcharPII
home_addressvarcharPII
employment_statusvarchar
hire_datedate
termination_datedate
load_end_datetimestamp
record_sourcevarchar

sat_position_details

Grain: one row per position_hk per change

Position descriptive history.

ColumnTypeKeys
position_hkbinaryPK
load_datetimestampPK
position_titlevarchar
position_typevarchar
fte_percentagedecimal
is_manager_positionboolean
pay_gradevarchar
headcount_statusvarchar
load_end_datetimestamp
record_sourcevarchar

sat_department_details

Grain: one row per department_hk per change

Department descriptive history.

ColumnTypeKeys
department_hkbinaryPK
load_datetimestampPK
department_namevarchar
cost_centervarchar
divisionvarchar
functionvarchar
budget_ownervarcharPII
load_end_datetimestamp
record_sourcevarchar

sat_location_details

Grain: one row per location_hk per change

Work location descriptive history.

ColumnTypeKeys
location_hkbinaryPK
load_datetimestampPK
location_namevarchar
address_linevarchar
cityvarchar
statevarchar
countryvarchar
postal_codevarchar
timezonevarchar
is_remote_eligibleboolean
load_end_datetimestamp
record_sourcevarchar

sat_assignment_effectivity

Grain: one row per assignment per effectivity change

Effectivity satellite on the employee-position assignment link.

ColumnTypeKeys
employee_position_hkbinaryPK
load_datetimestampPK
assignment_typevarchar
reports_to_employee_idvarcharPII
effective_fromdate
effective_todate
is_activeboolean
load_end_datetimestamp
record_sourcevarchar

sat_compensation

Grain: one row per employee per compensation change

Compensation satellite split out for confidentiality and rate of change.

ColumnTypeKeys
employee_hkbinaryPK
load_datetimestampPK
base_salarydecimal
currencyvarchar
pay_frequencyvarchar
target_bonusdecimal
bonus_target_pctdecimal
equity_grant_valuedecimal
compensation_review_datedate
load_end_datetimestamp
record_sourcevarchar

Lookup tables (1)

ref_country

Grain: one row per ISO country

ColumnTypeKeys
country_codevarcharBK
country_namevarchar
regionvarchar

Relationships

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

  • lnk_employee_position.employee_hk → hub_employee (many-to-one)
  • lnk_employee_position.position_hk → hub_position (many-to-one)
  • lnk_position_department.position_hk → hub_position (many-to-one)
  • lnk_position_department.department_hk → hub_department (many-to-one)
  • lnk_employee_location.employee_hk → hub_employee (many-to-one)
  • lnk_employee_location.location_hk → hub_location (many-to-one)
  • lnk_employee_job.employee_hk → hub_employee (many-to-one)
  • lnk_employee_job.job_hk → hub_job (many-to-one)
  • sat_employee_details.employee_hk → hub_employee (many-to-one)
  • sat_position_details.position_hk → hub_position (many-to-one)
  • sat_department_details.department_hk → hub_department (many-to-one)
  • sat_location_details.location_hk → hub_location (many-to-one)
  • sat_assignment_effectivity.employee_position_hk → lnk_employee_position (many-to-one)
  • sat_compensation.employee_hk → hub_employee (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