簡體   English   中英

如何設計一個航班搜索停機數據庫?

[英]How to design a database of flight search for stoppages?

我正在嘗試為航班設計一個數據庫,說我想從印度前往美國,現在的停工就像第一次)加爾各答 -> 孟買 -> 倫敦

現在我想以這樣的方式設計數據庫,這樣我就可以隨時搜索 Kolkata to London 我可以找到包括 Mumbai 在內的內容,並且在搜索 Mumbai to London 時也可以找到它。 我無法弄清楚如何設計表格。

我是 SQL 的新手,我之前也想出了類似的東西

| 航班號 | flight_from | 飛行目的地 | 停止1 | 時間 |
1 加爾各答 倫敦 孟買 下午 3:30

現在我知道在同一個表中添加停止是非常幼稚的,因為我可以理解它需要插入到其他表中,但我找不到出路

即使我想在兩者之間添加兩個或更多停靠點以將訂單顯示為加爾各答 -> 孟買 -> 德里 -> 倫敦,就像這樣。 還有如何做到這一點,以便如果我在兩者之間進行搜索,我可以獲得 flight_to -- flight_to

*任何建議或建議都會受到高度評價。

這很棘手。

您所看到的“航班”(並且可能由您的航空公司進行營銷)可能是航班的組合,為了方便起見,它們捆綁在一起。 這是有道理的,因為——理論上——你可以從世界上任何地方飛到世界上任何其他地方,有數百、數千甚至數百萬種不同的組合。

因此,通常這是使用“flight”(例如“Kolkata->Mumbai”)和“trip”(“Kolkdata->Mumbai->London”)建模的。

然后,您的搜索變成了一個網絡遍歷問題:查找從加爾各答到倫敦的所有路線,其中兩腿之間的間隔短於 x 小時。

忽略所有元數據,您可以像這樣設置航班:

create table flight(
flight_id int not null, 
from_airport varchar(5) not null, 
to_airport varchar(5) not null, 
start_time datetime not null, 
  end_time datetime not null);
  
  
  insert into flight
  values
(1, 'KOL', 'MUM', '2021-01-01 00:00:01', '2021-01-01 02:00:01'), 
(2, 'KOL', 'MUC', '2021-01-01 03:00:01', '2021-01-01 08:00:01'), 
(3, 'MUM', 'KOL', '2021-01-01 04:00:01', '2021-01-01 06:00:01'), 
(4, 'KOL', 'MUC', '2021-01-01 05:00:01', '2021-01-01 12:00:01'), 
(5, 'MUM', 'LHR', '2021-01-01 05:00:01', '2021-01-02 02:00:01'), 
(6, 'MUM', 'LHR', '2021-01-03 05:00:01', '2021-01-02 02:00:01'), 
(7, 'MUM', 'LHR', '2020-01-03 05:00:01', '2021-01-02 02:00:01'), 
(8, 'MUM', 'LAX', '2021-01-01 05:00:01', '2021-01-02 02:00:01');

要查找從 KOL 到 LHR 的航班,您可以編寫如下查詢

-- Direct!
select *
from flight
where from_airport = 'KOL'
and to_airport = 'LHR';

-- one stopover
select *, second_leg.start_time - first_leg.end_time as layover_time
from flight first_leg
inner join flight second_leg
  on first_leg.to_airport = second_leg.from_airport
where first_leg.from_airport = 'KOL'
and second_leg.to_airport = 'LHR'
and first_leg.end_time < second_leg.start_time
AND second_leg.start_time - first_leg.end_time between 25000 and 45000;

您可以通過 2 次中途停留來延長此時間,但您不太可能讓人們對 go 進行 3 次中途停留感到高興。

兩表結構怎么樣? flight和飛行flight_station

flight
flight_id  carrier       number
    1      Air India        123
    2      British Air      456

 flight_station
 flight_station_id  stop_number flight_id    station_icao      time
    1                    0              1         CCU          15:30
    2                    1              1         BOM          17:50
    3                    2              1         LHR          08:50
    4                    0              2         EWR          14:00
    5                    1              2         LHR          02:30
    6                    2              2         CCU          07:00

stop_number 0 表示始發點,該航班最大的stop_number表示終點。

你也可以有一個車站表。

station_icao       name              country
  BOM              Mumbai              IN
  CCU              Kolkata             IN
  EWR              Newark              US
  LHR              London Heathrow     GB
  

要找到從孟買到加爾各答的有腿的航班,你可以這樣做

SELECT DISTINCT a.flight_id
  FROM flight_station a
  JOIN flight_station b  
          ON b.stop_number > a.stop_number
         AND a.flight_id = b.flight_id
 WHERE a.station_icao = 'CCU' 
   AND b.station_icao = 'BOM'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM