Banco de dados Bookings: esquema de companhia aérea, tabelas e exercícios de SQL
Bookings é o banco de demonstração do PostgreSQL sobre uma companhia aérea: voos entre 104 aeroportos, reservas, bilhetes e cartões de embarque. No SQLtest.online você consulta o banco direto no navegador: resolve exercícios com correção automática e executa suas próprias consultas no playground, sem instalar nada.
- 8 tabelas e 4 views
- 33.121 voos
- 1.045.726 trechos de bilhetes
- 52 exercícios de SQL
O que é o Bookings
Bookings é o banco de demonstração que a Postgres Professional publica para o aprendizado de PostgreSQL. Ele modela os voos de uma companhia aérea russa: rotas, aeronaves e seus mapas de assentos, reservas, bilhetes e cartões de embarque.
Esta cópia contém voos de julho a setembro de 2017. Os nomes de aeroportos e aeronaves ficam em JSONB, em inglês e russo, e as coordenadas dos aeroportos usam o tipo point. Por isso o banco é bom para praticar recursos específicos do PostgreSQL, JOINs e análises em tabelas grandes.
Diagrama ER
O diagrama mostra as tabelas do Bookings e as chaves estrangeiras entre elas. Clique para abrir em tamanho real.
O que há no banco
As tabelas se dividem em dois grupos.
Dados de referência
airports_data, aircrafts_data e seats: o mapa de assentos de cada modelo de aeronave.
Vendas e voos
bookings → tickets → ticket_flights ← flights, além de boarding_passes, emitidos no check-in.
O ponto principal: uma reserva pode incluir vários passageiros, e um bilhete pode cobrir vários voos. A ligação entre bilhetes e voos é ticket_flights, a maior tabela. As views aircrafts, airports, flights_v e routes mostram os mesmos dados de forma mais amigável.
Quantos dados há nas tabelas:
| Tabela | Linhas | Conteúdo |
|---|---|---|
| bookings | 262.788 | reservas |
| tickets | 366.733 | bilhetes, um por passageiro |
| ticket_flights | 1.045.726 | trechos de voo dos bilhetes |
| boarding_passes | 579.686 | cartões de embarque |
| flights | 33.121 | voos programados e realizados |
| airports_data | 104 | aeroportos |
| aircrafts_data | 9 | modelos de aeronaves |
| seats | 1.339 | assentos por modelo de aeronave |
Estrutura das tabelas
Clique em uma tabela para ver suas colunas, uma linha de exemplo e as chaves.
Lista de tabelas
- aircraft_codeCódigo único para cada aeronave
- modelNome do modelo da aeronave em inglês e russo no formato JSON
- rangeAlcance de voo da aeronave em quilômetros
- PRIMARY KEY, btree (aircraft_code)
| aircraft_code | model | range | |
|---|---|---|---|
| 1 | 773 | {"en": "Boeing 777-300", "ru": "Боинг 777-300"} | 11100 |
- airport_codeCódigo único para cada aeroporto
- airport_nameNome do aeroporto em inglês e russo no formato JSON
- cityCidade do aeroporto em inglês e russo no formato JSON
- coordinatesCoordenadas do aeroporto como POINT(longitude, latitude)
- timezoneNome do fuso horário do aeroporto
- PRIMARY KEY, btree (airport_code)
| airport_code | airport_name | city | coordinates | timezone | |
|---|---|---|---|---|---|
| 1 | YKS | {"en": "Yakutsk Airport", "ru": "Якутск"} | {"en": "Yakutsk", "ru": "Якутск"} | (129.77099609375,62.0932998657227) | Asia/Yakutsk |
- ticket_noNúmero do bilhete
- flight_idIdentificador do voo
- boarding_noNúmero do cartão de embarque
- seat_noNúmero do assento
- PRIMARY KEY, btree (ticket_no, flight_id)
- UNIQUE KEY, btree (flight_id, boarding_no)
- UNIQUE KEY, btree (flight_id, seat_no)
- FOREIGN KEY (ticket_no, flight_id) REFERÊNCIAS ticket_flights(ticket_no, flight_id)
| ticket_no | flight_id | boarding_no | seat_no | |
|---|---|---|---|---|
| 1 | 0005435212351 | 30625 | 1 | 2D |
- book_refNúmero da reserva
- book_dateData da reserva
- total_amountCusto total da reserva
- PRIMARY KEY, btree (book_ref)
| book_ref | book_date | total_amount | |
|---|---|---|---|
| 1 | 00000F | 2017-07-05 00:12:00+00 | 265700.00 |
- flight_idID do voo
- flight_noNúmero do voo
- scheduled_departureHorário programado de partida
- scheduled_arrivalHorário programado de chegada
- departure_airportAeroporto de partida
- arrival_airportAeroporto de chegada
- statusStatus do voo
- aircraft_codeCódigo da aeronave, IATA
- actual_departureHorário real de partida
- actual_arrivalHorário real de chegada
- PRIMARY KEY, btree (flight_id)
- UNIQUE KEY, btree (flight_no, scheduled_departure)
| flight_id | flight_no | scheduled_departure | scheduled_arrival | departure_airport | arrival_airport | status | aircraft_code | actual_departure | actual_arrival | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1185 | PG0134 | 2017-09-10 06:50:00+00 | 2017-09-10 11:55:00+00 | DME | BTK | Scheduled | 319 |
- aircraft_codeCódigo da aeronave, IATA
- seat_noNúmero do assento
- fare_conditionsClasse de viagem
- PRIMARY KEY, btree (aircraft_code, seat_no)
- FOREIGN KEY (aircraft_code) REFERÊNCIAS aircrafts(aircraft_code) ON DELETE CASCADE
| aircraft_code | seat_no | fare_conditions | |
|---|---|---|---|
| 1 | 319 | 2A | Business |
- ticket_noNúmero do bilhete
- flight_idID do voo
- fare_conditionsClasse de viagem
- amountCusto da viagem
- PRIMARY KEY, btree (ticket_no, flight_id)
- FOREIGN KEY (flight_id) REFERÊNCIAS flights(flight_id)
- FOREIGN KEY (ticket_no) REFERÊNCIAS tickets(ticket_no)
| ticket_no | flight_id | fare_conditions | amount | |
|---|---|---|---|---|
| 1 | 0005432159776 | 30625 | Business | 42100.00 |
- ticket_noNúmero do bilhete
- book_refNúmero da reserva
- passenger_idID do passageiro
- passenger_nameNome do passageiro
- contact_dataInformações de contato do passageiro
- PRIMARY KEY, btree (ticket_no)
- FOREIGN KEY (book_ref) REFERÊNCIAS bookings(book_ref)
| ticket_no | book_ref | passenger_id | passenger_name | contact_data | |
|---|---|---|---|---|---|
| 1 | 0005432000987 | 06B046 | 8149 604011 | VALERIY TIKHONOV | {"phone": "+70127117011"} |
Exemplos de consultas
Estas consultas mostram como os dados se relacionam. Copie qualquer uma e execute no playground.
Um bilhete e sua reserva: o passageiro e o valor da reserva.
SELECT t.ticket_no, t.passenger_name, b.book_date, b.total_amount
FROM tickets t
JOIN bookings b ON b.book_ref = t.book_ref
ORDER BY t.ticket_no
LIMIT 3;
| ticket_no | passenger_name | book_date | total_amount |
|---|---|---|---|
| 0005432000987 | VALERIY TIKHONOV | 2017-07-05 17:19:00+00 | 12400.00 |
| 0005432000988 | EVGENIYA ALEKSEEVA | 2017-07-05 17:19:00+00 | 12400.00 |
| 0005432000989 | ARTUR GERASIMOV | 2017-06-28 22:55:00+00 | 24700.00 |
Um voo e sua aeronave: o nome em inglês lido de uma coluna JSONB com ->>.
SELECT f.flight_no, f.departure_airport, f.arrival_airport,
a.model ->> 'en' AS aircraft
FROM flights f
JOIN aircrafts_data a ON a.aircraft_code = f.aircraft_code
ORDER BY f.flight_id
LIMIT 3;
| flight_no | departure_airport | arrival_airport | aircraft |
|---|---|---|---|
| PG0405 | DME | LED | Airbus A321-200 |
| PG0404 | DME | LED | Airbus A321-200 |
| PG0405 | DME | LED | Airbus A321-200 |
Tarifa e assento: do trecho do bilhete ao voo e ao cartão de embarque. O LEFT JOIN mantém os trechos sem cartão.
SELECT tf.ticket_no, f.flight_no, tf.fare_conditions, tf.amount, bp.seat_no
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
LEFT JOIN boarding_passes bp
ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
ORDER BY tf.ticket_no, f.flight_id
LIMIT 3;
| ticket_no | flight_no | fare_conditions | amount | seat_no |
|---|---|---|---|---|
| 0005432000987 | PG0242 | Economy | 6200.00 | 7A |
| 0005432000988 | PG0242 | Economy | 6200.00 | 10E |
| 0005432000989 | PG0242 | Economy | 6200.00 | 18E |
Exercícios de SQL por tema
Há 52 exercícios no banco Bookings, de consultas simples a análises sobre um milhão de linhas. As soluções são verificadas automaticamente em um PostgreSQL real. O número à direita é a quantidade de exercícios do tema; os pontos coloridos mostram a faixa de dificuldade.
Por onde começar
Os primeiros exercícios do banco Bookings:
- Obter dados de aeroportos
- Obter uma lista de aeroportos
- Encontrar aeronaves de longo alcance
- Encontrar aeronaves Boeing
- Voos de Domodedovo
- Lista de aeronaves de Domodedovo
- Obter Reservas por Data
- Análise de uso de aeronaves
- Tipos de Tarifas
- Aeronaves sem Classe Executiva
Todos os exercícios do Bookings →
Perguntas frequentes
Preciso instalar o PostgreSQL para usar o Bookings?
Não. Os exercícios e o playground do SQLtest.online executam as consultas nos nossos servidores, então basta um navegador. No playground, o Bookings está disponível no PostgreSQL 18.
Onde baixar o banco de demonstração Bookings?
A Postgres Professional o publica em vários tamanhos no seu site, junto com a descrição do esquema.
Por que alguns nomes aparecem entre chaves?
Os nomes de aeroportos, cidades e aeronaves são objetos JSONB com valores em inglês e russo. Use ->> 'en' para obter o texto em inglês ou consulte as views, que escolhem um idioma.