Base de datos Bookings: esquema de aerolínea, tablas y ejercicios de SQL
Bookings es la base de demostración de PostgreSQL de una aerolínea: vuelos entre 104 aeropuertos, reservas, billetes y tarjetas de embarque. En SQLtest.online puedes consultarla directamente en el navegador: resolver ejercicios con corrección automática y ejecutar tus propias consultas en el playground, sin instalar nada.
- 8 tablas y 4 vistas
- 33 121 vuelos
- 1 045 726 tramos de billetes
- 52 ejercicios de SQL
Qué es Bookings
Bookings es la base de demostración que Postgres Professional publica para aprender PostgreSQL. Modela los vuelos de una aerolínea rusa: rutas, aviones y sus mapas de asientos, reservas, billetes y tarjetas de embarque.
Esta copia contiene vuelos de julio a septiembre de 2017. Los nombres de aeropuertos y aviones se guardan en JSONB en inglés y ruso, y las coordenadas de los aeropuertos usan el tipo point. Por eso la base sirve para practicar tanto las particularidades de PostgreSQL como JOIN y análisis sobre tablas grandes.
Diagrama ER
El diagrama muestra las tablas de Bookings y las claves foráneas que las unen. Haz clic para abrirlo a tamaño completo.
Qué contiene la base
Las tablas se dividen en dos grupos.
Datos de referencia
airports_data, aircrafts_data y seats: el mapa de asientos de cada modelo de avión.
Ventas y vuelos
bookings → tickets → ticket_flights ← flights, además de boarding_passes, que se emiten en el check-in.
Lo principal: una reserva puede incluir varios pasajeros, y un billete puede cubrir varios vuelos. La relación entre billetes y vuelos es ticket_flights, la tabla más grande. Las vistas aircrafts, airports, flights_v y routes muestran los mismos datos de forma más cómoda.
Cuántos datos hay en las tablas:
| Tabla | Filas | Contenido |
|---|---|---|
| bookings | 262 788 | reservas |
| tickets | 366 733 | billetes, uno por pasajero |
| ticket_flights | 1 045 726 | tramos de vuelo de los billetes |
| boarding_passes | 579 686 | tarjetas de embarque |
| flights | 33 121 | vuelos programados y realizados |
| airports_data | 104 | aeropuertos |
| aircrafts_data | 9 | modelos de avión |
| seats | 1339 | asientos por modelo de avión |
Estructura de las tablas
Haz clic en una tabla para ver sus columnas, una fila de ejemplo y sus claves.
La lista de tablas
- aircraft_codeCódigo único para cada aeronave
- modelNombre del modelo de aeronave en inglés y ruso en formato JSON
- rangeRango de vuelo de la aeronave en kilómetros
- CLAVE PRIMARIA, btree (aircraft_code)
| aircraft_code | model | range | |
|---|---|---|---|
| 1 | 773 | {"en": "Boeing 777-300", "ru": "Боинг 777-300"} | 11100 |
- airport_codeCódigo único para cada aeropuerto
- airport_nameNombre del aeropuerto en inglés y ruso en formato JSON
- cityCiudad del aeropuerto en inglés y ruso en formato JSON
- coordinatesCoordenadas del aeropuerto como PUNTO(longitud, latitud)
- timezoneNombre de la zona horaria del aeropuerto
- CLAVE PRIMARIA, 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 de ticket
- flight_idIdentificador de vuelo
- boarding_noNúmero de tarjeta de embarque
- seat_noNúmero de asiento
- CLAVE PRIMARIA, btree (ticket_no, flight_id)
- RESTRICCIÓN ÚNICA, btree (flight_id, boarding_no)
- RESTRICCIÓN ÚNICA, btree (flight_id, seat_no)
- CLAVE FORÁNEA (ticket_no, flight_id) REFERENCIAS ticket_flights(ticket_no, flight_id)
| ticket_no | flight_id | boarding_no | seat_no | |
|---|---|---|---|---|
| 1 | 0005435212351 | 30625 | 1 | 2D |
- book_refNúmero de reserva
- book_dateFecha de reserva
- total_amountCosto total de la reserva
- CLAVE PRIMARIA, btree (book_ref)
| book_ref | book_date | total_amount | |
|---|---|---|---|
| 1 | 00000F | 2017-07-05 00:12:00+00 | 265700.00 |
- flight_idID de vuelo
- flight_noNúmero de vuelo
- scheduled_departureHora de salida programada
- scheduled_arrivalHora de llegada programada
- departure_airportAeropuerto de salida
- arrival_airportAeropuerto de llegada
- statusEstado del vuelo
- aircraft_codeCódigo de aeronave, IATA
- actual_departureHora de salida real
- actual_arrivalHora de llegada real
- CLAVE PRIMARIA, btree (flight_id)
- RESTRICCIÓN ÚNICA, 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 | Programado | 319 |
- aircraft_codeCódigo de aeronave, IATA
- seat_noNúmero de asiento
- fare_conditionsClase de viaje
- CLAVE PRIMARIA, btree (aircraft_code, seat_no)
- CLAVE FORÁNEA (aircraft_code) REFERENCIAS aircrafts(aircraft_code) ON DELETE CASCADE
| aircraft_code | seat_no | fare_conditions | |
|---|---|---|---|
| 1 | 319 | 2A | Business |
- ticket_noNúmero de ticket
- flight_idID de vuelo
- fare_conditionsClase de viaje
- amountCosto del viaje
- CLAVE PRIMARIA, btree (ticket_no, flight_id)
- CLAVE FORÁNEA (flight_id) REFERENCIAS flights(flight_id)
- CLAVE FORÁNEA (ticket_no) REFERENCIAS tickets(ticket_no)
| ticket_no | flight_id | fare_conditions | amount | |
|---|---|---|---|---|
| 1 | 0005432159776 | 30625 | Business | 42100.00 |
- ticket_noNúmero de ticket
- book_refNúmero de reserva
- passenger_idID de pasajero
- passenger_nameNombre del pasajero
- contact_dataInformación de contacto del pasajero
| ticket_no | book_ref | passenger_id | passenger_name | contact_data | |
|---|---|---|---|---|---|
| 1 | 0005432000987 | 06B046 | 8149 604011 | VALERIY TIKHONOV | {"phone": "+70127117011"} |
- CLAVE PRIMARIA, btree (ticket_no)
- CLAVE FORÁNEA (book_ref) REFERENCIAS bookings(book_ref)
Consultas de ejemplo
Estas consultas muestran cómo se relacionan los datos. Copia cualquiera y ejecútala en el playground.
Un billete y su reserva: el pasajero y el importe de la 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 |
Un vuelo y su avión: el nombre en inglés leído de una columna JSONB con ->>.
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 y asiento: del tramo del billete al vuelo y la tarjeta de embarque. El LEFT JOIN conserva los tramos sin tarjeta.
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 |
Ejercicios de SQL por tema
La base Bookings tiene 52 ejercicios, desde consultas sencillas hasta análisis sobre un millón de filas. Las soluciones se comprueban automáticamente en un PostgreSQL real. El número de la derecha es la cantidad de ejercicios del tema; los puntos de color muestran el rango de dificultad.
Por dónde empezar
Los primeros ejercicios de la base Bookings:
- Obtener datos de aeropuertos
- Lista de Aeropuertos
- Aeronaves de Largo Alcance
- Encontrar aeronaves Boeing
- Vuelos Salidos de Domodedovo
- Listar Aeronaves de Domodedovo
- Obtener Reservas por Fecha
- Análisis del uso de aeronaves
- Tipos de Condiciones de Tarifas
- Aeronaves Sin Asientos de Clase Ejecutiva
Todos los ejercicios de Bookings →
Preguntas frecuentes
¿Hay que instalar PostgreSQL para usar Bookings?
No. Los ejercicios y el playground de SQLtest.online ejecutan las consultas en nuestros servidores, así que basta con un navegador. En el playground, Bookings está disponible en PostgreSQL 18.
¿Dónde descargar la base de demostración Bookings?
Postgres Professional la publica en varios tamaños en su sitio web, junto con la descripción del esquema.
¿Por qué algunos nombres aparecen entre llaves?
Los nombres de aeropuertos, ciudades y aviones son objetos JSONB con valores en inglés y ruso. Usa ->> 'en' para obtener el texto en inglés o consulta las vistas, que eligen un idioma.