Ticket booking has one rule that can't bend: a seat is sold once. Everything else, from browsing films to choosing showtimes, is a normal read-heavy app. In this lab you'll design a ticketing system from a blank page, modelled on a product like BookMyShow. Most of your effort will go into a few minutes in a user's life: from tapping a seat to seeing "booking confirmed".
The brief
People browse films and events in their city, pick a show at a cinema, choose seats on a seat map, pay, and get a ticket. Cinemas list their screens and shows. The busy times are Friday evenings and, much more dramatically, the moment tickets open for a huge film or a stadium concert.
In scope:
- Browsing cities, films, cinemas and showtimes.
- The live seat map for a show.
- Holding seats while the user pays.
- Payment and confirmation.
- Handling a big launch where hundreds of thousands of people want the same show.
Out of scope:
- Reviews, ratings and recommendations.
- Food and drink add-ons.
- Cinema-side admin tools beyond creating shows.
- Refunds and cancellations (mentioned, not designed).
Requirements
Functional
- Users can find shows by city, film, cinema and date.
- Users see a seat map showing which seats are available, held and sold.
- A user can select up to 10 seats and hold them for a few minutes while paying.
- If payment succeeds in time, the seats become theirs. If not, the seats go back on sale.
- The user gets a confirmation and a ticket (QR code).
Non-functional
- Never double-sell. Two people must never both hold or own the same seat. This is the requirement that shapes the design.
- Never charge without a ticket. If money is taken, the user gets their seats or their money back, automatically.
- Fair under a rush: at a big launch, people should be served roughly in arrival order, and bots shouldn't win.
- Browsing stays fast (under 300 ms) even during a rush on one show.
- Seat map freshness: a seat taken by someone else should show as unavailable within a few seconds.