База данных Bookings: авиаперевозки, схема, таблицы и SQL-задачи
Bookings — демонстрационная база PostgreSQL об авиакомпании: рейсы между 104 аэропортами, бронирования, билеты и посадочные талоны. На SQLtest.online с ней можно работать прямо в браузере: решать задачи с автоматической проверкой и писать свои запросы в песочнице, ничего не устанавливая.
- 8 таблиц и 4 представления
- 33 121 рейс
- 1 045 726 перелётов по билетам
- 52 SQL-задачи
Что такое Bookings
Bookings — демобаза, которую компания Postgres Professional выпускает для изучения PostgreSQL. Она описывает рейсы российской авиакомпании: маршруты, самолёты и схемы их салонов, бронирования, билеты и посадочные талоны.
В этой копии рейсы с июля по сентябрь 2017 года. Названия аэропортов и самолётов хранятся в JSONB на английском и русском, а координаты аэропортов — в типе point. Поэтому на базе удобно тренировать и особенности PostgreSQL, и JOIN, и аналитику на больших таблицах.
ER-диаграмма
Диаграмма показывает таблицы Bookings и связи между ними по внешним ключам. Нажмите, чтобы открыть её в полном размере.
Из чего состоит база
Таблицы делятся на две группы.
Справочники
airports_data, aircrafts_data и seats — схема мест для каждой модели самолёта.
Продажи и рейсы
bookings → tickets → ticket_flights ← flights, а также boarding_passes, которые выдаются при регистрации.
Главное, что стоит запомнить: в одном бронировании может быть несколько пассажиров, а один билет может включать несколько перелётов. Билеты и рейсы связывает ticket_flights — самая большая таблица. Представления aircrafts, airports, flights_v и routes показывают те же данные в более удобном виде.
Сколько данных в таблицах:
| Таблица | Строк | Что хранит |
|---|---|---|
| bookings | 262 788 | бронирования |
| tickets | 366 733 | билеты, по одному на пассажира |
| ticket_flights | 1 045 726 | перелёты, входящие в билеты |
| boarding_passes | 579 686 | посадочные талоны |
| flights | 33 121 | рейсы по расписанию и выполненные |
| airports_data | 104 | аэропорты |
| aircrafts_data | 9 | модели самолётов |
| seats | 1 339 | места в салонах самолётов |
Структура таблиц
Нажмите на таблицу, чтобы увидеть её столбцы, пример строки и ключи.
Список таблиц
- aircraft_codeУникальный код для каждого самолета
- modelНазвание модели самолета на английском и русском языках в формате JSON
- rangeДальность полета самолета в километрах
| aircraft_code | model | range | |
|---|---|---|---|
| 1 | 773 | { "en": "Boeing 777-300", "ru": "Боинг 777-300" } | 11100 |
- PRIMARY KEY, btree (aircraft_code)
- airport_codeУникальный код для каждого аэропорта
- airport_nameНазвание аэропорта на английском и русском языках в формате JSON
- cityГород аэропорта на английском и русском языках в формате JSON
- coordinatesКоординаты аэропорта в виде POINT(долгота, широта)
- timezoneНазвание часового пояса аэропорта
| airport_code | airport_name | city | coordinates | timezone | |
|---|---|---|---|---|---|
| 1 | YKS | { "en": "Yakutsk Airport", "ru": "Якутск" } | { "en": "Yakutsk", "ru": "Якутск" } | (129.77099609375,62.0932998657227) | Asia/Yakutsk |
- PRIMARY KEY, btree (airport_code)
- ticket_noНомер билета
- flight_idИдентификатор рейса
- boarding_noНомер посадочного талона
- seat_noНомер места
| ticket_no | flight_id | boarding_no | seat_no | |
|---|---|---|---|---|
| 1 | 0005435212351 | 30625 | 1 | 2D |
- PRIMARY KEY, btree (ticket_no, flight_id)
- UNIQUE CONSTRAINT, btree (flight_id, boarding_no)
- UNIQUE CONSTRAINT, btree (flight_id, seat_no)
- FOREIGN KEY (ticket_no, flight_id) REFERENCES ticket_flights(ticket_no, flight_id)
- book_refНомер бронирования
- book_dateДата бронирования
- total_amountОбщая стоимость бронирования
| book_ref | book_date | total_amount | |
|---|---|---|---|
| 1 | 00000F | 2017-07-05 00:12:00+00 | 265700.00 |
- PRIMARY KEY, btree (book_ref)
- flight_idИдентификатор рейса
- flight_noНомер рейса
- scheduled_departureЗапланированное время отправления
- scheduled_arrivalЗапланированное время прибытия
- departure_airportАэропорт вылета
- arrival_airportАэропорт прибытия
- statusСтатус рейса
- aircraft_codeКод самолета, IATA
- actual_departureФактическое время отправления
- actual_arrivalФактическое время прибытия
| 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 |
- PRIMARY KEY, btree (flight_id)
- UNIQUE CONSTRAINT, btree (flight_no, scheduled_departure)
- aircraft_codeКод самолета, IATA
- seat_noНомер места
- fare_conditionsКласс путешествия
| aircraft_code | seat_no | fare_conditions | |
|---|---|---|---|
| 1 | 319 | 2A | Business |
- PRIMARY KEY, btree (aircraft_code, seat_no)
- FOREIGN KEY (aircraft_code) REFERENCES aircrafts(aircraft_code) ON DELETE CASCADE
- ticket_noНомер билета
- flight_idИдентификатор рейса
- fare_conditionsКласс путешествия
- amountСтоимость поездки
| ticket_no | flight_id | fare_conditions | amount | |
|---|---|---|---|---|
| 1 | 0005432159776 | 30625 | Business | 42100.00 |
- PRIMARY KEY, btree (ticket_no, flight_id)
- FOREIGN KEY (flight_id) REFERENCES flights(flight_id)
- FOREIGN KEY (ticket_no) REFERENCES tickets(ticket_no)
- ticket_noНомер билета
- book_refНомер бронирования
- passenger_idИдентификатор пассажира
- passenger_nameИмя пассажира
- contact_dataКонтактная информация пассажира
| ticket_no | book_ref | passenger_id | passenger_name | contact_data | |
|---|---|---|---|---|---|
| 1 | 0005432000987 | 06B046 | 8149 604011 | VALERIY TIKHONOV | { "phone": "+70127117011" } |
- PRIMARY KEY, btree (ticket_no)
- FOREIGN KEY (book_ref) REFERENCES bookings(book_ref)
Примеры запросов
Эти запросы показывают, как связаны данные. Скопируйте любой и запустите в песочнице.
Билет и его бронирование — пассажир и сумма бронирования:
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 |
Рейс и самолёт — английское название из JSONB-столбца через ->>:
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 |
Тариф и место — от перелёта по билету к рейсу и посадочному талону. LEFT JOIN сохраняет перелёты без талона:
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 |
SQL-задачи по темам
Задач на базе Bookings: 52 — от простых выборок до аналитики по миллиону строк. Решение проверяется автоматически на настоящем PostgreSQL. Число справа — количество задач в теме, цветные метки — диапазон сложности.
С чего начать
Первые задачи по базе Bookings:
- Получить данные аэропортов
- Список аэропортов
- Дальнемагистральные самолеты
- Список самолетов Boeing
- Список рейсов из Домодедово
- Список самолётов из Домодедово
- Получить бронирования по дате
- Анализ использования самолётов
- Типы тарифов
- Самолеты без Бизнес-класса
Частые вопросы
Нужно ли устанавливать PostgreSQL, чтобы работать с Bookings?
Нет. Задачи и песочница на SQLtest.online выполняют запросы на сервере, достаточно браузера. В песочнице Bookings доступна в PostgreSQL 18.
Где скачать демобазу Bookings?
Postgres Professional публикует её на своём сайте в нескольких размерах вместе с описанием схемы.
Почему некоторые названия в фигурных скобках?
Названия аэропортов, городов и самолётов — это JSONB-объекты с английским и русским значениями. Чтобы получить текст на одном языке, используйте ->> 'ru' или обращайтесь к представлениям.