2009-05-27 76 views
4

自從我在Uni大學二年級學習數據庫設計課程以來,這已經有一段時間了。而且我在這段時間裏還沒有做過任何設計,所以我的技能目前最好是生鏽的。我已經開始在個人項目的工作涉及鐵路時刻表系統,而且似乎在餐桌設計,類似於這樣的事情被卡住 -運輸時間表系統的數據庫設計

StationTbl 
------------ 
    StnName 
    StnCity 
    StnCode - {Primary Key} 

TrainTbl 
--------- 
    TrnName 
    TrnNumber - {Primary Key} 
    SourceStn 
    DestStn 
    DaysofWeek 

TrainHopTbl 
-------------- 
    TrnNumber - {Primary Key} 
    StationCode - {Primary Key} 
    ArrTime 
    DepTime 
    HopIndex 

大部分的項目是alphanumberic與時間字段的異常,HopIndex在TrainHopTbl。正如你所看到的,初步設計非常簡單,而且還沒有完成。

用戶將能夠根據列車名稱/號碼或通過指定來源和目的地站點找到列車。第一個查詢可以很容易地處理,但我在編寫第二個搜索的查詢時出現問題,用戶給出src/dest對並且服務器返回在該路線上運行的列表列表。這些信息將被從TrainHopTbl提取其中包含的跳列表中特定火車,像這樣 -

TrainHopTbl 
-------------- 
Num StnCode ArrTime DepTime HopIndex 
121 WDC  0900  0910  1 
121 BAL  1005  1010  2 
121 NYC  1145  -   3 

如果用戶輸入WDC/NYC作爲源/目標對隨後的查詢應該返回車次121,因爲這是一條有效的路線。

有關數據庫設計的任何指針/鏈接/書籍建議將會有所幫助。哎呀,在這一點上,即使是可運行的查詢或整個重新設計都會很有幫助,因爲我似乎陷入了難以擺脫的尷尬境地,這完全阻礙了我的進步。

+0

+1明確陳述的問題,例子和用例提供。 – 2009-05-27 02:59:50

回答

3

我想把你的SourceStn和DestStn從你的TrainTbl中拿出來 - 這是不必要的混亂。

無論如何,你可以得到你要尋找的搭配:

select 
    src.TrnNumber, 
    srcSt.StnName as SourceStation, 
    srcSt.StnCity as SourceCity, 
    src.DepTime, 
    destSt.StnName as DestinationStation, 
    destSt.StnCity as DestinationCity, 
    dest.ArrTime, 
    (abs(dest.HopIndex - src.HopIndex)) as Stops 
from 
    TrainHopTbl src 
    inner join TrainHopTbl dest on 
     src.TrnNumber = dest.TrnNumber 
    inner join StationTbl srcSt on 
     src.StnCode = srcSt.StationCode 
    inner join StationTbl destSt on 
     dest.StnCode = destSt.StationCode 
where 
    src.StnCode = 'WDC' 
    and dest.StnCode = 'NYC' 
    and src.HopIndex < dest.HopIndex 
order by 
    Stops asc, 
    DepTime asc 

編輯:我還沒有考慮轉讓在這裏。你的問題只提到直線列車。讓我知道你是否也想轉賬。

+0

+1不錯的解決方案。很好地縮小路線,很好地緩存,確保返回的火車進入正確的方向。 – 2009-05-27 03:07:08

-2

看來你正在試圖解決數據庫的硬圖問題。這可能是更容易的字段添加到列車表,用於存儲的站名以字符串形式

"WDC, BAL, NYC" 

然後你只需要找到一個包含兩個子,你正在尋找的列車,在這案例「WDC」和「NYC」。這大大縮小了您的搜索範圍,直到您可以考慮使用SQL之外的代碼生成結果列表。

沒有比我願意現在就做做更多的研究,你做了什麼,然後會做的是

從那裏包含「WDC」選擇幷包含「NYC」

我不知道最好的做法包含...評論任何人?

+1

如果一列火車有20站,該怎麼辦?想一想即使是波士頓的通勤鐵路 - 那也是相當低效的,呃?爲什麼不使用集合事務而不是嘗試在SQL中解析字符串?只要Train#和HopIndex的順序相同,生活應該是桃色敏銳的(不考慮轉移)。 – Eric 2009-05-27 03:04:31

+0

埃裏克,我很抱歉 - 我在「定單交易」中失去了你。謹慎闡述? – aks 2009-05-27 14:15:15

2

我還沒有想過這件事,所以這個迴應可能會失敗。

我認爲TrainHopTbl記錄網絡中的節點,在網絡中記錄邊緣會更有用。邊緣會有火車號碼,出發站,出發時間,到達站和到達時間。也許像你有一個跳躍指數。

所以,

編號:121,Hopindex:1,DepStnCode:WDC,DepTime:910,ArrStnCode:BAL,ArrTime:1005

形容了來自華盛頓的 「跳」 到巴爾的摩,邊緣在啤酒花網絡中。

(另外,我會叫跳一「腿」,但是這只是命名的選擇。)

通過具有跳扎兩個站在一起,就可以鏈接了一系列的跳躍,讓你從在一次旅行中一個地方到另一個地方。如果到達時間稍晚於下一跳的出發時間,某些行程甚至可能涉及換乘火車。

這樣做的缺點是在工作站代碼中有一點冗餘。我還沒有弄清楚這種冗餘是否有害。