offdataai
Travel & Hospitality · data model template

Airline Reservation data model

Normalized (3NF) airline reservation model. A schedule spine of flight to dated flight-leg over aircraft and airports, priced by fares, feeds bookings (PNRs) containing passengers, segments, and tickets, with seat assignments and baggage tracked at the leg level and a frequent-flyer loyalty side. Passenger PII is classified and masked.

Airline passenger service system (PSS) operations: the airport/aircraft/flight schedule and dated operating legs, fare/booking classes, the PNR booking with passengers, itinerary segments, and issued tickets, plus seat assignments, checked baggage, and frequent-flyer accounts — modeled as a normalized OLTP reservation and inventory schema with passenger PII 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
114
columns
16
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

schedule_and_fleetbookingtravel_dayloyalty

Design decisions

  • Flight schedule vs. dated operating leg

    A flight number is a recurring scheduled service, while a flight leg is one dated departure flown by a specific aircraft with its own inventory and times; separating them is essential for seat availability and irregular operations.

  • PNR with passengers, segments, and tickets

    A booking (PNR) groups one or more passengers and an itinerary of segments, while tickets are issued per passenger; modeling these as distinct related entities matches GDS/PSS semantics in 3NF.

  • Airport as a lookup

    Airports are slowly changing static reference data shared across flights, so a lookup table avoids repeating IATA/timezone attributes on every flight row.

  • Normalized (3NF) rather than dimensional

    Reservation and inventory processing is highly transactional with constant seat-count and PNR updates, where relational integrity outweighs analytical aggregation.

Tables in the Airline Reservation 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)

aircraft

Grain: one row per aircraft tail

Fleet asset.

ColumnTypeKeys
aircraft_keybigintPK
tail_numbervarcharBK
aircraft_typevarchar
manufacturervarchar
total_seatsinteger
seat_configurationvarchar
max_range_kminteger
statusvarchar

flight

Grain: one row per scheduled flight number

Scheduled service.

ColumnTypeKeys
flight_keybigintPK
flight_numbervarcharBK
airline_codevarchar
origin_airport_keybigint
destination_airport_keybigint
scheduled_departurevarchar
scheduled_arrivalvarchar
duration_minutesinteger
frequencyvarchar
is_activeboolean

flight_leg

Grain: one row per dated, operating flight leg

Operating instance (one dated departure).

ColumnTypeKeys
flight_leg_keybigintPK
flight_keybigint
aircraft_keybigint
leg_idvarcharBK
departure_datedate
scheduled_departure_attimestamp
scheduled_arrival_attimestamp
actual_departure_attimestamp
actual_arrival_attimestamp
gatevarchar
statusvarchar
seats_availableinteger

fare

Grain: one row per fare/booking class on a flight

Fare product / RBD.

ColumnTypeKeys
fare_keybigintPK
flight_keybigint
fare_basisvarcharBK
booking_classvarchar
cabinvarchar
base_faredecimal
taxes_feesdecimal
currencyvarchar
refundableboolean
change_feedecimal
baggage_allowance_kginteger
is_activeboolean

frequent_flyer_account

Grain: one row per loyalty account

Frequent-flyer membership.

ColumnTypeKeys
frequent_flyer_account_keybigintPK
membership_numbervarcharBK
first_namevarcharPII
last_namevarcharPII
emailvarcharPII
tiervarchar
points_balanceinteger
lifetime_milesinteger
enrolled_datedate
statusvarchar

booking

Grain: one row per booking (PNR)

Passenger Name Record.

ColumnTypeKeys
booking_keybigintPK
record_locatorvarcharBK
booking_channelvarchar
currencyvarchar
total_amountdecimal
statusvarchar
contact_emailvarcharPII
contact_phonevarcharPII
booked_attimestamp

passenger

Grain: one row per passenger on a booking

Booking traveler.

ColumnTypeKeys
passenger_keybigintPK
booking_keybigint
frequent_flyer_account_keybigint
passenger_idvarcharBK
first_namevarcharPII
last_namevarcharPII
date_of_birthdatePII
passport_numbervarcharPII
nationalityvarchar
passenger_typevarchar

segment

Grain: one row per flown segment in an itinerary

Itinerary leg coupon.

ColumnTypeKeys
segment_keybigintPK
booking_keybigint
flight_leg_keybigint
fare_keybigint
segment_numberinteger
cabinvarchar
booking_classvarchar
statusvarchar

ticket

Grain: one row per issued ticket

E-ticket document.

ColumnTypeKeys
ticket_keybigintPK
booking_keybigint
passenger_keybigint
ticket_numbervarcharBK
fare_amountdecimal
tax_amountdecimal
total_amountdecimal
currencyvarchar
statusvarchar
issued_datedate

seat_assignment

Grain: one row per passenger seat on a leg

Seat-map assignment.

ColumnTypeKeys
seat_assignment_keybigintPK
passenger_keybigint
flight_leg_keybigint
seat_numbervarchar
seat_typevarchar
cabinvarchar
seat_feedecimal
assigned_attimestamp

baggage

Grain: one row per checked bag

Checked baggage item.

ColumnTypeKeys
baggage_keybigintPK
passenger_keybigint
segment_keybigint
bag_tag_numbervarcharBK
weight_kgdecimal
bag_typevarchar
excess_feedecimal
statusvarchar

Lookup tables (1)

airport

Grain: static reference of airports

Airport reference.

ColumnTypeKeys
airport_keybigintPK
iata_codevarcharBK
icao_codevarchar
airport_namevarchar
cityvarchar
countryvarchar
timezonevarchar
latitudedecimal
longitudedecimal

Relationships

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

  • flight.origin_airport_key → airport (many-to-one)
  • flight.destination_airport_key → airport (many-to-one)
  • flight_leg.flight_key → flight (many-to-one)
  • flight_leg.aircraft_key → aircraft (many-to-one)
  • fare.flight_key → flight (many-to-one)
  • passenger.booking_key → booking (many-to-one)
  • passenger.frequent_flyer_account_key → frequent_flyer_account (many-to-one)
  • segment.booking_key → booking (many-to-one)
  • segment.flight_leg_key → flight_leg (many-to-one)
  • segment.fare_key → fare (many-to-one)
  • ticket.booking_key → booking (many-to-one)
  • ticket.passenger_key → passenger (many-to-one)
  • seat_assignment.passenger_key → passenger (many-to-one)
  • seat_assignment.flight_leg_key → flight_leg (many-to-one)
  • baggage.passenger_key → passenger (many-to-one)
  • baggage.segment_key → segment (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