offdataai
Healthcare & Life Sciences · data model template

Hospital ADT / Patient Flow data model

Normalized (3NF) hospital ADT / patient-flow model. The census hierarchy (facility -> unit -> bed) anchors occupancy, while the admission encounter spawns transfer (A02), bed-assignment, and discharge (A03) child events that follow HL7 v2 ADT triggers. Coverage and chargemaster charges support revenue capture. PHI is classified phi and masked.

Operational hospital admission-discharge-transfer (ADT) and patient-flow data: patients, facilities, nursing units/wards, beds, inpatient admissions, bed/unit transfers, bed-occupancy intervals, discharges, attending providers, insurance coverage, and chargemaster charges. The event model follows HL7 v2 ADT trigger events. Patient PHI is classified and masked for HIPAA. It is a normalized (3NF) relational model that mirrors the source system, suited to operational databases and to landing source data faithfully.

3NFHealthcare & Life SciencesHIPAAHITECH
11
tables
129
columns
18
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: PostgreSQL). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

census_structuredirectorypatient_flowfinancial

Design decisions

  • HL7 v2 ADT trigger events as event tables

    Patient flow is driven by HL7 v2 ADT messages (A01 admit, A02 transfer, A03 discharge); modeling admission, transfer, and discharge as separate event tables mirrors the message stream and preserves the true event grain.

  • Facility -> unit -> bed census hierarchy

    Bed management requires a normalized location hierarchy; separating facility, unit, and bed avoids repeating location attributes and lets occupancy roll up cleanly to unit and facility census.

  • Bed-assignment intervals separate from transfer events

    A transfer is an instantaneous event, but occupancy is an interval; an explicit bed_assignment table with start/end timestamps supports accurate bed-day and length-of-stay calculations.

  • PHI classification and masking for HIPAA

    Patient identifiers, emergency contacts, and payer member IDs are classified phi and masked (SSN fully) so the governance report enforces HIPAA minimum-necessary controls across the encounter.

Tables in the Hospital ADT / Patient Flow 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.

Tables (11)

facility

Grain: one row per hospital facility / campus

ColumnTypeKeys
facility_keybigintPK
facility_idvarcharBK
namevarchar
npivarchar
facility_typevarchar
bed_capacityinteger
phonevarchar
address_line1varchar
cityvarchar
statevarchar
postal_codevarchar
is_activeboolean

unit

Grain: one row per nursing unit / ward

ColumnTypeKeys
unit_keybigintPK
facility_keybigint
unit_idvarcharBK
namevarchar
unit_typevarchar
floorvarchar
licensed_bedssmallint
specialtyvarchar
is_activeboolean

bed

Grain: one row per physical bed

ColumnTypeKeys
bed_keybigintPK
unit_keybigint
bed_idvarcharBK
room_numbervarchar
bed_labelvarchar
bed_typevarchar
is_isolationboolean
statusvarchar
is_activeboolean

provider

Grain: one row per attending / treating provider

ColumnTypeKeys
provider_keybigintPK
facility_keybigint
provider_idvarcharBK
npivarchar
first_namevarcharPII
last_namevarcharPII
specialtyvarchar
rolevarchar
license_numbervarchar
pagervarchar
is_activeboolean

patient

Grain: one row per patient (master patient index)

Master patient index; all PHI masked for HIPAA.

ColumnTypeKeys
patient_keybigintPK
mrnvarcharBK
ssnvarcharPII
first_namevarcharPII
last_namevarcharPII
date_of_birthdatePII
sexvarchar
racevarchar
ethnicityvarchar
marital_statusvarchar
phonevarcharPII
address_line1varcharPII
cityvarchar
statevarchar
postal_codevarchar
emergency_contact_namevarcharPII
emergency_contact_phonevarcharPII
is_deceasedboolean
is_activeboolean

admission

Grain: one row per inpatient admission / encounter (HL7 ADT A01)

The inpatient encounter; transfers/discharges are child events.

ColumnTypeKeys
admission_keybigintPK
patient_keybigint
facility_keybigint
provider_keybigint
admission_idvarcharBK
account_numbervarchar
patient_classvarchar
admission_typevarchar
admission_sourcevarchar
admitting_diagnosisvarchar
drg_codevarchar
expected_length_of_staysmallint
statusvarchar
admitted_datetimetimestamp

transfer

Grain: one row per bed/unit transfer event (HL7 ADT A02)

Movement between beds/units within an admission.

ColumnTypeKeys
transfer_keybigintPK
admission_keybigint
from_bed_keybigint
to_bed_keybigint
transfer_reasonvarchar
level_of_care_changevarchar
ordered_by_provider_keybigint
sequence_numbersmallint
transfer_datetimetimestamp

bed_assignment

Grain: one row per occupancy interval of a bed by an admission

Census occupancy intervals; supports bed-day calculations.

ColumnTypeKeys
bed_assignment_keybigintPK
admission_keybigint
bed_keybigint
transfer_keybigint
assignment_typevarchar
start_datetimetimestamp
end_datetimetimestamp
is_currentboolean

discharge

Grain: one row per discharge event (HL7 ADT A03)

ColumnTypeKeys
discharge_keybigintPK
admission_keybigint
provider_keybigint
discharge_dispositionvarchar
discharge_locationvarchar
principal_diagnosisvarchar
discharge_drg_codevarchar
length_of_stay_dayssmallint
readmission_risk_scoredecimal
discharge_datetimetimestamp

insurance_coverage

Grain: one row per payer coverage on an admission

ColumnTypeKeys
insurance_coverage_keybigintPK
admission_keybigint
patient_keybigint
payer_namevarchar
payer_typevarchar
coverage_ordervarchar
member_idvarcharPII
group_numbervarchar
plan_namevarchar
authorization_numbervarchar
verification_statusvarchar
effective_datedate
termination_datedate

charge

Grain: one row per posted charge during the stay

Chargemaster postings (CDM) for the encounter.

ColumnTypeKeys
charge_keybigintPK
admission_keybigint
patient_keybigint
unit_keybigint
charge_idvarcharBK
charge_codevarchar
cpt_hcpcs_codevarchar
revenue_codevarchar
descriptionvarchar
quantitydecimal
unit_pricedecimal
total_chargedecimal
departmentvarchar
service_datedate
posted_datetimetimestamp

Relationships

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

  • unit.facility_key → facility (many-to-one)
  • bed.unit_key → unit (many-to-one)
  • provider.facility_key → facility (many-to-one)
  • admission.patient_key → patient (many-to-one)
  • admission.facility_key → facility (many-to-one)
  • admission.provider_key → provider (many-to-one)
  • transfer.admission_key → admission (many-to-one)
  • transfer.to_bed_key → bed (many-to-one)
  • bed_assignment.admission_key → admission (many-to-one)
  • bed_assignment.bed_key → bed (many-to-one)
  • bed_assignment.transfer_key → transfer (many-to-one)
  • discharge.admission_key → admission (many-to-one)
  • discharge.provider_key → provider (many-to-one)
  • insurance_coverage.admission_key → admission (many-to-one)
  • insurance_coverage.patient_key → patient (many-to-one)
  • charge.admission_key → admission (many-to-one)
  • charge.patient_key → patient (many-to-one)
  • charge.unit_key → unit (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