公交路线关系数据库

时间:2019-06-16 22:02:56

标签: tsql database-design

我正在尝试为公交路线建立一个关系数据库,这是我的数据库:

BusRoutes: RouteId, RouteNumber

BusStops: StopId, StopName

BusRouteStops: Id, RouteId, StopId, StopOrder, ArrivalTime, DepartureTime, Distance

BusRoutes:
1   RouteO
2   RouteP
3   RouteQ
4   RouteR
5   RouteS

BusStops:
1   Stop A
2   Stop B
3   Stop C
4   Stop D
5   Stop E
6   Stop F
7   Stop G
8   Stop H
9   Stop I
10  Stop J
11  Stop K

BusRouteStops:
1   1   1   10  05:00:00    05:01:00    0.00
2   1   2   20  05:15:00    05:16:00    1.00
3   1   3   30  05:30:00    05:31:00    1.00
4   1   4   40  05:45:00    05:45:00    1.00
5   1   5   50  06:00:00    06:00:00    1.00
7   2   3   10  06:00:00    06:00:00    0.00
11  2   6   20  06:10:00    06:11:00    0.70
12  2   7   30  06:20:00    06:21:00    0.70
13  2   8   40  06:30:00    06:31:00    0.70
15  3   5   10  05:15:00    05:16:00    0.00
16  3   4   20  05:30:00    05:31:00    1.00
17  3   3   30  05:45:00    05:46:00    1.00
18  3   2   40  06:00:00    06:01:00    1.00
19  3   1   50  06:15:00    06:16:00    1.00
20  4   8   10  07:00:00    07:01:00    0.00
21  4   7   20  07:10:00    07:11:00    0.70
22  4   6   30  07:20:00    07:21:00    0.70
23  4   3   40  07:30:00    07:31:00    0.70

查找站点“ A到D”,“ D到A”,“ C到H”和“ H到C”之间的直接路线不是问题。 例如,要找到“ A到D”或“ D到A”,我可以执行以下SQL

SELECT * FROM BusRouteStops WHERE StopId=1
UNION
SELECT * FROM BusRouteStops WHERE StopId=4
ORDER BY BusRouteStops.RouteId, StopOrder

我将得到以下结果。在此SQL中,A到D也将D到A路由返回,但是使用一些编码逻辑,我将能够根据StopOrder字段找到正确的代码(在这里我可以执行检查FromStation stoporder应该低于ToStation StopOrder)

我是否可以通过查询正确的SQL消除该检查?

1   1   1   10  05:00:00.0000000    05:01:00.0000000    0.00
16  1   4   20  05:30:00.0000000    05:31:00.0000000    1.00
4   1   4   40  05:45:00.0000000    05:45:00.0000000    1.00
19  1   1   50  06:15:00.0000000    06:16:00.0000000    1.00

我的挑战是在找不到直接路线时找到路线。

例如,如果我要查找路线“ A到G”,如何制作SQL? 我需要得到这样的结果: 步骤1:从“ A到C”乘坐RouteQ 步骤2:将RouteP从“ C转到G”

如果我这样执行SQL:

SELECT * FROM BusRouteStops WHERE StopId=1
UNION
SELECT * FROM BusRouteStops WHERE StopId=7
ORDER BY BusRouteStops.RouteId, StopOrder

它只会这样返回:

1   1   1   10  05:00:00.0000000    05:01:00.0000000    0.00
19  1   1   50  06:15:00.0000000    06:16:00.0000000    1.00
21  2   7   20  07:10:00.0000000    07:11:00.0000000    0.70
12  2   7   30  06:20:00.0000000    06:21:00.0000000    0.70

它只会显示两条路径,其中StopId 1或7是其中的一部分。 我没有任何迹象表明这两个路线都有一个共同的站点,即C(StopId = 3)

如何执行一条给我该指示的SQL语句?

我当然简化了,在最终版本中,一条路线可以有50多个站点。有些路线只有一个共同点,而其他路线则有一个以上与其他路线共同点。

希望您能帮助我找到解决方案。

0 个答案:

没有答案