运输时间表系统的数据库设计

问题描述:

自从我在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

我想把你的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

看来你正在试图解决数据库的硬图问题。这可能是更容易的字段添加到列车表,用于存储的站名以字符串形式

"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

我还没有想过这件事,所以这个回应可能会失败。

我认为TrainHopTbl记录网络中的节点,在网络中记录边缘会更有用。边缘会有火车号码,出发站,出发时间,到达站和到达时间。也许像你有一个跳跃指数。

所以,

编号:121,Hopindex:1,DepStnCode:WDC,DepTime:910,ArrStnCode:BAL,ArrTime:1005

形容了来自华盛顿的 “跳” 到巴尔的摩,边缘在啤酒花网络中。

(另外,我会叫跳一“腿”,但是这只是命名的选择。)

通过具有跳扎两个站在一起,就可以链接了一系列的跳跃,让你从在一次旅行中一个地方到另一个地方。如果到达时间稍晚于下一跳的出发时间,某些行程甚至可能涉及换乘火车。

这样做的缺点是在工作站代码中有一点冗余。我还没有弄清楚这种冗余是否有害。