地鐵查詢系統的開發已經告一段落了,我想在這裏總結一下關於開發地鐵查詢系統的總過程。git
一、數據庫部分github
數據庫中存在兩張表,一張是站點表(line),屬性包括站點編號(StopID),站點名稱(StopName),站點所屬線路(Line)。第二張表是線路交點表(changestop),屬性包括第一條線路(ID1),第二條線路(ID2),站點名稱(ChangeStopName)。算法
二、情況模擬數據庫
查詢分爲三種狀況。第一種,在同一條線路上的站點,其中包括起始站或終點站都是轉乘點的狀況;第二種,分佈在兩條線上的起始站和終點站,且起始站和終點站所在的線路存在交點;第三種狀況,起始站和終點站在不一樣的兩條線路上,且兩點之間不存在交點,即須要第三條線做爲中轉。spa
三、算法設計設計
第一種狀況中,獲得查詢輸入的起始站和終點站,查詢line表,在兩者的Line屬性相同的狀況下,獲得兩者StopID差值的絕對值便可獲得站數,而後輸出其中的StopName。開發
第二種狀況中,獲得查詢輸入的起始站和終點站,查詢line表,獲得兩者的Line屬性,而後查詢changestop表,將獲得的Line屬性做爲條件查詢獲得it
ChangeStopName屬性的值,而後再回到第一張表line中,以起始站Line屬性和ChangeStopName屬性定位與起始站線路相同的中轉站,而後求出起始站到中轉站的StopName,再以終點站Line屬性和ChangeStopName屬性定位與終點站線路相同的中轉站,求出中轉站到終點站的StopName,最後合併到同一個list中便可。class
第三種狀況中,獲得查詢輸入的起始站和終點站,查詢line表,獲得兩者的Line屬性,而後查詢changestop表,將獲得的Line屬性做爲條件查詢,獲得的值應當爲空。在這種狀況下,咱們應該再次查詢changestop表,將獲得的起始站Line屬性做爲第一條記錄的ID1,將獲得的終點站Line屬性做爲第二條記錄的ID2,求知足第一條記錄ID2等於第二條記錄ID1的線路ID並記錄1。而後依舊在本張表中,以起始站Line屬性做爲ID1,將ID做爲ID2,查詢ChangeStopName,獲得第一個中轉點;而後以ID做爲ID1,將終點站的Line屬性做爲ID2,查詢ChangeStopName,獲得第二個中轉點。而後在line表中,查詢起始站到第一個中轉站的中間站名;以後查詢第一個中轉站到第二個中轉站的中間站名;最後查新第二個中轉站到終點站的站名。最後將三部分放入同一個list中。
總結
四、完成狀態
按照以上規劃,地鐵查詢系統基本完成,但依舊存在許多能夠修改的地方,好比代碼重複的問題在我寫第三種狀況的時候很是嚴重,有幾十行代碼幾乎如出一轍。再好比事實上我對數據庫部分的設計並不滿意,一開始我設計了7個表,6個存放各個站點,但因爲多表查詢過於複雜(事實上我上網查詢相關內容時並無2張表以上的聯合查詢,也幾乎沒有對多張無關聯表的查詢),因此我只好將全部的內容放入一張表中。總之,此次合做開發並不算成功,一樣也暴露出個人許多問題。
五、代碼實現
https://github.com/Evilleon/sjzsubway
注:一、可能這裏我描述會有些不明白,是這樣的,假設我已經查詢出兩條數據,第一條數據的ID1是起始站,第二條數據的ID2是終點站,而後第一條數據的ID2=第二條數據的ID1——我要找的就是這樣的兩條數據。