offdataai
Travel & Hospitality · data model template

Hotel PMS data model

Normalized (3NF) hotel PMS model. Property to room-type to room inventory and rate plans feed reservations, which materialize as room-assigned stays; each stay carries a folio with itemized charges and payments, while housekeeping tasks track room servicing. Guest and card data are classified and masked.

Hotel property-management operations: guest profiles, the property/room-type/room inventory hierarchy, rate plans, reservations and realized stays, the folio billing chain (charges and payments), and housekeeping tasks — modeled as a normalized OLTP front-desk schema with guest PII and payment card data classified and masked. It is a normalized (3NF) relational model that mirrors the source system, suited to operational databases and to landing source data faithfully.

3NFTravel & HospitalityGDPRPCI DSS
12
tables
127
columns
14
relationships
9
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

guestsinventorybookingsbillingoperations

Design decisions

  • Room-type vs. physical-room separation

    Guests book a sellable category (room type) at reservation time but are assigned a physical room at check-in; splitting them keeps availability, pricing, and assignment correctly normalized.

  • Reservation header vs. stay vs. folio

    A reservation is the booking intent, a stay is the realized occupancy of an assigned room, and a folio is its billing ledger; keeping them distinct supports no-shows, early departures, and split/master folios.

  • Charge-code lookup

    Folio charges reference a static charge-code table so tax rates and revenue-center categories are maintained once and not repeated on every posting line.

  • Normalized (3NF) rather than dimensional

    Front-desk and night-audit processing is transactional with frequent updates to folios and room status, where 3NF integrity beats analytical star schemas.

Tables in the Hotel PMS 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)

guest

Grain: one row per guest profile

Guest party record.

ColumnTypeKeys
guest_keybigintPK
guest_numbervarcharBK
first_namevarcharPII
last_namevarcharPII
emailvarcharPII
phonevarcharPII
addressvarcharPII
countryvarchar
date_of_birthdatePII
passport_numbervarcharPII
loyalty_tiervarchar
loyalty_pointsinteger
vip_statusboolean
created_attimestamp

property

Grain: one row per hotel property

Hotel/property.

ColumnTypeKeys
property_keybigintPK
property_codevarcharBK
property_namevarchar
brandvarchar
addressvarchar
cityvarchar
countryvarchar
star_ratingsmallint
total_roomsinteger
check_in_timevarchar
check_out_timevarchar
currencyvarchar

room_type

Grain: one row per room category at a property

Sellable room category.

ColumnTypeKeys
room_type_keybigintPK
property_keybigint
room_type_codevarcharBK
room_type_namevarchar
descriptionvarchar
max_occupancysmallint
bed_configurationvarchar
base_ratedecimal
square_metersdecimal

room

Grain: one row per physical room

Physical sellable unit.

ColumnTypeKeys
room_keybigintPK
room_type_keybigint
room_numbervarcharBK
floorsmallint
statusvarchar
occupancy_statusvarchar
connecting_roomvarchar
is_accessibleboolean
is_smokingboolean

rate_plan

Grain: one row per rate plan

Pricing/policy plan.

ColumnTypeKeys
rate_plan_keybigintPK
property_keybigint
rate_plan_codevarcharBK
rate_plan_namevarchar
descriptionvarchar
meal_planvarchar
is_refundableboolean
cancellation_policyvarchar
min_nightssmallint
is_activeboolean

reservation

Grain: one row per reservation

Booking header.

ColumnTypeKeys
reservation_keybigintPK
guest_keybigint
property_keybigint
room_type_keybigint
rate_plan_keybigint
confirmation_numbervarcharBK
booking_channelvarchar
arrival_datedate
departure_datedate
num_adultssmallint
num_childrensmallint
num_roomssmallint
total_amountdecimal
deposit_amountdecimal
statusvarchar
special_requestsvarchar
booked_attimestamp

stay

Grain: one row per realized room-night occupancy

Assigned-room occupancy.

ColumnTypeKeys
stay_keybigintPK
reservation_keybigint
room_keybigint
check_in_attimestamp
check_out_attimestamp
actual_arrival_datedate
actual_departure_datedate
nightssmallint
statusvarchar

folio

Grain: one row per guest folio (billing account)

In-stay billing ledger.

ColumnTypeKeys
folio_keybigintPK
stay_keybigint
folio_numbervarcharBK
folio_typevarchar
total_chargesdecimal
total_paymentsdecimal
balancedecimal
currencyvarchar
statusvarchar
opened_attimestamp
closed_attimestamp

folio_charge

Grain: one row per posted charge

Charge posting line.

ColumnTypeKeys
folio_charge_keybigintPK
folio_keybigint
charge_code_keybigint
posting_datedate
descriptionvarchar
quantitydecimal
unit_amountdecimal
amountdecimal
tax_amountdecimal
revenue_centervarchar
posted_attimestamp

payment

Grain: one row per payment/settlement

Settlement record.

ColumnTypeKeys
payment_keybigintPK
folio_keybigint
payment_numbervarcharBK
payment_methodvarchar
card_last_fourvarcharPII
amountdecimal
currencyvarchar
payment_datedate
statusvarchar
transaction_referencevarchar

housekeeping_task

Grain: one row per housekeeping task

Room servicing task.

ColumnTypeKeys
housekeeping_task_keybigintPK
room_keybigint
task_typevarchar
assigned_tovarcharPII
priorityvarchar
scheduled_datedate
started_attimestamp
completed_attimestamp
statusvarchar
notesvarchar

Lookup tables (1)

charge_code

Grain: static reference of charge codes

Posting code reference.

ColumnTypeKeys
charge_code_keybigintPK
codevarcharBK
descriptionvarchar
categoryvarchar
default_tax_ratedecimal

Relationships

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

  • room_type.property_key → property (many-to-one)
  • room.room_type_key → room_type (many-to-one)
  • rate_plan.property_key → property (many-to-one)
  • reservation.guest_key → guest (many-to-one)
  • reservation.property_key → property (many-to-one)
  • reservation.room_type_key → room_type (many-to-one)
  • reservation.rate_plan_key → rate_plan (many-to-one)
  • stay.reservation_key → reservation (many-to-one)
  • stay.room_key → room (many-to-one)
  • folio.stay_key → stay (many-to-one)
  • folio_charge.folio_key → folio (many-to-one)
  • folio_charge.charge_code_key → charge_code (many-to-one)
  • payment.folio_key → folio (many-to-one)
  • housekeeping_task.room_key → room (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