ÐемонÑÑÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð±Ð°Ð·Ð° даннÑÑ

ÐÑедÑÑавлÑем вам демонÑÑÑаÑионнÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð¡Ð£ÐÐ PostgreSQL. РкаÑеÑÑве пÑедмеÑной облаÑÑи Ð¼Ñ Ð¸ÑполÑзÑем авиапеÑевозки.
Ðаза даннÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ, напÑимеÑ,
- Ð´Ð»Ñ ÑамоÑÑоÑÑелÑного изÑÑÐµÐ½Ð¸Ñ ÑзÑка запÑоÑов SQL,
- Ð´Ð»Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовки книг, поÑобий и ÑÑебнÑÑ ÐºÑÑÑов по ÑзÑÐºÑ SQL,
- Ð´Ð»Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑии возможноÑÑей PostgreSQL в ÑÑаÑÑÑÑ Ð¸ замеÑÐºÐ°Ñ .
ÐÑи ÑазÑабоÑке демонÑÑÑаÑионной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¼Ñ Ð¿ÑеÑледовали неÑколÑко Ñелей:
- ÑÑ ÐµÐ¼Ð° даннÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑой, ÑÑÐ¾Ð±Ñ Ð±ÑÑÑ Ð¿Ð¾Ð½ÑÑной без оÑобÑÑ Ð¿Ð¾ÑÑнений,
- в Ñо же вÑÐµÐ¼Ñ ÑÑ ÐµÐ¼Ð° даннÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð´Ð¾ÑÑаÑоÑно Ñложной, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ ÑÑÑоиÑÑ Ð¾ÑмÑÑленнÑе запÑоÑÑ,
- база даннÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð° даннÑми, напоминаÑÑими ÑеалÑнÑе, Ñ ÐºÐ¾ÑоÑÑми бÑÐ´ÐµÑ Ð¸Ð½ÑеÑеÑно ÑабоÑаÑÑ.
ÐемонÑÑÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð±Ð°Ð·Ð° даннÑÑ
ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð¿Ð¾Ð´ лиÑензией MIT.
Свои замеÑÐ°Ð½Ð¸Ñ Ð¸ Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð½Ð°Ð¿ÑавлÑйÑе нам по адÑеÑÑ [email protected].
ÐеÑÑÐ¸Ñ Ð¾Ñ 01.09.2025
УÑÑановка
ÐемонÑÑÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð±Ð°Ð·Ð° даннÑÑ Ð´Ð¾ÑÑÑпна в ÑеÑÑÑÑÑ Ð²ÐµÑÑиÑÑ , коÑоÑÑе оÑлиÑаÑÑÑÑ Ð¾Ð±ÑÑмом даннÑÑ :
- demo-20250901-3m.sql.gz (133 ÐбайÑ) â даннÑе по полÑÑам за ÑÑи меÑÑÑа (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 1,3 ÐбайÑ),
- demo-20250901-6m.sql.gz (276 ÐÐ) â даннÑе по полÑÑам за ÑеÑÑÑ Ð¼ÐµÑÑÑев (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 2,7 ÐбайÑ),
- demo-20250901-1y.sql.gz (558 ÐбайÑ) â даннÑе по полÑÑам за год (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 5,4 ÐбайÑ).
- demo-20250901-2y.sql.gz (1137 ÐбайÑ) â даннÑе по полÑÑам за два года (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 11 ÐбайÑ).
ÐеболÑÑÐ°Ñ Ð±Ð°Ð·Ð° годиÑÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ð¸ÑаÑÑ Ð·Ð°Ð¿ÑоÑÑ, и пÑи ÑÑом не займÑÑ Ð¼Ð½Ð¾Ð³Ð¾ меÑÑа на диÑке. Ðаза болÑÑого ÑазмеÑа Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¿Ð¾ÑÑвÑÑвоваÑÑ, как ведÑÑ ÑÐµÐ±Ñ Ð·Ð°Ð¿ÑоÑÑ Ð½Ð° болÑÑÐ¸Ñ Ð¾Ð±ÑÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ , и задÑмаÑÑÑÑ Ð¾Ð± опÑимизаÑии.
Ð¤Ð°Ð¹Ð»Ñ ÑодеÑÐ¶Ð°Ñ SQL-ÑкÑипÑ, ÑоздаÑÑий Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
demo и наполнÑÑÑий ÐµÑ Ð´Ð°Ð½Ð½Ñми (ÑакÑиÑеÑки, ÑÑо ÑезеÑÐ²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ ÑÑилиÑой pg_dump). ÐладелÑÑем Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
demo ÑÑÐ°Ð½ÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¡Ð£ÐÐ, вÑполнÑвÑий ÑкÑипÑ. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, запÑÑÑиÑе ÑкÑÐ¸Ð¿Ñ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ полÑзоваÑÐµÐ»Ñ postgres в пÑогÑамме psql:
gunzip -c demo-20250901-3m.sql.gz | psql -U postgres
ÐбÑаÑиÑе внимание, ÑÑо еÑли база даннÑÑ
demo Ñже ÑÑÑеÑÑвÑеÑ, она бÑÐ´ÐµÑ Ñдалена и Ñоздана заново!
ÐинималÑÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑÑиÑ â PostgreSQL 15.
СоздаÑÑ ÑобÑÑвеннÑй ваÑÐ¸Ð°Ð½Ñ Ð´ÐµÐ¼Ð¾Ð±Ð°Ð·Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð³ÐµÐ½ÐµÑаÑоÑа.
ÐÑлиÑÐ¸Ñ Ð¾Ñ Ð¿ÑедÑдÑÑей веÑÑии
- ÐаÑÑÑÑÑÐ½Ð°Ñ ÑеÑÑ ÑаÑÑиÑена на 17 ÑÑÑан: РоÑÑиÑ, ÐиÑай, ÐндиÑ, СШÐ, Ðанада, ЯпониÑ, ФÑанÑиÑ, ÐеÑманиÑ, ÐÑалиÑ, ÐеликобÑиÑаниÑ, Чили, ШвеÑиÑ, Ðепал, ФинлÑндиÑ, ÐÐ¾Ð²Ð°Ñ ÐеландиÑ, ÐвÑÑÑÐ¸Ñ Ð¸ Ð§ÐµÑ Ð¸Ñ. Ð ÑÑÐ¾Ñ ÑпиÑок воÑли ÑÑÑÐ°Ð½Ñ Ð²ÐµÐ´ÑÑÐ¸Ñ ÑазÑабоÑÑиков PostgreSQL, а Ñакже неÑколÑко дÑÑÐ³Ð¸Ñ ÑÑÑан, имеÑÑÐ¸Ñ Ð¾Ð¿Ñеделенное оÑноÑение к PostgreSQL.
- ÐолиÑеÑÑво аÑÑопоÑÑов в ÑаблиÑе
airports_dataÑвелиÑено до пÑимеÑно 5500. РмаÑÑÑÑÑной ÑеÑи ÑÑаÑÑвÑÐµÑ Ð¼ÐµÐ½ÐµÐµ ÑоÑни аÑÑопоÑÑов, но болÑÑое колиÑеÑÑво ÑÑÑок в ÑаблиÑе позволÑÐµÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑиÑоваÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑование ÑоÑек меÑодами GiST и SP-GiST. - Ð ÑаблиÑÑ
airports_dataдобавлена ÑÑÑана: ÑÑолбеÑcountryÑипаjsonbÑ Ð¿ÐµÑеводами, аналогиÑноairport_nameиcity. ÐÑделÑного ÑпÑавоÑника ÑÑÑан в демобазе неÑ. - ТаблиÑа
aircraftsпеÑеименована вairplanes. ÐÑежнее название бÑло неÑдаÑнÑм, поÑколÑÐºÑ Ð² английÑком ÑзÑке Ñлово aircraft не менÑеÑÑÑ Ð²Ð¾ множеÑÑвенном ÑиÑле. - ÐзменилÑÑ Ð°Ð²Ð¸Ð°Ð¿Ð°Ñк: иÑполÑзÑÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ новÑе и более кÑÑпнÑе ÑамолÑÑÑ. Ðз деÑÑÑи моделей две ÑвлÑÑÑÑÑ Ð³ÑÑзовÑми и не ÑÑаÑÑвÑÑÑ Ð² паÑÑажиÑÑÐºÐ¸Ñ Ð°Ð²Ð¸Ð°Ð¿ÐµÑÐµÐ²Ð¾Ð·ÐºÐ°Ñ .
- Ðз ÑаблиÑÑ
ticketsÑбÑан ÑÑолбеÑcontact_info, поÑколÑÐºÑ ÐµÐ³Ð¾ пÑоÑÑÐ°Ñ ÑÑÑÑкÑÑÑа не позволÑла демонÑÑÑиÑоваÑÑ ÑÑедÑÑва ÑабоÑÑ Ñ JSON. РазнообÑазнÑй JSON можно полÑÑиÑÑ, напÑимеÑ, агÑегаÑией бÑониÑований Ñо вложеннÑми билеÑами и пеÑелеÑами. - ÐÐ¾Ð¼ÐµÑ Ð´Ð¾ÐºÑменÑа
tickets.passenger_idоднознаÑно опÑеделÑÐµÑ Ð¿Ð°ÑÑажиÑа (Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð½Ð¾Ð¼ÐµÑÑ Ð´Ð¾ÐºÑменÑа вÑегда ÑооÑвеÑÑÑвÑÐµÑ Ð¾Ð´Ð½Ð¾ и Ñо же имÑpassenger_name, Ñ Ð¾ÑÑ Ð² ÑазнÑÑ Ð´Ð¾ÐºÑменÑÐ°Ñ Ð¸Ð¼ÐµÐ½Ð°, конеÑно, могÑÑ ÑовпадаÑÑ). Рдополнение к ÑиÑÑам Ð½Ð¾Ð¼ÐµÑ Ð´Ð¾ÐºÑменÑа ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð´ ÑÑÑанÑ. - РегиÑÑÑаÑÐ¸Ñ Ð²ÑполнÑеÑÑÑ ÑолÑко на пеÑвÑй ÑÐµÐ¹Ñ Ð² билеÑе. ÐÑи ÑÑом вÑдаÑÑÑÑ Ð¿Ð¾ÑадоÑнÑе ÑÐ°Ð»Ð¾Ð½Ñ ÑÑÐ°Ð·Ñ Ð½Ð° вÑе Ð²Ñ Ð¾Ð´ÑÑие в Ð±Ð¸Ð»ÐµÑ ÑейÑÑ.
- Ðа обÑаÑнÑй ÑÐµÐ¹Ñ Ð¿Ð°ÑÑажиÑÑ Ð²ÑдаеÑÑÑ Ð¾ÑделÑнÑй билеÑ. ÐÑÑмÑе ÑейÑÑ Ð¾ÑмеÑÐµÐ½Ñ Ð² ÑÑолбÑе
tickets.outboundÑипаbooleanзнаÑениемtrue, а обÑаÑнÑе âfalse. Ð ÑаблиÑÑticketsдобавлено огÑаниÑение ÑникалÑноÑÑи на ÑÑолбÑÑbook_ref,passenger_idиoutbound(на одного паÑÑажиÑа можно забÑониÑоваÑÑ ÑолÑко два билеÑа â пÑÑмой и обÑаÑнÑй). - ТаблиÑа
ticket_flightsпеÑеименована вsegments, а ÑÑолбеÑamount â в более ÑоÑноеprice. - ЧиÑло пеÑеÑадок огÑаниÑено ÑеÑÑÑÑмÑ.
- ÐÑедÑÑавление
routesÑÑало полноÑенной ÑаблиÑей, опÑеделÑÑÑей маÑÑÑÑÑÑ. ÐаÑÑÑÑÑÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ñо вÑеменем, поÑÑÐ¾Ð¼Ñ Ð¿ÐµÑвиÑнÑй клÑÑ ÑвлÑеÑÑÑ ÑемпоÑалÑнÑм. Ðго ÑоÑÑавлÑÑÑ Ð½Ð¾Ð¼ÐµÑ Ð¼Ð°ÑÑÑÑÑаroute_no(Ñанее назÑвавÑийÑÑ Ð½Ð¾Ð¼ÐµÑом ÑейÑаflight_no) и инÑеÑвал дейÑÑвиÑvalidity. ÐлÑÑ Ñеализован огÑаниÑением-иÑклÑÑением (полноÑÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑжка ÑемпоÑалÑнÑÑ ÐºÐ»ÑÑей поÑвиÑÑÑ Ð² PostgreSQL 18). - Ðз ÑаблиÑÑ
flightsв ÑаблиÑÑroutesпеÑенеÑÐµÐ½Ñ ÑÑолбÑÑdeparture_airport,arrival_airport,airplane_code. ТаблиÑÑ ÑоединÑÑÑÑÑ Ð¿Ð¾ ÑÑловиÑroutes.route_no = flights.route_no AND routes.validity @> flights.scheduled_departure. - СÑаÑÑÑ ÑейÑа
flights.statusпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½Ð¾Ð²Ð¾Ðµ знаÑениеBoardingво вÑÐµÐ¼Ñ Ð¿Ð¾Ñадки паÑÑажиÑов. - Ð ÑаблиÑÑ
boarding_passesдобавлен ÑÑолбеÑboarding_time â вÑÐµÐ¼Ñ Ð¿Ð¾Ñадки в ÑамолÑÑ. ÐмеÑÑе Ñо ÑÑолбÑомboarding_noÐ¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð½ÐµÐ¾Ð¿Ñеделенное знаÑение в пÑомежÑÑке Ð¼ÐµÐ¶Ð´Ñ ÑегиÑÑÑаÑией и поÑадкой на ÑейÑ. - Ðовое пÑедÑÑавление
timetableÑкÑÑÐ²Ð°ÐµÑ ÑемпоÑалÑное Ñоединениеroutesиflights, а Ñакже вÑÐ²Ð¾Ð´Ð¸Ñ Ð²ÑÐµÐ¼Ñ Ð² ÑаÑовом поÑÑе аÑÑопоÑÑов. ЧÑÐ¾Ð±Ñ Ð¾Ð±Ð»ÐµÐ³ÑиÑÑ Ð¿ÐµÑÐµÑ Ð¾Ð´ к новой веÑÑии демобазÑ, можно иÑполÑзоваÑÑ ÑÑо пÑедÑÑавление вмеÑÑо ÑÑаÑой ÑаблиÑÑflightsили ÑдалÑнного пÑедÑÑавлениÑflights_v. - Ð Ñд ÑÑолбÑов иÑполÑзÑÐµÑ Ñип
textвмеÑÑо ÑазлиÑнÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑийcharиvarchar: Ð½Ð¾Ð¼ÐµÑ Ð´Ð¾ÐºÑменÑаpassenger_id, ÑÑаÑÑÑ ÑейÑаstatus, Ð½Ð¾Ð¼ÐµÑ Ð¼Ð°ÑÑÑÑÑаroute_no, Ð½Ð¾Ð¼ÐµÑ Ð¼ÐµÑÑаseat_noи клаÑÑ Ð¾Ð±ÑлÑживаниÑfare_conditions. - ÐаÑÑажиÑÑ, опоздавÑие на ÑÑÑковоÑнÑй ÑÐµÐ¹Ñ (пÑибÑвÑие в аÑÑопоÑÑ Ð¼ÐµÐ½ÐµÐµ Ñем за 40 минÑÑ Ð´Ð¾ вÑлеÑа), не попадаÑÑ Ð½Ð¸ на ÑÑÐ¾Ñ ÑейÑ, ни на ÑледÑÑÑие ÑейÑÑ Ð² Ñом же билеÑе.
Ð¡Ñ ÐµÐ¼Ð° даннÑÑ

ÐÑновной ÑÑÑноÑÑÑÑ ÑвлÑеÑÑÑ Ð±ÑониÑование (bookings).
Родно бÑониÑование можно вклÑÑиÑÑ Ð½ÐµÑколÑко паÑÑажиÑов, ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¸Ð· коÑоÑÑÑ
вÑпиÑÑваеÑÑÑ Ð±Ð¸Ð»ÐµÑ (tickets) на Ð¿Ð¾ÐµÐ·Ð´ÐºÑ Ð² пÑÑмом напÑавлении, а Ñакже оÑделÑнÑй обÑаÑнÑй билеÑ, еÑли билеÑÑ Ð¿ÑиобÑеÑаÑÑÑÑ Â«ÑÑда и обÑаÑно». ÐÐ¸Ð»ÐµÑ Ð¸Ð¼ÐµÐµÑ ÑникалÑнÑй Ð½Ð¾Ð¼ÐµÑ Ð¸ ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ паÑÑажиÑе. ÐÐ»Ñ Ð¿Ð°ÑÑажиÑа Ð½ÐµÑ Ð¾ÑделÑной ÑÑÑноÑÑи, но можно ÑÑиÑаÑÑ, ÑÑо Ð½Ð¾Ð¼ÐµÑ Ð´Ð¾ÐºÑменÑа ÑникалÑно иденÑиÑиÑиÑÑÐµÑ Ð¿Ð°ÑÑажиÑа.
ÐÐ¸Ð»ÐµÑ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½ пеÑÐµÐ»ÐµÑ (segment), еÑли Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑнкÑами оÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ назнаÑÐµÐ½Ð¸Ñ ÐµÑÑÑ Ð¿ÑÑмой ÑейÑ, и неÑколÑко пеÑелеÑов, еÑли ÑÑебÑÑÑÑÑ Ð¿ÐµÑеÑадки. ÐÑе билеÑÑ Ð² одном бÑониÑовании имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй Ð½Ð°Ð±Ð¾Ñ Ð¿ÐµÑелеÑов, Ñ
оÑÑ Ð² ÑÑ
еме даннÑÑ
Ñакого огÑаниÑÐµÐ½Ð¸Ñ Ð½ÐµÑ.
ÐаÑÑÑÑÑÑ (routes) пÑÐ¾Ð»Ð¾Ð¶ÐµÐ½Ñ Ð¸Ð· одного аÑÑопоÑÑа (airports) в дÑÑгой. ÐаждÑй ÑÐµÐ¹Ñ (flights) ÑледÑÐµÑ Ð¿Ð¾ опÑÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð¾Ð¼Ñ Ð¼Ð°ÑÑÑÑÑÑ, Ñак ÑÑо ÑейÑÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ номеÑом маÑÑÑÑÑа имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе пÑнкÑÑ Ð²ÑлеÑа и назнаÑениÑ, но оÑлиÑаÑÑÑÑ Ð´Ð°Ñой оÑпÑавлениÑ.
ÐаÑÑÑÑÑÐ½Ð°Ñ ÑеÑÑ Ð¼ÐµÐ½ÑеÑÑÑ Ñаз в меÑÑÑ, поÑÑÐ¾Ð¼Ñ ÑейÑÑ Ð¸ маÑÑÑÑÑÑ ÑвÑÐ·Ð°Ð½Ñ ÑемпоÑалÑнÑм внеÑним клÑÑом: пÑи Ñоединении ÑледÑÐµÑ ÑÑиÑÑваÑÑ Ð½Ðµ ÑолÑко Ð½Ð¾Ð¼ÐµÑ Ð¼Ð°ÑÑÑÑÑа, но и ÑооÑвеÑÑÑвие вÑемени оÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑÐ²Ð°Ð»Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¼Ð°ÑÑÑÑÑа. ÐÐ»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов можно иÑполÑзоваÑÑ Ð¿ÑедÑÑавление timetable, ÑкÑÑваÑÑее Ñоединение ÑÑиÑ
ÑаблиÑ.
ÐÑе пеÑелеÑÑ ÑÑиÑаÑÑÑÑ ÑÑÑковоÑнÑми: паÑÑÐ°Ð¶Ð¸Ñ Ð¿ÑоÑ
Ð¾Ð´Ð¸Ñ ÑегиÑÑÑаÑÐ¸Ñ Ð½Ð° пеÑвÑй ÑÐµÐ¹Ñ Ð¸ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð¿Ð¾ÑадоÑнÑе ÑÐ°Ð»Ð¾Ð½Ñ (boarding_passes) на вÑе ÑейÑÑ Ð² Ñвоем билеÑе. РпоÑадоÑном Ñалоне Ñказано меÑÑо, а Ñакже ÑикÑиÑÑеÑÑÑ Ð²ÑÐµÐ¼Ñ Ð¿Ð¾Ñадки в ÑамолÑÑ. ÐаÑÑÐ°Ð¶Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÑегиÑÑÑиÑоваÑÑÑÑ ÑолÑко на ÑÐ¾Ñ ÑейÑ, коÑоÑÑй еÑÑÑ Ñ Ð½ÐµÐ³Ð¾ в билеÑе. ÐомбинаÑÐ¸Ñ ÑейÑа и меÑÑа в ÑамолÑÑе ÑникалÑна, ÑÑÐ¾Ð±Ñ Ð½Ðµ допÑÑÑиÑÑ Ð²ÑдаÑÑ Ð´Ð²ÑÑ
поÑадоÑнÑÑ
Ñалонов на одно меÑÑо.
ÐолиÑеÑÑво меÑÑ (seats) в ÑамолÑÑе и иÑ
ÑаÑпÑеделение по клаÑÑам обÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ ÑамолÑÑа (airplanes), вÑполнÑÑÑего ÑейÑ. ÐÑедполагаеÑÑÑ, ÑÑо ÐºÐ°Ð¶Ð´Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»Ñ ÑамолÑÑа Ð¸Ð¼ÐµÐµÑ ÑолÑко Ð¾Ð´Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½Ð¾Ð²ÐºÑ Ñалона. СÑ
ема даннÑÑ
не конÑÑолиÑÑеÑ, ÑÑо меÑÑа в поÑадоÑнÑÑ
ÑалонаÑ
ÑооÑвеÑÑÑвÑÑÑ Ð¸Ð¼ÐµÑÑимÑÑ Ð² ÑамолÑÑе (ÑÐ°ÐºÐ°Ñ Ð¿ÑовеÑка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñделана Ñ Ð¸ÑполÑзованием ÑаблиÑнÑÑ
ÑÑиггеÑов или в пÑиложении).
ÐбÑекÑÑ ÑÑ ÐµÐ¼Ñ
СÑ
ема bookings ÑодеÑÐ¶Ð¸Ñ Ð²Ñе обÑекÑÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑионной базÑ:
ÐÐ¼Ñ | Тип | ÐпиÑание
-----------------------+--------------------+----------------------
airplanes | пÑедÑÑавление | СамолÑÑÑ
airplanes_data | ÑаблиÑа | СамолÑÑÑ (пеÑеводÑ)
airports | пÑедÑÑавление | ÐÑÑопоÑÑÑ
airports_data | ÑаблиÑа | ÐÑÑопоÑÑÑ (пеÑеводÑ)
boarding_passes | ÑаблиÑа | ÐоÑадоÑнÑе ÑалонÑ
bookings | ÑаблиÑа | ÐÑониÑованиÑ
flights | ÑаблиÑа | РейÑÑ
flights_flight_id_seq | поÑледоваÑелÑноÑÑÑ |
routes | ÑаблиÑа | ÐаÑÑÑÑÑÑ
seats | ÑаблиÑа | ÐеÑÑа
segments | ÑаблиÑа | ÐеÑелÑÑÑ
tickets | ÑаблиÑа | ÐилеÑÑ
timetable | пÑедÑÑавление | РаÑпиÑание
ÐÑи подклÑÑении к базе паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии search_path авÑомаÑиÑеÑки пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение bookings,"$user",public, Ñак ÑÑо Ñвно ÑказÑваÑÑ Ð¸Ð¼Ñ ÑÑ
ÐµÐ¼Ñ Ð½ÐµÐ¾Ð±ÑзаÑелÑно.
Ðднако Ð´Ð»Ñ ÑÑнкÑий bookings.now и bookings.version в лÑбом ÑлÑÑае необÑ
одимо Ñвно ÑказÑваÑÑ ÑÑ
емÑ, ÑÑÐ¾Ð±Ñ Ð¾ÑлиÑаÑÑ Ð¸Ñ
Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð¸Ð¼ÑннÑÑ
ÑÑандаÑÑнÑÑ
ÑÑнкÑий.
ÐÑедÑÑавление bookings.airplanes
ÐÐ°Ð¶Ð´Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»Ñ Ð²Ð¾Ð·Ð´ÑÑного ÑÑдна иденÑиÑиÑиÑÑеÑÑÑ ÑÑÑÑ
знаÑнÑм кодом ÐÐТР(airplane_code). УказÑваеÑÑÑ Ñакже название модели (model), макÑималÑÐ½Ð°Ñ Ð´Ð°Ð»ÑноÑÑÑ Ð¿Ð¾Ð»ÐµÑа в киломеÑÑаÑ
(range) и кÑейÑеÑÑÐºÐ°Ñ ÑкоÑоÑÑÑ Ð² киломеÑÑаÑ
в ÑÐ°Ñ (speed).
ÐнаÑение Ð¿Ð¾Ð»Ñ model опÑеделÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð²ÑбÑанного ÑзÑка (паÑамеÑÑ bookings.lang).
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐпиÑание
---------------+---------+------------------------------------
airplane_code | char(3) | Ðод ÑамолÑÑа, ÐÐТÐ
model | text | ÐÐ¾Ð´ÐµÐ»Ñ ÑамолÑÑа
range | integer | ÐакÑималÑÐ½Ð°Ñ Ð´Ð°Ð»ÑноÑÑÑ Ð¿Ð¾Ð»ÐµÑа, км
speed | integer | ÐÑейÑеÑÑÐºÐ°Ñ ÑкоÑоÑÑÑ, км/Ñ
ÐпÑеделение пÑедÑÑавлениÑ:
SELECT airplane_code,
model ->> lang() AS model,
range,
speed
FROM airplanes_data ml;
Â
ТаблиÑа bookings.airplanes_data
ÐÑо Ð±Ð°Ð·Ð¾Ð²Ð°Ñ ÑаблиÑа Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ airplanes. Ðоле model ÑÑой ÑаблиÑÑ ÑодеÑÐ¶Ð¸Ñ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ ÑамолÑÑов на ÑазнÑе ÑзÑки, в ÑоÑмаÑе JSONB. РболÑÑинÑÑве ÑлÑÑаев к ÑÑой ÑаблиÑе не ÑледÑÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð½Ð°Ð¿ÑÑмÑÑ.
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐопÑÑÑимоÑÑÑ NULL | ÐпиÑание
---------------+---------+-------------------+-----------------------------------
airplane_code | char(3) | not null | Ðод ÑамолÑÑа, ÐÐТÐ
model | jsonb | not null | ÐÐ¾Ð´ÐµÐ»Ñ ÑамолÑÑа
range | integer | not null | ÐакÑималÑÐ½Ð°Ñ Ð´Ð°Ð»ÑноÑÑÑ Ð¿Ð¾Ð»ÐµÑа, км
speed | integer | not null | ÐÑейÑеÑÑÐºÐ°Ñ ÑкоÑоÑÑÑ, км/Ñ
ÐндекÑÑ:
PRIMARY KEY, btree (airplane_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
Â
ÐÑедÑÑавление bookings.airports
ÐÑÑопоÑÑ Ð¸Ð´ÐµÐ½ÑиÑиÑиÑÑеÑÑÑ ÑÑÑÑ
бÑквеннÑм кодом ÐÐТР(airport_code) и Ð¸Ð¼ÐµÐµÑ ÑÐ²Ð¾Ñ Ð¸Ð¼Ñ (airport_name).
ÐÐ»Ñ Ð³Ð¾Ñода и ÑÑÑÐ°Ð½Ñ Ð½Ðµ пÑедÑÑмоÑÑено оÑделÑнÑÑ
ÑÑÑноÑÑей, но Ð²Ð²ÐµÐ´ÐµÐ½Ñ Ð¿Ð¾Ð»Ñ city и country, позволÑÑÑее найÑи аÑÑопоÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ гоÑода или ÑÑÑанÑ. ÐÑо пÑедÑÑавление Ñакже вклÑÑÐ°ÐµÑ ÐºÐ¾Ð¾ÑдинаÑÑ Ð°ÑÑопоÑÑа (coordinates) и ÑаÑовой поÑÑ (timezone).
ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ airport_name, city и country опÑеделÑÑÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð²ÑбÑанного ÑзÑка (паÑамеÑÑ bookings.lang).
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐпиÑание
--------------+---------+------------------------------------------
airport_code | char(3) | Ðод аÑÑопоÑÑа, ÐÐТÐ
airport_name | text | Ðазвание аÑÑопоÑÑа
city | text | ÐоÑод
country | text | СÑÑана
coordinates | point | ÐооÑдинаÑÑ Ð°ÑÑопоÑÑа (долгоÑа и ÑиÑоÑа)
timezone | text | ЧаÑовой поÑÑ Ð°ÑÑопоÑÑа
ÐпÑеделение пÑедÑÑавлениÑ:
SELECT airport_code,
airport_name ->> lang() AS airport_name,
city ->> lang() AS city,
country ->> lang() AS country,
coordinates,
timezone
FROM airports_data ml;
Â
ТаблиÑа bookings.airports_data
ÐÑо Ð±Ð°Ð·Ð¾Ð²Ð°Ñ ÑаблиÑа Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ airports. Ðна ÑодеÑÐ¶Ð¸Ñ Ð¿ÐµÑÐµÐ²Ð¾Ð´Ñ Ð·Ð½Ð°Ñений airport_name, city и country на ÑазнÑе ÑзÑки, в ÑоÑмаÑе JSONB. РболÑÑинÑÑве ÑлÑÑаев к ÑÑой ÑаблиÑе не ÑледÑÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ð½Ð°Ð¿ÑÑмÑÑ.
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐопÑÑÑимоÑÑÑ NULL | ÐпиÑание
--------------+---------+-------------------+-----------------------------------------
airport_code | char(3) | not null | Ðод аÑÑопоÑÑа, ÐÐТÐ
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)
Â
ТаблиÑа bookings.boarding_passes
ÐÑи ÑегиÑÑÑаÑии на пеÑвÑй ÑейÑ, коÑоÑÐ°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð° за ÑÑÑки до плановой даÑÑ Ð¾ÑпÑавлениÑ, паÑÑажиÑÑ Ð²ÑдаÑÑÑÑ Ð¿Ð¾ÑадоÑнÑе ÑÐ°Ð»Ð¾Ð½Ñ Ð½Ð° вÑе ÑейÑÑ Ð² билеÑе. РпоÑадоÑном Ñалоне ÑказÑваеÑÑÑ Ð½Ð¾Ð¼ÐµÑ Ð¼ÐµÑÑа (seat_no). ÐоÑадоÑнÑй Ñалон иденÑиÑиÑиÑÑеÑÑÑ Ñакже, как и пеÑелÑÑ â номеÑом билеÑа и иденÑиÑикаÑоÑом ÑейÑа.
ÐÑи поÑадке паÑÑажиÑов в ÑамолÑÑ Ð¿Ð¾ÑадоÑнÑм Ñалонам пÑиÑваиваÑÑÑÑ Ð¿Ð¾ÑледоваÑелÑнÑе номеÑа (boarding_no, ÑÑÐ¾Ñ Ð½Ð¾Ð¼ÐµÑ Ñникален ÑолÑко в пÑеделаÑ
данного ÑейÑа) и ÑикÑиÑÑеÑÑÑ Ð²ÑÐµÐ¼Ñ Ð¿Ð¾Ñадки (boarding_time).
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐопÑÑÑимоÑÑÑ NULL | ÐпиÑание
---------------+-------------+-------------------+--------------------------
ticket_no | text | not null | ÐÐ¾Ð¼ÐµÑ Ð±Ð¸Ð»ÐµÑа
flight_id | integer | not null | ÐденÑиÑикаÑÐ¾Ñ ÑейÑа
seat_no | text | not null | ÐÐ¾Ð¼ÐµÑ Ð¼ÐµÑÑа
boarding_no | integer | | ÐÐ¾Ð¼ÐµÑ Ð¿Ð¾ÑадоÑного Ñалона
boarding_time | timestamptz | | ÐÑÐµÐ¼Ñ Ð¿Ð¾Ñадки
ÐндекÑÑ:
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 segments(ticket_no, flight_id)
Â
ТаблиÑа 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)
Â
ТаблиÑа bookings.flights
ÐÑÑеÑÑвеннÑй клÑÑ ÑаблиÑÑ ÑейÑов ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· двÑÑ
полей â номеÑа маÑÑÑÑÑа (route_no) и плановой даÑÑ Ð¾ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (scheduled_departure). ЧÑÐ¾Ð±Ñ ÑделаÑÑ Ð²Ð½ÐµÑние клÑÑи на ÑÑÑ ÑаблиÑÑ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑнее, в каÑеÑÑве пеÑвиÑного иÑполÑзÑеÑÑÑ ÑÑÑÑогаÑнÑй клÑÑ (flight_id).
У каждого ÑейÑа еÑÑÑ Ð·Ð°Ð¿Ð»Ð°Ð½Ð¸ÑованнÑе даÑа и вÑÐµÐ¼Ñ Ð²ÑлеÑа (scheduled_departure) и пÑибÑÑÐ¸Ñ (scheduled_arrival). РеалÑнÑе вÑÐµÐ¼Ñ Ð²ÑлеÑа (actual_departure) и пÑибÑÑÐ¸Ñ (actual_arrival) могÑÑ Ð¾ÑлиÑаÑÑÑÑ: обÑÑно не ÑилÑно, но иногда и на неÑколÑко ÑаÑов, еÑли ÑÐµÐ¹Ñ Ð·Ð°Ð´ÐµÑжан.
СÑаÑÑÑ ÑейÑа (status) Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð¾Ð´Ð½Ð¾ из ÑледÑÑÑиÑ
знаÑений:
Scheduled. Ð ÐµÐ¹Ñ Ð´Ð¾ÑÑÑпен Ð´Ð»Ñ Ð±ÑониÑованиÑ. ÐÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° 60 дней до плановой даÑÑ Ð²ÑлеÑа; до ÑÑого запиÑÑ Ð¾ ÑейÑе не ÑÑÑеÑÑвÑÐµÑ Ð² базе даннÑÑ .On Time. ÐÑкÑÑÑа ÑегиÑÑÑаÑÐ¸Ñ (за ÑÑÑки до плановой даÑÑ Ð²ÑлеÑа) и ÑÐµÐ¹Ñ Ð½Ðµ задеÑжан.Delayed. ÐÑкÑÑÑа ÑегиÑÑÑаÑÐ¸Ñ (за ÑÑÑки до плановой даÑÑ Ð²ÑлеÑа), но ÑÐµÐ¹Ñ Ð·Ð°Ð´ÐµÑжан.Boarding. ÐÐ´ÐµÑ Ð¿Ð¾Ñадка паÑÑажиÑов в ÑамолÑÑ.Departed. СамолÑÑ Ð²ÑлеÑел и Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² воздÑÑ Ðµ.Arrived. СамолÑÑ Ð¿ÑибÑл в пÑÐ½ÐºÑ Ð½Ð°Ð·Ð½Ð°ÑениÑ.Cancelled. Ð ÐµÐ¹Ñ Ð¾ÑменÑн.
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐопÑÑÑимоÑÑÑ NULL | ÐпиÑание
---------------------+-------------+-------------------+-----------------------------
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)
Â
ТаблиÑа bookings.routes
ÐаÑÑÑÑÑ Ð²Ñегда ÑоединÑÐµÑ Ð´Ð²Ðµ ÑоÑки â аÑÑопоÑÑÑ Ð²ÑлеÑа (departure_airport) и пÑибÑÑÐ¸Ñ (arrival_airport). Такое понÑÑие, как «маÑÑÑÑÑ Ñ Ð¿ÐµÑеÑадками» оÑÑÑÑÑÑвÑеÑ: еÑли из одного аÑÑопоÑÑа до дÑÑгого Ð½ÐµÑ Ð¿ÑÑмого ÑейÑа, в Ð±Ð¸Ð»ÐµÑ Ð¿ÑоÑÑо вклÑÑаÑÑÑÑ Ð½ÐµÑколÑко пеÑелеÑов.
ÐаÑÑÑÑÑ Ð¸Ð¼ÐµÐµÑ Ð¿ÐµÑиод дейÑÑÐ²Ð¸Ñ (validity) длиной в меÑÑÑ. ÐаÑÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ñеми же аÑÑопоÑÑами Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²ÑоÑÑÑÑÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑаÑно; он бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÑÐ¾Ñ Ð¶Ðµ Ð½Ð¾Ð¼ÐµÑ route_no, однако в ÑазнÑе пеÑÐ¸Ð¾Ð´Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑлÑживаÑÑÑÑ ÑазнÑми ÑамолÑÑами и оÑпÑавлÑÑÑÑÑ Ð² ÑазнÑе дни.
РейÑÑ, ÑледÑÑÑие даннÑм маÑÑÑÑÑом, обÑлÑживаÑÑÑÑ Ð¾Ð¿ÑеделеннÑм Ñипом ÑамолÑÑа (airplane_code) и вÑлеÑаÑÑ Ð² одно и Ñо же вÑÐµÐ¼Ñ (scheduled_time, меÑÑное вÑÐµÐ¼Ñ Ð² аÑÑопоÑÑÑ Ð¾ÑпÑавлениÑ) в ÑазнÑе дни недели (маÑÑив days_of_week, 1 â понеделÑник, 7 â воÑкÑеÑенÑе).
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐопÑÑÑимоÑÑÑ NULL | ÐпиÑание
---------------------+-------------+-------------------+-----------------------------
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 | Ðод ÑамолÑÑа, ÐÐТÐ
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)
Â
ТаблиÑа bookings.seats
ÐеÑÑа опÑеделÑÑÑ ÑÑ
ÐµÐ¼Ñ Ñалона каждой модели. Ðаждое меÑÑо опÑеделÑеÑÑÑ Ñвоим номеÑом (seat_no) и Ð¸Ð¼ÐµÐµÑ Ð·Ð°ÐºÑеплÑннÑй за ним клаÑÑ Ð¾Ð±ÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ (fare_conditions) â Economy, Comfort или Business.
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐопÑÑÑимоÑÑÑ NULL | ÐпиÑание
-----------------+-------------+-------------------+--------------------
airplane_code | char(3) | not null | Ðод ÑамолÑÑа, ÐÐТÐ
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_data(airplane_code) ON DELETE CASCADE
Â
ТаблиÑа bookings.segments
ÐеÑелÑÑ ÑоединÑÐµÑ Ð±Ð¸Ð»ÐµÑ Ñ ÑейÑом и иденÑиÑиÑиÑÑеÑÑÑ Ð¸Ñ Ð½Ð¾Ð¼ÐµÑами.
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ пеÑелеÑа ÑказÑваÑÑÑÑ ÐµÐ³Ð¾ ÑÑоимоÑÑÑ (price) и клаÑÑ Ð¾Ð±ÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ (fare_conditions).
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐопÑÑÑимоÑÑÑ NULL | ÐпиÑание
-----------------+---------------+-------------------+---------------------
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)
Â
ТаблиÑа bookings.tickets
ÐÐ¸Ð»ÐµÑ Ð¸Ð¼ÐµÐµÑ ÑникалÑнÑй Ð½Ð¾Ð¼ÐµÑ (ticket_no), ÑоÑÑоÑÑий из 13 ÑиÑÑ.
ÐÐ¸Ð»ÐµÑ ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ паÑÑажиÑе: Ð½Ð¾Ð¼ÐµÑ Ð´Ð¾ÐºÑменÑа, ÑдоÑÑовеÑÑÑÑего лиÑноÑÑÑ (passenger_id), а Ñакже его полное Ð¸Ð¼Ñ (passenger_name). ÐÐ¾Ð¼ÐµÑ Ð´Ð¾ÐºÑменÑа ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· кода ÑÑÑÐ°Ð½Ñ Ð¸ ÑиÑÑового иденÑиÑикаÑоÑа, а полное имÑ â из имени и Ñамилии (Ð¸Ð¼Ñ ÑказÑваеÑÑÑ Ð¿ÐµÑвÑм даже Ð´Ð»Ñ ÑеÑ
ÑÑÑан, в коÑоÑÑÑ
пÑинÑÑ Ð¾Ð±ÑаÑнÑй поÑÑдок, как, напÑимеÑ, в ÐиÑае).
ÐÐ»Ñ Ð¿Ð°ÑÑажиÑа Ð½ÐµÑ Ð¾ÑделÑной ÑÑÑноÑÑи, но паÑÑÐ°Ð¶Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñно иденÑиÑиÑиÑÑеÑÑÑ Ð½Ð¾Ð¼ÐµÑом докÑменÑа. ÐаÑанÑиÑÑеÑÑÑ, ÑÑо Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð½Ð¾Ð¼ÐµÑÑ Ð´Ð¾ÐºÑменÑа вÑегда ÑооÑвеÑÑÑвÑÐµÑ Ð¾Ð´Ð½Ð¾ и Ñо же Ð¸Ð¼Ñ Ð¿Ð°ÑÑажиÑа (в ÑазнÑÑ Ð´Ð¾ÐºÑменÑÐ°Ñ Ð¸Ð¼ÐµÐ½Ð° могÑÑ ÑовпадаÑÑ). Ðдин и ÑÐ¾Ñ Ð¶Ðµ паÑÑÐ°Ð¶Ð¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑвоваÑÑ Ð² одном бÑониÑовании неÑколÑко Ñаз и не Ð¼Ð¾Ð¶ÐµÑ ÑледоваÑÑ ÑазнÑми ÑейÑами в одно и Ñо же вÑÐµÐ¼Ñ (Ñ Ð¾ÑÑ Ð¿Ð¾Ñледнее ÑÑловие не пÑовеÑÑеÑÑÑ Ð½Ð° ÑÑовне Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ).
ÐÑизнак пÑÑмого билеÑа (outbound) Ð¸Ð¼ÐµÐµÑ Ð¸ÑÑинное знаÑение Ð´Ð»Ñ Ð±Ð¸Ð»ÐµÑа «ÑÑда» и ложное â Ð´Ð»Ñ Ð±Ð¸Ð»ÐµÑа «обÑаÑно». ÐонеÑнÑе пÑнкÑÑ Ð¿ÐµÑелÑÑов, вклÑÑеннÑÑ
в пÑÑмой и обÑаÑнÑй билеÑÑ, ÑовпадаÑÑ, но пÑÑи ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¾ÑлиÑаÑÑÑÑ.
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐопÑÑÑимоÑÑÑ NULL | ÐпиÑание
----------------+-------------+-------------------+-------------------------
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)
Â
ÐÑедÑÑавление bookings.timetable
Ðад ÑаблиÑами routes и flights Ñоздано пÑедÑÑавление timetable, ÑкÑÑваÑÑее ÑемпоÑалÑное Ñоединение и добавлÑÑÑее инÑоÑмаÑÐ¸Ñ Ð¾ меÑÑном вÑемени вÑлеÑа и пÑибÑÑиÑ. ÐÑедÑÑавление позволÑÐµÑ ÑпÑоÑÑиÑÑ Ð¼Ð½Ð¾Ð³Ð¸Ðµ запÑоÑÑ, ÑÑо оÑобенно важно Ð´Ð»Ñ ÑеÑ
, кÑо ÑолÑко наÑÐ¸Ð½Ð°ÐµÑ Ð¸Ð·ÑÑаÑÑ ÑзÑк SQL. Ðднако пÑименение ÑÑого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑложнÑÑ
запÑоÑаÑ
Ð¼Ð¾Ð¶ÐµÑ ÑÑ
ÑдÑиÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ Ð¸Ð·-за поÑенÑиалÑно лиÑниÑ
Ñоединений Ñ ÑаблиÑами аÑÑопоÑÑов.
СÑÐ¾Ð»Ð±ÐµÑ | Тип | ÐпиÑание
---------------------------+-------------+--------------------------------------
flight_id | integer | ÐденÑиÑикаÑÐ¾Ñ ÑейÑа
route_no | text | ÐÐ¾Ð¼ÐµÑ Ð¼Ð°ÑÑÑÑÑа
departure_airport | char(3) | Ðод аÑÑопоÑÑа оÑпÑавлениÑ
arrival_airport | char(3) | Ðод аÑÑопоÑÑа пÑибÑÑиÑ
status | status | СÑаÑÑÑ ÑейÑа
airplane_code | char(3) | Ðод ÑамолÑÑа, ÐÐТÐ
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;
Â
ФÑнкÑÐ¸Ñ bookings.now
ÐемонÑÑÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð±Ð°Ð·Ð° ÑодеÑÐ¶Ð¸Ñ Ð²Ñеменной «ÑÑез» даннÑÑ
 â Ñак, как бÑдÑо в некоÑоÑÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð±Ñла Ñделана ÑезеÑÐ²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÑеалÑной ÑиÑÑемÑ. ÐапÑимеÑ, еÑли некоÑоÑÑй ÑÐµÐ¹Ñ Ð¸Ð¼ÐµÐµÑ ÑÑаÑÑÑ Departed, ÑÑо ознаÑаеÑ, ÑÑо в Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑезеÑвного копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑамолÑÑ Ð²ÑлеÑел и наÑ
одилÑÑ Ð² воздÑÑ
е.
ÐозиÑÐ¸Ñ Â«ÑÑеза» ÑоÑ
Ñанена в ÑÑнкÑии bookings.now. Ðй можно полÑзоваÑÑÑÑ Ð² запÑоÑаÑ
Ñам, где в обÑÑной жизни иÑполÑзовалаÑÑ Ð±Ñ ÑÑнкÑÐ¸Ñ now.
ФÑнкÑÐ¸Ñ bookings.lang
ÐекоÑоÑÑе Ð¿Ð¾Ð»Ñ Ð² демонÑÑÑаÑионной базе ÑодеÑÐ¶Ð°Ñ ÑекÑÑ Ð½Ð° английÑком и ÑÑÑÑком ÑзÑкаÑ
. ФÑнкÑÐ¸Ñ bookings.lang возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение паÑамеÑÑа bookings.lang, Ñо еÑÑÑ ÑзÑк, на коÑоÑом бÑдÑÑ Ð²ÑдаваÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑиÑ
полей.
ÐÑа ÑÑнкÑÐ¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð² пÑедÑÑавлениÑÑ
airplanes и airports и не пÑедназнаÑена Ð´Ð»Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² запÑоÑаÑ
.
ФÑнкÑÐ¸Ñ bookings.version
ФÑнкÑÐ¸Ñ bookings.version возвÑаÑÐ°ÐµÑ Ð²ÐµÑÑÐ¸Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑионной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐеÑÑÐ¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾Ð¾Ð±Ñажаемой авиакомпании и даÑÑ Ð½Ð°Ñала авиапеÑевозок, а Ñакже ÑообÑÐ°ÐµÑ Ð¾Ñ
ваÑеннÑй инÑеÑвал вÑемени. ÐкÑÑалÑÐ½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ Ð½Ð° ÑекÑÑий моменÑ â PostgresPro 2025-09-01.
ÐÑполÑзование
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑазлиÑнÑÑ
пеÑеводимÑÑ
полей вÑдаÑÑÑÑ Ð½Ð° английÑком ÑзÑке. ÐÑо Ð¿Ð¾Ð»Ñ airport_name, city и country пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ airports, а Ñакже поле model пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ airplanes.
ÐÑ Ð¼Ð¾Ð¶ÐµÑе вÑбÑаÑÑ Ð´ÑÑгой ÑзÑк Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑиÑ
полей. ÐÐ»Ñ Ð¿ÐµÑеклÑÑÐµÐ½Ð¸Ñ Ð½Ð° ÑÑÑÑкий (единÑÑвеннÑй пеÑевод, пÑедÑÑавленнÑй в данной базе) ÑÑÑановиÑе Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа bookings.lang знаÑение ru:
SET bookings.lang = 'ru';
Также Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдобно вÑбÑаÑÑ ÑзÑк на ÑÑовне Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ :
ALTER DATABASE demo SET bookings.lang = 'ru';
ЧÑÐ¾Ð±Ñ ÑÑо изменение вÑÑÑпило в ÑилÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ повÑоÑно подклÑÑиÑÑÑÑ Ðº базе даннÑÑ .
ÐоÑмоÑÑим на ÑезÑлÑÑаÑÑ Ð½ÐµÑколÑÐºÐ¸Ñ Ð¿ÑоÑÑÑÑ Ð·Ð°Ð¿ÑоÑов, ÑÑÐ¾Ð±Ñ Ð»ÑÑÑе познакомиÑÑÑÑ Ñ ÑодеÑжимÑм демонÑÑÑаÑионной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
РезÑлÑÑаÑÑ, пÑедÑÑавленнÑе ниже, бÑли полÑÑÐµÐ½Ñ Ð´Ð»Ñ Ð²ÐµÑÑии PostgresPro 2025-09-01 (91 days). ÐÑли в ваÑей ÑиÑÑеме запÑоÑÑ Ð²ÑдаÑÑ Ð´ÑÑгие даннÑе, пÑовеÑÑÑе веÑÑÐ¸Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑионной Ð±Ð°Ð·Ñ (ÑÑнкÑÐ¸Ñ bookings.version). ÐезнаÑиÑелÑнÑе оÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑвÑÐ·Ð°Ð½Ñ Ñ Ð¼ÐµÑÑнÑм вÑеменем, оÑлиÑнÑм Ð¾Ñ Ð¼Ð¾ÑковÑкого, и наÑÑÑойками локализаÑии.
ÐÑе ÑейÑÑ Ð²ÑполнÑÑÑÑÑ Ð½ÐµÑколÑкими Ñипами ÑамолÑÑов:
SELECT * FROM airplanes;
airplane_code | model | range | speed
---------------+------------------------+-------+-------
32N | ÐÑÑобÑÑ A320neo | 6500 | 830
339 | ÐÑÑобÑÑ A330-900neo | 13300 | 870
351 | ÐÑÑобÑÑ A350-1000 | 16700 | 913
35X | ÐÑÑобÑÑ A350F | 8700 | 903
76F | Ðоинг 767-300F | 6000 | 850
77W | Ðоинг 777-300ER | 14600 | 905
789 | Ðоинг 787-9 Dreamliner | 14000 | 913
7M7 | Ðоинг 737 MAX 7 | 7000 | 840
CR7 | ÐомбаÑдÑе CRJ700 | 3100 | 829
E70 | ÐмбÑаÑÑ E170 | 4000 | 800
(10 ÑÑÑок)
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñипа ÑамолÑÑа Ñ ÑаниÑÑÑ ÑпиÑок меÑÑ Ð² Ñалоне. ÐапÑимеÑ, Ð²Ð¾Ñ Ð³Ð´Ðµ можно ÑазмеÑÑиÑÑÑÑ Ð² бизнеÑ-клаÑÑе ÐмбÑаÑÑа E170:
SELECT *
FROM seats
WHERE airplane_code = 'E70' AND fare_conditions = 'Business';
airplane_code | seat_no | fare_conditions
---------------+---------+-----------------
E70 | 1A | Business
E70 | 1C | Business
E70 | 1D | Business
E70 | 2A | Business
E70 | 2C | Business
E70 | 2D | Business
(6 ÑÑÑок)
СамолÑÑÑ Ð±Ð¾Ð»ÑÑего ÑазмеÑа имеÑÑ Ð±Ð¾Ð»ÑÑе поÑадоÑнÑÑ Ð¼ÐµÑÑ Ñ ÑазнÑми клаÑÑами обÑлÑживаниÑ:
SELECT
s.airplane_code,
string_agg (s.fare_conditions || '(' || s.num || ')', ', ') AS fare_conditions
FROM (
SELECT airplane_code, fare_conditions, count(*)::text AS num
FROM seats
GROUP BY airplane_code, fare_conditions
) s
GROUP BY s.airplane_code
ORDER BY s.airplane_code;
airplane_code | fare_conditions
---------------+-----------------------------------------
32N | Business(28), Economy(138)
339 | Business(29), Economy(224), Comfort(28)
351 | Economy(281), Business(44)
77W | Economy(326), Business(30), Comfort(48)
789 | Economy(188), Business(48), Comfort(21)
7M7 | Business(16), Economy(144)
CR7 | Business(6), Economy(52), Comfort(12)
E70 | Business(6), Economy(72)
(8 ÑÑÑок)
Ðва Ñипа ÑамолÑÑов (ÐÑÑобÑÑ A350F и Ðоинг 767-300F) ÑвлÑÑÑÑÑ Ð³ÑÑзовÑми и не ÑÑаÑÑвÑÑÑ Ð² паÑÑажиÑÑÐºÐ¸Ñ Ð°Ð²Ð¸Ð°Ð¿ÐµÑÐµÐ²Ð¾Ð·ÐºÐ°Ñ .
Ðаза даннÑÑ ÑодеÑÐ¶Ð¸Ñ ÑпиÑок пÑакÑиÑеÑки вÑÐµÑ Ð¾ÑноÑиÑелÑно кÑÑпнÑÑ Ð°ÑÑопоÑÑов:
SELECT
count(*) airports,
count(distinct country||','||city) cities,
count(distinct country) countries
FROM airports;
airports | cities | countries
----------+--------+-----------
5501 | 5157 | 230
(1 ÑÑÑока)
ÐапÑимеÑ, к ÐоÑкве оÑноÑÑÑÑÑ Ð¿ÑÑÑ Ð°ÑÑопоÑÑов:
SELECT airport_code, airport_name, coordinates, timezone
FROM airports
WHERE country = 'РоÑÑиÑ' AND city = 'ÐоÑква';
airport_code | airport_name | coordinates | timezone
--------------+--------------+-------------------+---------------
BKA | ÐÑково | (38.06,55.6172) | Europe/Moscow
DME | Ðомодедово | (37.9063,55.4088) | Europe/Moscow
OSF | ÐÑÑаÑÑево | (37.5072,55.5117) | Europe/Moscow
SVO | ШеÑемеÑÑево | (37.4146,55.9726) | Europe/Moscow
VKO | ÐнÑково | (37.2615,55.5915) | Europe/Moscow
(5 rows)
ÐаÑÑÑÑÑÐ½Ð°Ñ ÑеÑÑ Ñ
ÑаниÑÑÑ Ð² ÑаблиÑе routes. ÐоÑ, напÑимеÑ, кÑда, в какие дни недели и за какое вÑÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ долеÑеÑÑ Ð¸Ð· Рима пеÑвого ноÑбÑÑ 2025 года:
SELECT r.route_no, a.airport_code, a.airport_name, a.city, a.country, r.days_of_week, r.duration
FROM routes r
JOIN airports a ON a.airport_code = r.arrival_airport
WHERE departure_airport = (SELECT airport_code FROM airports WHERE airport_name = 'ФÑÑмиÑино')
AND validity @> '2025-11-01 00:00:00CET'::timestamptz;
route_no | airport_code | airport_name | city | country | days_of_week | duration
----------+--------------+--------------+---------+-------------------+-----------------+----------
PG0086 | BGY | ÐеÑгамо | Ðилан | ÐÑÐ°Ð»Ð¸Ñ | {1,2,3,4,5,6,7} | 01:05:00
PG0176 | ORY | ÐÑли | ÐаÑиж | ФÑанÑÐ¸Ñ | {2,4,6,7} | 01:55:00
PG0228 | HGH | СÑоÑÐ°Ð½Ñ | ХанÑÐ¶Ð¾Ñ | ÐиÑай | {7} | 11:30:00
PG0233 | MXP | ÐалÑпенÑа | Ðилан | ÐÑÐ°Ð»Ð¸Ñ | {1,2,3,4,5,6,7} | 01:05:00
PG0235 | ORD | Ð'ХаÑа | Чикаго | СоединеннÑе ШÑаÑÑ | {2} | 09:50:00
(5 ÑÑÑок)
ÐбÑаÑиÑе внимание, ÑÑо вÑÐµÐ¼Ñ Ñказано в ÑаÑовом поÑÑе аÑÑопоÑÑа вÑлеÑа (CET, Central European Time).
Ðаза даннÑÑ
бÑла ÑÑоÑмиÑована на моменÑ, возвÑаÑаемÑй ÑÑнкÑией bookings.now:
SELECT bookings.now();
now
------------------------
2025-12-01 00:00:00+03
(1 ÑÑÑока)
ÐÑноÑиÑелÑно именно ÑÑого моменÑа вÑе ÑейÑÑ Ð´ÐµÐ»ÑÑÑÑ Ð½Ð° пÑоÑедÑие и бÑдÑÑие.
SELECT
status,
count(*) AS count,
min(scheduled_departure) AS min_scheduled_departure,
max(scheduled_departure) AS max_scheduled_departure
FROM flights
GROUP BY status
ORDER BY min_scheduled_departure;
status | count | min_scheduled_departure | max_scheduled_departure
-----------+-------+-------------------------+-------------------------
Arrived | 10966 | 2025-10-01 03:00:00+03 | 2025-12-01 02:10:00+03
Cancelled | 121 | 2025-10-01 15:25:00+03 | 2026-01-29 19:20:00+03
Departed | 20 | 2025-11-30 15:50:00+03 | 2025-12-01 02:50:00+03
Boarding | 4 | 2025-12-01 02:55:00+03 | 2025-12-01 03:25:00+03
Delayed | 10 | 2025-12-01 03:30:00+03 | 2025-12-02 01:00:00+03
On Time | 157 | 2025-12-01 03:35:00+03 | 2025-12-02 02:55:00+03
Scheduled | 10480 | 2025-12-02 03:10:00+03 | 2026-01-30 02:55:00+03
(7 ÑÑÑок)
Ðайдем ближайÑий ÑейÑ, вÑлеÑаÑÑий из ÐкаÑеÑинбÑÑга (аÑÑопоÑÑ SVX) в УÑ
Ð°Ð½Ñ (аÑÑопоÑÑ WUH). ÐоÑполÑзÑемÑÑ Ð¿ÑедÑÑавлением timetable, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑоединÑÑÑ ÑаблиÑÑ routes и flights:
SELECT *
FROM timetable t
WHERE t.departure_airport = 'SVX'
AND t.arrival_airport = 'WUH'
AND t.scheduled_departure > bookings.now()
ORDER BY t.scheduled_departure
LIMIT 1 \gx
-[ RECORD 1 ]-------------+-----------------------
flight_id | 11465
route_no | PG0522
departure_airport | SVX
arrival_airport | WUH
status | Scheduled
airplane_code | 7M7
scheduled_departure | 2025-12-03 10:30:00+03
scheduled_departure_local | 2025-12-03 12:30:00
actual_departure |
actual_departure_local |
scheduled_arrival | 2025-12-03 17:30:00+03
scheduled_arrival_local | 2025-12-03 22:30:00
actual_arrival |
actual_arrival_local |
ÐбÑаÑиÑе внимание, ÑÑо в пÑедÑÑавлении timetable Ñказано не ÑолÑко локалÑное (моÑковÑкое) вÑемÑ, но и меÑÑное вÑÐµÐ¼Ñ Ð² аÑÑопоÑÑаÑ
вÑлеÑа и пÑилÑÑа.
Ðаждое бÑониÑование Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð½ÐµÑколÑко билеÑов, по Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð½Ð° каждого паÑÑажиÑа. ÐилеÑ, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð½ÐµÑколÑко пеÑелÑÑов. ÐÐ¾Ð»Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ бÑониÑовании наÑ
одиÑÑÑ Ð² ÑÑÑÑ
ÑаблиÑаÑ
: bookings, tickets и segments.
ÐоÑмоÑÑим на бÑониÑование Ñ ÐºÐ¾Ð´Ð¾Ð¼ JU35I4:
SELECT * FROM bookings WHERE book_ref = 'JU35I4';
book_ref | book_date | total_amount
----------+-------------------------------+--------------
JU35I4 | 2025-10-09 06:53:16.710703+03 | 86750.00
(1 ÑÑÑока)
ÐÐ¾Ñ Ð¸Ð· ÐºÐ°ÐºÐ¸Ñ Ð±Ð¸Ð»ÐµÑов оно ÑоÑÑоиÑ:
SELECT *
FROM tickets
WHERE book_ref = 'JU35I4';
ticket_no | book_ref | passenger_id | passenger_name | outbound
---------------+----------+------------------+-------------------+----------
0005433348362 | JU35I4 | RU 2714075620824 | Nadezhda Sergeeva | t
0005433348356 | JU35I4 | RU 8692103212506 | Artur Isakov | t
(2 ÑÑÑоки)
Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, в бÑониÑование Ð²Ñ Ð¾Ð´ÑÑ Ð±Ð¸Ð»ÐµÑÑ Ð´Ð²ÑÑ Ð¿Ð°ÑÑажиÑов. Узнаем, какие пеÑелÑÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ñ Ð² Ð±Ð¸Ð»ÐµÑ ÐÐ°Ð´ÐµÐ¶Ð´Ñ Ð¡ÐµÑгеевой:
SELECT r.route_no,
dep.airport_code dep_airport, dep.country dep_country, dep.city dep_city,
arr.airport_code arr_airport, arr.country arr_country, arr.city arr_city
FROM segments s
JOIN flights f ON f.flight_id = s.flight_id
JOIN routes r ON r.route_no = f.route_no AND r.validity @> f.scheduled_departure
JOIN airports dep ON dep.airport_code = r.departure_airport
JOIN airports arr ON arr.airport_code = r.arrival_airport
WHERE s.ticket_no = '0005433348362'
ORDER BY f.scheduled_departure;
route_no | dep_airport | dep_country | dep_city | arr_airport | arr_country | arr_city
----------+-------------+-------------+--------------------+-------------+-------------+--------------------
PG0370 | OVB | РоÑÑÐ¸Ñ | ÐовоÑибиÑÑк | SVO | РоÑÑÐ¸Ñ | ÐоÑква
PG0179 | SVO | РоÑÑÐ¸Ñ | ÐоÑква | FRA | ÐеÑÐ¼Ð°Ð½Ð¸Ñ | ФÑанкÑÑÑÑ-на-Ðайне
PG0408 | FRA | ÐеÑÐ¼Ð°Ð½Ð¸Ñ | ФÑанкÑÑÑÑ-на-Ðайне | FCO | ÐÑÐ°Ð»Ð¸Ñ | Рим
PG0482 | FCO | ÐÑÐ°Ð»Ð¸Ñ | Рим | HEL | ФинлÑÐ½Ð´Ð¸Ñ | ХелÑÑинки
(3 ÑÑÑоки)
Ðак видим, ÐаÑалÑÑ Ð»ÐµÑÐ¸Ñ Ð¸Ð· ÐовоÑибиÑÑка в ХелÑÑинки Ñ Ð¿ÐµÑеÑадками в ÐоÑквве, ФÑанкÑÑÑÑе-на-Ðайне и Риме.
ЧаÑÑÑ Ð¿ÐµÑелÑÑов в ÑÑом билеÑе Ñже вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð½Ð° моменÑ, возвÑаÑаемÑй ÑÑнкÑией bookings.now, а ÑаÑÑÑ â еÑÑ Ð½ÐµÑ. ÐоÑле ÑегиÑÑÑаÑии на пеÑвÑй ÑÐµÐ¹Ñ Ð¿Ð°ÑÑажиÑÑ Ð²ÑдаÑÑÑÑ Ð¿Ð¾ÑадоÑнÑе ÑÐ°Ð»Ð¾Ð½Ñ Ñ Ñказанием меÑÑ. РпеÑвÑÑ
двÑÑ
поÑадоÑнÑÑ
ÑалонаÑ
ÐÐ°Ð´ÐµÐ¶Ð´Ñ ÑÐºÐ°Ð·Ð°Ð½Ñ Ð½Ð¾Ð¼ÐµÑ Ð¸ вÑÐµÐ¼Ñ Ð¿Ð¾Ñадки в ÑамолÑÑ, а на ÑледÑÑÑие два ÑейÑа поÑадка еÑÑ Ð¿ÑедÑÑоиÑ:
SELECT f.route_no, f.flight_id, f.status, bp.seat_no, bp.boarding_no, bp.boarding_time
FROM flights f
JOIN boarding_passes bp ON bp.flight_id = f.flight_id
WHERE bp.ticket_no = '0005433348362'
ORDER BY f.scheduled_departure;
route_no | flight_id | status | seat_no | boarding_no | boarding_time
----------+-----------+-----------+---------+-------------+-------------------------------
PG0370 | 10817 | Arrived | 17B | 45 | 2025-11-29 18:18:42.972147+03
PG0179 | 10935 | Arrived | 16A | 33 | 2025-11-30 11:54:41.297034+03
PG0408 | 11108 | On Time | 24C | |
PG0482 | 11264 | Scheduled | 4B | |
(4 ÑÑÑоки)
ÐадеемÑÑ, ÑÑо ÑÑи неÑколÑко пÑоÑÑÑÑ Ð¿ÑимеÑов помогли ÑоÑÑавиÑÑ Ð¿ÑедÑÑавление о ÑодеÑжимом демонÑÑÑаÑионной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐеÑÑÐ¸Ñ Ð¾Ñ 15.08.2017

ФайлÑ
- demo-small.zip (21 ÐÐ) â даннÑе по полеÑам за один меÑÑÑ (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 300 ÐÐ),
- demo-medium.zip (62 ÐÐ) â даннÑе по полеÑам за ÑÑи меÑÑÑа (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 700 ÐÐ),
- demo-big.zip (232 ÐÐ) â даннÑе по полеÑам за год (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 2,5 ÐÐ).
ÐпиÑание
- УÑÑановка
- ÐиагÑамма ÑÑ ÐµÐ¼Ñ Ð´Ð°Ð½Ð½ÑÑ
- ÐпиÑание ÑÑ ÐµÐ¼Ñ
- ÐбÑекÑÑ ÑÑ ÐµÐ¼Ñ
- ÐÑполÑзование
ÐÑлиÑÐ¸Ñ Ð¾Ñ Ð¿ÑедÑдÑÑей веÑÑии
- ТаблиÑа
airportsзаменена на одноименное пÑедÑÑавление над ÑаблиÑейairports_data, в коÑоÑой полÑairport_nameиcityÑодеÑÐ¶Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ°Ðº на ÑÑÑÑком, Ñак и на английÑком ÑзÑÐºÐ°Ñ . ÐÑедÑÑавление показÑÐ²Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе на ÑзÑке, ÑÑÑановленном в конÑигÑÑаÑионном паÑамеÑÑеbookings.lang(по ÑмолÑаниÑ â ÑÑÑÑкий). - ÐналогиÑно ÑаблиÑа
aircraftsзаменена на одноименное пÑедÑÑавление над ÑаблиÑейaircrafts_data. ÐеÑеведено полеmodel. - ÐаÑеÑиализованное пÑедÑÑавление
routesзаменено на обÑÑное, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑÑебовалоÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ пÑи изменении паÑамеÑÑаbookings.lang. - РпÑедÑÑавлении
airportsи ÑаблиÑеairports_dataполÑlongitudeиlatitudeÐ·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð½Ð° одно полеcoordinatesÑипаpoint. - ÐÑи подклÑÑении к демонÑÑÑаÑионной базе даннÑÑ
пÑавилÑное знаÑение паÑамеÑÑа
search_pathÑÑÑанавливаеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки.
ÐеÑÑÐ¸Ñ Ð¾Ñ 13.10.2016
ФайлÑ
- demo-small-20161013.zip (21 ÐÐ) â даннÑе по полеÑам за один меÑÑÑ (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 300 ÐÐ),
- demo-medium-20161013.zip (62 ÐÐ) â даннÑе по полеÑам за ÑÑи меÑÑÑа (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 700 ÐÐ),
- demo-big-20161013.zip (232 ÐÐ) â даннÑе по полеÑам за год (ÑÐ°Ð·Ð¼ÐµÑ ÐРпÑимеÑно 2,5 ÐÐ).
ÐпиÑание
- УÑÑановка
- ÐиагÑамма ÑÑ ÐµÐ¼Ñ Ð´Ð°Ð½Ð½ÑÑ
- ÐпиÑание ÑÑ ÐµÐ¼Ñ
- ÐбÑекÑÑ ÑÑ ÐµÐ¼Ñ
- ÐÑполÑзование
То же Ñамое одним PDF-Ñайлом.