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

时间:2009-05-27 02:22:12

标签: sql database-design timetable

我在大学二年级的数据库设计课程已经有一段时间了。我没有在过渡时期做过任何设计,所以我的技能目前至多生锈了。我已经开始涉及一个涉及铁路时刻表系统的个人项目,似乎陷入了类似这样的桌面设计 -

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

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

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

除了时间字段和TrainHopTbl中的HopIndex之外,大多数字段都是字母数字。正如您所看到的,初步设计非常粗糙,远未完成。

用户可以根据列车名称/号码或指定源站和目的站找到列车。第一个查询可以很容易地处理但是我在为第二个搜索编写查询时遇到问题,其中用户给出了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 作为src / dest对,则查询应返回列车号121,因为它是有效路线。

有关数据库设计的任何指针/链接/书籍建议都会有所帮助。哎呀,在这一点上,即使是可运行的查询或整个重新设计也会有所帮助,因为我似乎陷入了一种难以摆脱的困境,这完全阻碍了我的进步。

3 个答案:

答案 0 :(得分: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

编辑:我没有在这里考虑转移。你的问题只提到了直线列车。如果您想要转账,请告诉我。

答案 1 :(得分:2)

我还没有考虑到这一点,所以这种反应可能会有所不同。

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

所以,

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

将描述从华盛顿到巴尔的摩的“跳跃”,这是啤酒花网络中的一个优势。

(另外,我称之为“腿”,但这只是命名选择。)

通过让啤酒花将两个工位连接在一起,可以连接一系列啤酒花,让您在一次旅行中从一个地方到另一个地方。有些旅行甚至可能涉及将火车换成某个车站,前提是到达时间稍早于下一站的出发时间。

这方面的缺点是站点代码有一点冗余。我还没弄清楚这种冗余是否有害。

答案 2 :(得分:-2)

您似乎正在尝试解决数据库的硬图问题。将字段添加到以字符串形式存储停靠列表的列表中可能要容易得多

"WDC, BAL, NYC"

然后你只需要找到包含你正在寻找的两个子串的列车,在这种情况下是“WDC”和“NYC”。这会大大缩小您的搜索范围,直到您可以在SQL之外的代码中考虑结果列车。

如果没有比我现在愿意做更多的研究,你所做的就是

SELECT from where contains“WDC”AND包含“NYC”

我不知道做包含的最佳方式...评论任何人?