M.4. Объекты схемы

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