M.4. Объекты схемы #
- M.4.1. Список отношений
- M.4.2. Представление
bookings.airplanes- M.4.3. Таблица
bookings.airplanes_data- M.4.4. Представление
bookings.airports- M.4.5. Таблица
bookings.airports_data- M.4.6. Таблица
bookings.boarding_passes- M.4.7. Таблица
bookings.bookings- M.4.8. Таблица
bookings.flights- M.4.9. Представление
bookings.routes- M.4.10. Таблица
bookings.seats- M.4.11. Таблица
bookings.segments- M.4.12. Таблица
bookings.tickets- M.4.13. Представление
bookings.timetable- M.4.14. Функция
bookings.now- M.4.15. Функция
bookings.version- M.4.16. Функция
bookings.lang - M.4.2. Представление
M.4.1. Список отношений #
Имя | Тип | Описание
----------------------------+---------------+-------------------------
airplanes | представление | Самолёты
airplanes_data | таблица | Самолёты (переводы)
airports | представление | Аэропорты
airports_data | таблица | Аэропорты (переводы)
boarding_passes | таблица | Посадочные талоны
bookings | таблица | Бронирования
flights | таблица | Рейсы
flights_flight_id_seq | последовательность | Рейсы
routes | таблица | Маршруты
seats | таблица | Места
segments | таблица | Рейсы
ticket | таблица | Билеты
timetable | представление | Расписание
При подключении к базе данных значение параметра search_path устанавливается в bookings,"$user",public, что указывает, что имя схемы не требуется, за исключением работы с функциями bookings.now и bookings.version.
M.4.2. Представление bookings.airplanes #
Каждая модель самолёта идентифицируется своим трёхзначным кодом (airplane_code). Указывается также название модели самолёта (model), максимальная дальность полёта в километрах (range) и крейсерская скорость в километрах в час (speed).
Значение поля model определяется в зависимости от выбранного языка. За подробностями обратитесь к Подразделу M.4.16.
Столбец | Тип | Модификаторы | Описание
---------------+---------+--------------+-----------------------------------
airplane_code | char(3) | not null | Код самолёта, IATA
model | text | not null | Модель самолёта
range | integer | not null | Максимальная дальность полёта, км
speed | integer | not null | Крейсерская скорость, км/час
Определение представления:
SELECT airplane_code,
model ->> lang() AS model,
range,
speed
FROM airplanes_data ml;
M.4.3. Таблица bookings.airplanes_data #
Это базовая таблица для представления airplanes. Поле model этой таблицы содержит переводы моделей самолётов на разные языки в формате JSONB. В большинстве случаев к этой таблице не следует обращаться напрямую.
Столбец | Тип | Модификаторы | Описание
---------------+---------+--------------+-----------------------------------
aircraft_code | char(3) | not null | Код самолёта, IATA
model | jsonb | not null | Модель самолёта
range | integer | not null | Максимальная дальность полёта, км
speed | integer | not null | Крейсерская скорость, км/ч
Индексы:
PRIMARY KEY, btree (aircraft_code)
Ограничения-проверки:
CHECK (range > 0)
CHECK (speed > 0)
Ссылки извне:
TABLE "routes" FOREIGN KEY (airplane_code)
REFERENCES airplanes_data(airplane_code)
TABLE "seats" FOREIGN KEY (airplane_code)
REFERENCES airplanes_data(airplane_code) ON DELETE CASCADE
M.4.4. Представление bookings.airports #
Аэропорт идентифицируется трехбуквенным кодом (airport_code) и имеет своё имя (airport_name).
Для города или страны не предусмотрено отдельной сущности, но введены поля с названием города (city) и страны (country), позволяющие найти аэропорты одного города или страны. Это представление также включает координаты аэропорта (coordinates) и часовой пояс (timezone).
Значения полей airport_name, city и country определяются в зависимости от выбранного языка. За подробностями обратитесь к Подразделу M.4.16.
Столбец | Тип | Модификаторы | Описание
--------------+---------+--------------+--------------------------------------------
airport_code | char(3) | not null | Код аэропорта, IATA
airport_name | text | not null | Название аэропорта
city | text | not null | Город
country | text | not null | Страна
coordinates | point | not null | Координаты аэропорта (долгота и широта)
timezone | text | not null | Часовой пояс аэропорта
Определение представления:
SELECT airport_code,
airport_name ->> lang() AS airport_name,
city ->> lang() AS city,
country ->> lang() AS country,
coordinates,
timezone
FROM airports_data ml;
M.4.5. Таблица bookings.airports_data #
Это базовая таблица для представления airports. Она содержит переводы значений airport_name, city и country на разные языки в формате JSONB. В большинстве случаев к этой таблице не следует обращаться напрямую.
Столбец | Тип | Модификаторы | Описание
--------------+---------+--------------+--------------------------------------------
airport_code | char(3) | not null | Код аэропорта, IATA
airport_name | jsonb | not null | Название аэропорта
city | jsonb | not null | Город
country | jsonb | not null | Страна
coordinates | point | not null | Координаты аэропорта (долгота и широта)
timezone | text | not null | Часовой пояс аэропорта
Индексы:
PRIMARY KEY, btree (airport_code)
Ссылки извне:
TABLE "routes" FOREIGN KEY (arrival_airport)
REFERENCES airports_data(airport_code)
TABLE "routes" FOREIGN KEY (departure_airport)
REFERENCES airports_data(airport_code)
M.4.6. Таблица bookings.boarding_passes #
При регистрации на первый рейс, которая открывается за сутки до плановой даты отправления, пассажиру выдаются посадочные талоны на все рейсы в билете. В посадочном талоне указан номер места (seat_no). Посадочный талон идентифицируется так же, как и перелёт, — номером билета и номером рейса.
Посадочным талонам присваиваются последовательные номера (boarding_no) в порядке регистрации пассажиров на рейс (этот номер будет уникальным только в пределах данного рейса). В посадочном талоне указывается время посадки (boarding_time).
Столбец | Тип | Модификаторы | Описание
-------------+------------+--------------+--------------------------
ticket_no | text | not null | Номер билета
flight_id | integer | not null | Идентификатор рейса
seat_no | text | not null | Номер места
boarding_no | integer | not null | Номер посадочного талона
boarding_time | timestamptz| not null | Время посадки
Индексы:
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_flighsegments(ticket_no, flight_id)
M.4.7. Таблица bookings.bookings #
Продажа билетов начинается за 60 дней до вылета рейса. Пассажир заранее бронирует билет себе и, возможно, нескольким другим пассажирам (book_date). Бронирование идентифицируется номером (book_ref, шестизначная комбинация букв и цифр).
Поле total_amount хранит общую стоимость включённых в бронирование перелетов всех пассажиров.
Столбец | Тип | Модификаторы | Описание
--------------+---------------+--------------+---------------------------
book_ref | char(6) | not null | Номер бронирования
book_date | timestamptz | not null | Дата бронирования
total_amount | numeric(10,2) | not null | Полная сумма бронирования
Индексы:
PRIMARY KEY, btree (book_ref)
Ссылки извне:
TABLE "tickets" FOREIGN KEY (book_ref) REFERENCES bookings(book_ref)
M.4.8. Таблица bookings.flights #
Естественный ключ таблицы рейсов (bookings.flights) состоит из двух полей — номера маршрута (route_no) и даты отправления (scheduled_departure). Чтобы сделать внешние ключи на эту таблицу компактнее, в качестве первичного используется суррогатный ключ (flight_id).
У каждого рейса есть запланированные дата и время оправления (scheduled_departure) и прибытия (scheduled_arrival). Реальные время отправления (actual_departure) и прибытия (actual_arrival) могут отличаться: обычно не сильно, но иногда и на несколько часов, если рейс задержан.
Статус рейса (status) может принимать одно из следующих значений:
-
Scheduled Рейс доступен для бронирования. Это происходит за 60 дней до плановой даты отправления; до этого запись о рейсе не существует в базе данных.
-
On Time Рейс доступен для регистрации (за сутки до плановой даты отправления) и не задержан.
-
Delayed Рейс доступен для регистрации (за сутки до плановой даты отправления), но задержан.
-
Посадка Идёт посадка.
-
Departed Самолёт уже вылетел и находится в воздухе.
-
Arrived Самолёт прибыл в пункт назначения.
-
Cancelled Рейс отменён.
Столбец | Тип | Модификаторы | Описание
---------------------+-------------+--------------+-----------------------------
flight_id | integer | not null | Идентификатор рейса
route_no | text | not null | Номер маршрута
status | text | not null | Статус рейса
scheduled_departure | timestamptz | not null | Время вылета по расписанию
scheduled_arrival | timestamptz | not null | Время прилёта по расписания
actual_departure | timestamptz | | Фактическое время вылета
actual_arrival | timestamptz | | Фактическое время прилёта
Индексы:
PRIMARY KEY, btree (flight_id)
UNIQUE CONSTRAINT, btree (route_no, scheduled_departure)
Ограничения-проверки:
CHECK (scheduled_arrival > scheduled_departure)
CHECK (actual_arrival IS NULL
OR ((actual_departure IS NOT NULL AND actual_arrival IS NOT NULL)
AND (actual_arrival > actual_departure)))
CHECK (status IN ( 'Scheduled', 'On Time', 'Delayed', 'Boarding',
'Departed', 'Arrived', 'Cancelled'))
Ссылки извне:
TABLE "segments" FOREIGN KEY (flight_id)
REFERENCES flights(flight_id)
M.4.9. Представление bookings.routes #
Маршрут всегда соединяет две точки — аэропорты отправления (departure_airport) и назначения (arrival_airport). Такое понятие, как «маршрут с пересадками», отсутствует: если из одного аэропорта до другого нет прямого рейса, в билет просто включаются несколько необходимых перелётов.
Срок действия маршрута (validity) — один месяц. Один и тот же маршрут может использоваться несколько раз между одними и теми же аэропортами с одинаковым номером маршрута (route_no), но разными самолётами и датами отправления.
Рейсы, следующие по этому маршруту, обслуживаются определённой моделью самолёта (airplane_code) и вылетают в одно и то же время (scheduled_time, местное время аэропорта отправления) в разные дни недели (массив days_of_week, где 1 — понедельник, а 7 — воскресенье).
Столбец | Тип | | Описание
--------------------+-------------+-------------------+-----------------------------
route_no | text | not null | Номер маршрута
validity | tstzrange | not null | Интервал действия
departure_airport | char(3) | not null | Код аэропорта вылета
arrival_airport | char(3) | not null | Код аэропорта прилёта
airplane_code | char(3) | not null | Код самолёта, IATA
days_of_week | integer[] | not null | Дни недели, по которым совершаются рейсы
scheduled_time | time | not null | Местное время вылета по расписанию
duration | interval | not null | Длительность полёта
Индексы:
btree (departure_airport, lower(validity))
EXCLUDE USING gist (route_no WITH =, validity WITH &&)
Ограничения внешних ключей:
FOREIGN KEY (airplane_code) REFERENCES airplanes_data(airplane_code)
FOREIGN KEY (arrival_airport) REFERENCES airports_data(airport_code)
FOREIGN KEY (departure_airport) REFERENCES airports_data(airport_code)
M.4.10. Таблица bookings.seats #
Места определяют схему салона каждой модели. Каждое место определяется своим номером (seat_no) и имеет закреплённый за ним класс обслуживания (fare_conditions) — Economy, Comfort или Business.
Столбец | Тип | Модификаторы | Описание
-----------------+-------------+--------------+--------------------
airplane_code | char(3) | not null | Код самолета, IATA
seat_no | text | not null | Номер места
fare_conditions | text | not null | Класс обслуживания
Индексы:
PRIMARY KEY, btree (airplane_code, seat_no)
Ограничения-проверки:
CHECK (fare_conditions IN ('Economy', 'Comfort', 'Business'))
Ограничения внешнего ключа:
FOREIGN KEY (airplane_code)
REFERENCES airplanes(airplane_code) ON DELETE CASCADE
M.4.11. Таблица bookings.segments #
Перелёт соединяет билет с рейсом и идентифицируется их номерами.
Для каждого перелёта указываются его стоимость (price) и класс обслуживания (fare_conditions).
Столбец | Тип | Модификаторы | Описание
-----------------+---------------+--------------+---------------------
ticket_no | text | not null | Номер билета
flight_id | integer | not null | Идентификатор рейса
fare_conditions | text | not null | Класс обслуживания
price | numeric(10,2) | not null | Стоимость перелёта
Индексы:
PRIMARY KEY, btree (ticket_no, flight_id)
btree (flight_id)
Ограничения-проверки:
CHECK (price >= 0)
CHECK (fare_conditions IN ('Economy', 'Comfort', 'Business'))
Ограничения внешнего ключа:
FOREIGN KEY (flight_id) REFERENCES flights(flight_id)
FOREIGN KEY (ticket_no) REFERENCES tickets(ticket_no)
Ссылки извне:
TABLE "boarding_passes" FOREIGN KEY (ticket_no, flight_id)
REFERENCES segments(ticket_no, flight_id)
M.4.12. Таблица bookings.tickets #
Билет имеет уникальный номер (ticket_no), состоящий из 13 цифр.
Билет содержит идентификатор пассажира (passenger_id) — номер документа, удостоверяющего личность, в зависимости от кода страны и цифрового идентификатора, и его имя и фамилию (passenger_name), указанные в этом порядке.
Гарантируется, что один passenger_id всегда соответствует одному passenger_name. Пассажира нельзя добавить в бронирование несколько раз, и у него не может быть пересекающихся рейсов, хотя последнее и не проверяется схемой базы данных.
В поле outbound указано значение true для прямых рейсов и значение false для обратных рейсов. Конечные точки прямых и обратных рейсов одинаковые, хотя маршруты могут отличаться.
Столбец | Тип | Модификаторы | Описание
----------------+-------------+--------------+-----------------------------
ticket_no | text | not null | Номер билета
book_ref | char(6) | not null | Номер бронирования
passenger_id | text | not null | Идентификатор пассажира
passenger_name | text | not null | Имя пассажира
outbound | boolean | not null | Является ли рейс прямым
Индексы:
PRIMARY KEY, btree (ticket_no)
UNIQUE CONSTRAINT, btree (book_ref, passenger_id, outbound)
Ограничения внешних ключей:
FOREIGN KEY (book_ref) REFERENCES bookings(book_ref)
Ссылки извне:
TABLE "segments" FOREIGN KEY (ticket_no) REFERENCES tickets(ticket_no)
M.4.13. Представление bookings.timetable #
Существует представление timetable поверх таблиц flights и routes. Обратите внимание, что использование этого представления, хотя и упрощает многие запросы, может снизить производительность из-за избыточных соединений с таблицами airports.
Столбец | Тип | Описание
---------------------------+-------------+--------------------------------------
flight_id | integer | Идентификатор рейса
route_no | text | Номер маршрута
departure_airport | char(3) | Код аэропорта вылета
arrival_airport | char(3) | Код аэропорта прилёта
status | text | Статус рейса
airplane_code | char(3) | Код самолёта, IATA
scheduled_departure | timestamptz | Время вылета по расписанию
scheduled_departure_local | timestamp | Время вылета по расписанию,
| | местное время в точке вылета
actual_departure | timestamptz | Фактическое время вылета
actual_departure_local | timestamp | Фактическое время вылета,
| | местное время в точке вылета
scheduled_arrival | timestamptz | Время прилёта по расписанию
scheduled_arrival_local | timestamp | Время прилёта по расписанию,
| | местное время в точке прилёта
actual_arrival | timestamptz | Фактическое время прилёта
actual_arrival_local | timestamp | Фактическое время прилёта,
| | местное время в точке прилёта
Определение представления:
SELECT f.flight_id,
f.route_no,
r.departure_airport,
r.arrival_airport,
f.status,
r.airplane_code,
f.scheduled_departure,
(f.scheduled_departure AT TIME ZONE dep.timezone) AS scheduled_departure_local,
f.actual_departure,
(f.actual_departure AT TIME ZONE dep.timezone) AS actual_departure_local,
f.scheduled_arrival,
(f.scheduled_arrival AT TIME ZONE arr.timezone) AS scheduled_arrival_local,
f.actual_arrival,
(f.actual_arrival AT TIME ZONE arr.timezone) AS actual_arrival_local
FROM flights f
JOIN routes r ON r.flight_no = f.flight_no AND r.validity @> f.scheduled_departure
JOIN airports_data dep ON dep.airport_code = r.departure_airport
JOIN airports_data arr ON arr.airport_code = r.arrival_airport;
M.4.14. Функция bookings.now #
Демонстрационная база содержит временной срез данных — так, как будто в некоторый момент была сделана резервная копия реальной системы. Например, если некоторый рейс имеет статус Departed, это означает, что в момент резервного копирования самолёт вылетел и находился в воздухе.
Позиция среза сохранена в функции bookings.now() function. Ей можно пользоваться в запросах там, где в реальной базе данных использовалась бы функция now().
M.4.15. Функция bookings.version #
Функция bookings.version возвращает версию демонстрационной базы данных. Версия состоит из имени виртуальной авиакомпании и даты первого рейса за указанный интервал времени. Последняя версия — PostgresPro 2025-09-01.
M.4.16. Функция bookings.lang #
Некоторые поля в демонстрационной базе содержат текст на английском и русском языках. Функция bookings.lang возвращает значение параметра bookings.lang, то есть язык, на котором будут отображаться значения этих полей.
Эта функция используется в представлениях airplanes и airports и не предназначена для непосредственного использования в запросах.