4

自从我在大学二年级的时候上数据库设计课已经有一段时间了。而且我在此期间没有做过任何设计,所以我的技能目前充其量是生疏的。我已经开始从事一个涉及铁路时刻表系统的个人项目,并且似乎被困在类似于这样的表格设计上 -

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

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

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

除了 Time 字段和 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 对,则查询应返回 Train Number 121,因为它是有效路线。

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

4

3 回答 3

4

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

编辑:我没有考虑这里的转账。你的问题只提到了直行列车。让我知道你是否也想转让。

于 2009-05-27T03:02:22.460 回答
2

我还没有考虑到这一点,所以这个回应可能会很遥远。

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

所以,

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

将描述从华盛顿到巴尔的摩的“跃点”,即跃点网络中的一个边缘。

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

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

不利的一面是车站代码有更多的冗余。我还没有弄清楚这种冗余是否有害。

于 2009-05-27T10:45:13.683 回答
-2

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

"WDC, BAL, NYC"

然后您只需要找到包含您要查找的两个子字符串的火车,在本例中为“WDC”和“NYC”。这大大缩小了您的搜索范围,以至于您可以在 SQL 之外的代码中考虑生成的火车。

如果不做比我现在愿意做的更多的研究,那么你要做的就是

SELECT from where contains "WDC" AND contains "NYC"

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

于 2009-05-27T03:02:02.727 回答