offdataai
Media, Gaming & Sports · data model template

Event Ticketing data model

Normalized (3NF) event-ticketing model. Venue to section to seat defines the physical layout; events break into dated performances priced by ticket types, which are sold (with optional promotions) through orders that issue individual tickets to attendees, validated at the gate by entry scans. Attendee and card data are classified and masked.

Event ticketing operations: the venue/section/seat physical hierarchy, events and their dated performances, ticket types and promotional offers, the order/ticket chain with attendees, and gate-scan entries — modeled as a normalized OLTP ticketing platform schema with attendee 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.

3NFMedia, Gaming & SportsGDPRPCI DSS
12
tables
104
columns
15
relationships
6
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

venue_layouteventssalesaccess_control

Design decisions

  • Event vs. dated performance

    An event (a run or tour) groups one or more dated performances, each with its own seat inventory and on-sale status; separating them is essential for multi-show events and per-night availability.

  • Venue/section/seat hierarchy with GA fallback

    Reserved-seating venues need a seat-level grid while general-admission tiers do not, so seat assignment on a ticket is optional and ticket types bind to a section rather than a fixed seat.

  • Order vs. ticket separation

    A purchase order can contain many tickets, each individually transferable, refundable, and scannable, so tickets are their own entity rather than order line attributes.

  • Normalized (3NF) rather than dimensional

    Ticketing is high-concurrency transactional with live inventory decrements and scan validation where relational integrity matters more than analytical aggregation.

Tables in the Event Ticketing 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)

venue

Grain: one row per venue

Physical venue.

ColumnTypeKeys
venue_keybigintPK
venue_codevarcharBK
venue_namevarchar
addressvarchar
cityvarchar
countryvarchar
timezonevarchar
total_capacityinteger
venue_typevarchar

section

Grain: one row per seating section in a venue

Venue section.

ColumnTypeKeys
section_keybigintPK
venue_keybigint
section_codevarcharBK
section_namevarchar
levelvarchar
capacityinteger
is_accessibleboolean

seat

Grain: one row per physical seat

Physical seat (for reserved-seating venues).

ColumnTypeKeys
seat_keybigintPK
section_keybigint
row_labelvarchar
seat_numbervarchar
seat_typevarchar
is_obstructed_viewboolean

event

Grain: one row per event

Event/production.

ColumnTypeKeys
event_keybigintPK
venue_keybigint
event_codevarcharBK
event_namevarchar
categoryvarchar
descriptionvarchar
organizervarchar
on_sale_datedate
statusvarchar

performance

Grain: one row per dated performance of an event

Dated show instance.

ColumnTypeKeys
performance_keybigintPK
event_keybigint
performance_codevarcharBK
performance_datetimetimestamp
doors_open_attimestamp
duration_minutesinteger
seats_soldinteger
statusvarchar

ticket_type

Grain: one row per ticket type/price tier

Price tier / inventory bucket.

ColumnTypeKeys
ticket_type_keybigintPK
performance_keybigint
section_keybigint
ticket_type_codevarcharBK
ticket_type_namevarchar
face_valuedecimal
service_feedecimal
currencyvarchar
quantity_allottedinteger
quantity_soldinteger
is_activeboolean

promotion

Grain: one row per promotional code/offer

Discount offer.

ColumnTypeKeys
promotion_keybigintPK
event_keybigint
promo_codevarcharBK
promo_namevarchar
discount_typevarchar
discount_valuedecimal
valid_fromdate
valid_todate
max_redemptionsinteger
times_redeemedinteger
is_activeboolean

attendee

Grain: one row per attendee/customer

Ticket buyer / holder.

ColumnTypeKeys
attendee_keybigintPK
attendee_numbervarcharBK
first_namevarcharPII
last_namevarcharPII
emailvarcharPII
phonevarcharPII
date_of_birthdatePII
countryvarchar
created_attimestamp

ticket_order

Grain: one row per purchase order

Purchase header.

ColumnTypeKeys
ticket_order_keybigintPK
attendee_keybigint
promotion_keybigint
order_numbervarcharBK
order_channelvarchar
subtotal_amountdecimal
discount_amountdecimal
fee_amountdecimal
total_amountdecimal
currencyvarchar
card_last_fourvarcharPII
statusvarchar
ordered_attimestamp

ticket

Grain: one row per individual ticket

Individual admission ticket.

ColumnTypeKeys
ticket_keybigintPK
ticket_order_keybigint
ticket_type_keybigint
seat_keybigint
attendee_keybigint
ticket_numbervarcharBK
barcodevarchar
price_paiddecimal
statusvarchar
issued_attimestamp

entry_scan

Grain: one row per gate scan/entry

Turnstile / gate scan event.

ColumnTypeKeys
entry_scan_keybigintPK
ticket_keybigint
performance_keybigint
gatevarchar
scanned_attimestamp
scan_resultvarchar
device_idvarchar

Lookup tables (1)

event_category_ref

Grain: static reference of event categories

Event-category reference.

ColumnTypeKeys
event_category_keybigintPK
category_codevarcharBK
category_namevarchar
descriptionvarchar

Relationships

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

  • section.venue_key → venue (many-to-one)
  • seat.section_key → section (many-to-one)
  • event.venue_key → venue (many-to-one)
  • performance.event_key → event (many-to-one)
  • ticket_type.performance_key → performance (many-to-one)
  • ticket_type.section_key → section (many-to-one)
  • promotion.event_key → event (many-to-one)
  • ticket_order.attendee_key → attendee (many-to-one)
  • ticket_order.promotion_key → promotion (many-to-one)
  • ticket.ticket_order_key → ticket_order (many-to-one)
  • ticket.ticket_type_key → ticket_type (many-to-one)
  • ticket.seat_key → seat (many-to-one)
  • ticket.attendee_key → attendee (many-to-one)
  • entry_scan.ticket_key → ticket (many-to-one)
  • entry_scan.performance_key → performance (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