运输时间表系统的数据库设计
自从我在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,因为这是一条有效的路线。
有关数据库设计的任何指针/链接/书籍建议将会有所帮助。哎呀,在这一点上,即使是可运行的查询或整个重新设计都会很有帮助,因为我似乎陷入了难以摆脱的尴尬境地,这完全阻碍了我的进步。
我想把你的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
编辑:我还没有考虑转让在这里。你的问题只提到直线列车。让我知道你是否也想转账。
+1不错的解决方案。很好地缩小路线,很好地缓存,确保返回的火车进入正确的方向。 – 2009-05-27 03:07:08
看来你正在试图解决数据库的硬图问题。这可能是更容易的字段添加到列车表,用于存储的站名以字符串形式
"WDC, BAL, NYC"
然后你只需要找到一个包含两个子,你正在寻找的列车,在这案例“WDC”和“NYC”。这大大缩小了您的搜索范围,直到您可以考虑使用SQL之外的代码生成结果列表。
没有比我愿意现在就做做更多的研究,你做了什么,然后会做的是
从那里包含“WDC”选择并包含“NYC”
我不知道最好的做法包含...评论任何人?
我还没有想过这件事,所以这个回应可能会失败。
我认为TrainHopTbl记录网络中的节点,在网络中记录边缘会更有用。边缘会有火车号码,出发站,出发时间,到达站和到达时间。也许像你有一个跳跃指数。
所以,
编号:121,Hopindex:1,DepStnCode:WDC,DepTime:910,ArrStnCode:BAL,ArrTime:1005
形容了来自华盛顿的 “跳” 到巴尔的摩,边缘在啤酒花网络中。
(另外,我会叫跳一“腿”,但是这只是命名的选择。)
通过具有跳扎两个站在一起,就可以链接了一系列的跳跃,让你从在一次旅行中一个地方到另一个地方。如果到达时间稍晚于下一跳的出发时间,某些行程甚至可能涉及换乘火车。
这样做的缺点是在工作站代码中有一点冗余。我还没有弄清楚这种冗余是否有害。
+1明确陈述的问题,例子和用例提供。 – 2009-05-27 02:59:50