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.
- 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
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.
| Column | Type | Keys |
|---|---|---|
| venue_key | bigint | PK |
| venue_code | varchar | BK |
| venue_name | varchar | |
| address | varchar | |
| city | varchar | |
| country | varchar | |
| timezone | varchar | |
| total_capacity | integer | |
| venue_type | varchar |
section
Grain: one row per seating section in a venue
Venue section.
| Column | Type | Keys |
|---|---|---|
| section_key | bigint | PK |
| venue_key | bigint | |
| section_code | varchar | BK |
| section_name | varchar | |
| level | varchar | |
| capacity | integer | |
| is_accessible | boolean |
seat
Grain: one row per physical seat
Physical seat (for reserved-seating venues).
| Column | Type | Keys |
|---|---|---|
| seat_key | bigint | PK |
| section_key | bigint | |
| row_label | varchar | |
| seat_number | varchar | |
| seat_type | varchar | |
| is_obstructed_view | boolean |
event
Grain: one row per event
Event/production.
| Column | Type | Keys |
|---|---|---|
| event_key | bigint | PK |
| venue_key | bigint | |
| event_code | varchar | BK |
| event_name | varchar | |
| category | varchar | |
| description | varchar | |
| organizer | varchar | |
| on_sale_date | date | |
| status | varchar |
performance
Grain: one row per dated performance of an event
Dated show instance.
| Column | Type | Keys |
|---|---|---|
| performance_key | bigint | PK |
| event_key | bigint | |
| performance_code | varchar | BK |
| performance_datetime | timestamp | |
| doors_open_at | timestamp | |
| duration_minutes | integer | |
| seats_sold | integer | |
| status | varchar |
ticket_type
Grain: one row per ticket type/price tier
Price tier / inventory bucket.
| Column | Type | Keys |
|---|---|---|
| ticket_type_key | bigint | PK |
| performance_key | bigint | |
| section_key | bigint | |
| ticket_type_code | varchar | BK |
| ticket_type_name | varchar | |
| face_value | decimal | |
| service_fee | decimal | |
| currency | varchar | |
| quantity_allotted | integer | |
| quantity_sold | integer | |
| is_active | boolean |
promotion
Grain: one row per promotional code/offer
Discount offer.
| Column | Type | Keys |
|---|---|---|
| promotion_key | bigint | PK |
| event_key | bigint | |
| promo_code | varchar | BK |
| promo_name | varchar | |
| discount_type | varchar | |
| discount_value | decimal | |
| valid_from | date | |
| valid_to | date | |
| max_redemptions | integer | |
| times_redeemed | integer | |
| is_active | boolean |
attendee
Grain: one row per attendee/customer
Ticket buyer / holder.
| Column | Type | Keys |
|---|---|---|
| attendee_key | bigint | PK |
| attendee_number | varchar | BK |
| first_name | varchar | PII |
| last_name | varchar | PII |
| varchar | PII | |
| phone | varchar | PII |
| date_of_birth | date | PII |
| country | varchar | |
| created_at | timestamp |
ticket_order
Grain: one row per purchase order
Purchase header.
| Column | Type | Keys |
|---|---|---|
| ticket_order_key | bigint | PK |
| attendee_key | bigint | |
| promotion_key | bigint | |
| order_number | varchar | BK |
| order_channel | varchar | |
| subtotal_amount | decimal | |
| discount_amount | decimal | |
| fee_amount | decimal | |
| total_amount | decimal | |
| currency | varchar | |
| card_last_four | varchar | PII |
| status | varchar | |
| ordered_at | timestamp |
ticket
Grain: one row per individual ticket
Individual admission ticket.
| Column | Type | Keys |
|---|---|---|
| ticket_key | bigint | PK |
| ticket_order_key | bigint | |
| ticket_type_key | bigint | |
| seat_key | bigint | |
| attendee_key | bigint | |
| ticket_number | varchar | BK |
| barcode | varchar | |
| price_paid | decimal | |
| status | varchar | |
| issued_at | timestamp |
entry_scan
Grain: one row per gate scan/entry
Turnstile / gate scan event.
| Column | Type | Keys |
|---|---|---|
| entry_scan_key | bigint | PK |
| ticket_key | bigint | |
| performance_key | bigint | |
| gate | varchar | |
| scanned_at | timestamp | |
| scan_result | varchar | |
| device_id | varchar |
Lookup tables (1)
event_category_ref
Grain: static reference of event categories
Event-category reference.
| Column | Type | Keys |
|---|---|---|
| event_category_key | bigint | PK |
| category_code | varchar | BK |
| category_name | varchar | |
| description | varchar |
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 →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.
