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.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 и не предназначена для непосредственного использования в запросах.