N.3. Описание схемы #
Основной сущностью является бронирование (bookings).
В одно бронирование можно включить несколько пассажиров, каждому из которых выписывается отдельный билет (tickets) для перелёта в одну сторону и отдельный обратный билет, если билеты приобретаются «туда-обратно». Билет имеет уникальный номер и содержит информацию о пассажире. Для пассажира не предусмотрено отдельной сущности, однако номер документа является уникальным идентификатором пассажира.
Билет включает один или несколько перелётов (segments). Несколько перелётов могут включаться в билет в случаях, когда нет прямого рейса, соединяющего пункты отправления и назначения (полёт с пересадками). В схеме базы данных нет жёсткого ограничения, но предполагается, что все билеты в одном бронировании имеют одинаковый набор перелётов.
Каждый маршрут (routes) проложен от одного аэропорта (airports) к другому. Рейсы (flights) с одинаковым номером маршрута имеют одинаковые точки отправления и назначения, но отличаются датой отправления. Маршрутная сеть обновляется ежемесячно, таким образом рейсы и маршруты связаны темпоральным внешним ключом. При выполнении соединений учитывайте не только номер маршрута, но и дату отправления — она должна находиться в рамках периода действия маршрута. Для упрощения запросов используйте представление timetable, где такое соединение скрыто.
Все перелёты считаются стыковочными: при регистрации на первый рейс пассажиру выдаются посадочные талоны (boarding_passes) на все рейсы в билете, в котором указано место в самолёте и время посадки. Пассажир может зарегистрироваться только на тот рейс, который есть у него в билете. Комбинация рейса и места в самолёте уникальна, чтобы не допустить выдачу двух посадочных талонов на одно место.
Количество мест (seats) в самолёте и их распределение по классам обслуживания зависит от модели самолёта (aircrafts), выполняющего рейс. Предполагается, что каждая модель самолёта имеет только одну компоновку салона. Схема базы данных не контролирует, что места в посадочных талонах соответствуют имеющимся в самолёте (такая проверка может быть сделана с использованием табличных триггеров или в приложении).
N.3. Schema Description #
The main entity is a booking (bookings).
One booking can include several passengers, with a separate ticket (tickets) issued to each passenger for one-way trip and a separate return ticket for the round trip. A ticket has a unique number and includes information about the passenger. As such, a passenger is not a separate entity, nevertheless the document number uniquely identifies the passenger.
The ticket includes one or more flight segments (segments). Several flight segments can be included into a single ticket if there are no non-stop flights between the points of departure and destination (connecting flights). Although there is no constraint in the schema, it is assumed that all tickets in the booking have the same flight segments.
Each route (routes) goes from one airport (airports) to another. Flights (flights) with the same route number have the same points of departure and destination, but differ in departure date. The routing map is updated once per month, therefore the flights and routes are linked with the temporal foreign key. When joining, mind not only the route number, but also the departure time that must fit within the route validity period. To simplify your queries, use the timetable view that hides this join.
All flights are connecting flights: at the first flight check-in, the passenger is issued boarding passes (boarding_passes), for all flights in his ticket, where the seat number and boarding time are specified. The passenger can check in for the flight only if this flight is included into the ticket. The flight-seat combination must be unique to avoid issuing two boarding passes for the same seat.
The number of seats (seats) in the airplane and their distribution between different travel classes depends on the model of the airplane (airplanes) performing the flight. It is assumed that every airplane model has only one cabin configuration. Database schema does not check that seat numbers in boarding passes have the corresponding seats in the airplane (such verification can be done using table triggers, or at the application level).