Новый месяц, новые цели. Ваша помощь помогает проекту двигаться вперед. 🖥️ Поддержите sqltest →
SQL код скопирован в буфер обмена

База данных 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 и связи между ними по внешним ключам. Нажмите, чтобы открыть её в полном размере.

ER-диаграмма базы данных Bookings

Из чего состоит база

Таблицы делятся на две группы.

Справочники

airports_data, aircrafts_data и seats — схема мест для каждой модели самолёта.

Продажи и рейсы

bookings → tickets → ticket_flights ← flights, а также boarding_passes, которые выдаются при регистрации.

Главное, что стоит запомнить: в одном бронировании может быть несколько пассажиров, а один билет может включать несколько перелётов. Билеты и рейсы связывает ticket_flights — самая большая таблица. Представления aircrafts, airports, flights_v и routes показывают те же данные в более удобном виде.

Сколько данных в таблицах:

ТаблицаСтрокЧто хранит
bookings262 788бронирования
tickets366 733билеты, по одному на пассажира
ticket_flights1 045 726перелёты, входящие в билеты
boarding_passes579 686посадочные талоны
flights33 121рейсы по расписанию и выполненные
airports_data104аэропорты
aircrafts_data9модели самолётов
seats1 339места в салонах самолётов

Структура таблиц

Нажмите на таблицу, чтобы увидеть её столбцы, пример строки и ключи.

Список таблиц

aircrafts_data - таблица самолетов.
  • aircraft_codeУникальный код для каждого самолета
  • modelНазвание модели самолета на английском и русском языках в формате JSON
  • rangeДальность полета самолета в километрах
aircraft_codemodelrange
1773{
"en": "Boeing 777-300",
"ru": "Боинг 777-300"
}
11100
  • PRIMARY KEY, btree (aircraft_code)
airports_data - таблица аэропортов.
  • airport_codeУникальный код для каждого аэропорта
  • airport_nameНазвание аэропорта на английском и русском языках в формате JSON
  • cityГород аэропорта на английском и русском языках в формате JSON
  • coordinatesКоординаты аэропорта в виде POINT(долгота, широта)
  • timezoneНазвание часового пояса аэропорта
airport_codeairport_namecitycoordinatestimezone
1YKS{
"en": "Yakutsk Airport",
"ru": "Якутск"
}
{
"en": "Yakutsk",
"ru": "Якутск"
}
(129.77099609375,62.0932998657227)Asia/Yakutsk
  • PRIMARY KEY, btree (airport_code)
boarding_passes - посадочные талоны.
  • ticket_noНомер билета
  • flight_idИдентификатор рейса
  • boarding_noНомер посадочного талона
  • seat_noНомер места
ticket_noflight_idboarding_noseat_no
100054352123513062512D
  • 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)
bookings - бронирования билетов.
  • book_refНомер бронирования
  • book_dateДата бронирования
  • total_amountОбщая стоимость бронирования
book_refbook_datetotal_amount
100000F2017-07-05 00:12:00+00265700.00
  • PRIMARY KEY, btree (book_ref)
flights - таблица полётов.
  • flight_idИдентификатор рейса
  • flight_noНомер рейса
  • scheduled_departureЗапланированное время отправления
  • scheduled_arrivalЗапланированное время прибытия
  • departure_airportАэропорт вылета
  • arrival_airportАэропорт прибытия
  • statusСтатус рейса
  • aircraft_codeКод самолета, IATA
  • actual_departureФактическое время отправления
  • actual_arrivalФактическое время прибытия
flight_idflight_noscheduled_departurescheduled_arrivaldeparture_airportarrival_airportstatusaircraft_codeactual_departureactual_arrival
11185PG01342017-09-10 06:50:00+002017-09-10 11:55:00+00DMEBTKScheduled319
  • PRIMARY KEY, btree (flight_id)
  • UNIQUE CONSTRAINT, btree (flight_no, scheduled_departure)
seats - таблица мест в самолетах.
  • aircraft_codeКод самолета, IATA
  • seat_noНомер места
  • fare_conditionsКласс путешествия
aircraft_codeseat_nofare_conditions
13192ABusiness
  • PRIMARY KEY, btree (aircraft_code, seat_no)
  • FOREIGN KEY (aircraft_code) REFERENCES aircrafts(aircraft_code) ON DELETE CASCADE
ticket_flights - привязка билетов к рейсам.
  • ticket_noНомер билета
  • flight_idИдентификатор рейса
  • fare_conditionsКласс путешествия
  • amountСтоимость поездки
ticket_noflight_idfare_conditionsamount
1000543215977630625Business42100.00
  • PRIMARY KEY, btree (ticket_no, flight_id)
  • FOREIGN KEY (flight_id) REFERENCES flights(flight_id)
  • FOREIGN KEY (ticket_no) REFERENCES tickets(ticket_no)
tickets - таблица билетов.
  • ticket_noНомер билета
  • book_refНомер бронирования
  • passenger_idИдентификатор пассажира
  • passenger_nameИмя пассажира
  • contact_dataКонтактная информация пассажира
ticket_nobook_refpassenger_idpassenger_namecontact_data
1000543200098706B0468149 604011VALERIY 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_nopassenger_namebook_datetotal_amount
0005432000987VALERIY TIKHONOV2017-07-05 17:19:00+0012400.00
0005432000988EVGENIYA ALEKSEEVA2017-07-05 17:19:00+0012400.00
0005432000989ARTUR GERASIMOV2017-06-28 22:55:00+0024700.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_nodeparture_airportarrival_airportaircraft
PG0405DMELEDAirbus A321-200
PG0404DMELEDAirbus A321-200
PG0405DMELEDAirbus 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_noflight_nofare_conditionsamountseat_no
0005432000987PG0242Economy6200.007A
0005432000988PG0242Economy6200.0010E
0005432000989PG0242Economy6200.0018E

SQL-задачи по темам

Задач на базе Bookings: 52 — от простых выборок до аналитики по миллиону строк. Решение проверяется автоматически на настоящем PostgreSQL. Число справа — количество задач в теме, цветные метки — диапазон сложности.

С чего начать

Первые задачи по базе Bookings:

  1. Получить данные аэропортов
  2. Список аэропортов
  3. Дальнемагистральные самолеты
  4. Список самолетов Boeing
  5. Список рейсов из Домодедово
  6. Список самолётов из Домодедово
  7. Получить бронирования по дате
  8. Анализ использования самолётов
  9. Типы тарифов
  10. Самолеты без Бизнес-класса

Все задачи по Bookings →

Частые вопросы

Нужно ли устанавливать PostgreSQL, чтобы работать с Bookings?

Нет. Задачи и песочница на SQLtest.online выполняют запросы на сервере, достаточно браузера. В песочнице Bookings доступна в PostgreSQL 18.

Где скачать демобазу Bookings?

Postgres Professional публикует её на своём сайте в нескольких размерах вместе с описанием схемы.

Почему некоторые названия в фигурных скобках?

Названия аэропортов, городов и самолётов — это JSONB-объекты с английским и русским значениями. Чтобы получить текст на одном языке, используйте ->> 'ru' или обращайтесь к представлениям.