公交车路线查询系统后台数据库的设计.doc
文本预览下载声明
公交车路线查询系统后台数据库设计
转自:/lucc/archive/2009/02/21/1395616.htm
一、 查询算法 — 实现站点到站点的换乘路线查询 2
1.1 公交车路线信息在数据库中的存储方式 2
1.2 直达乘车路线查询算法 2
1.3 查询换乘路线算法 3
1.1.1 直达路线视图 3
1.1.2 换乘路线算法 3
1.4 测试 4
二、 关联地名和站点 — 实现通过地名或站点的路线查询 5
1.5 路线和地名信息维护 6
1.1.3 字符串分割函数 6
1.1.4 插入新的公车路线: 7
1.1.5 插入新地名函数: 8
1.6 路线查询 9
1.1.6 直达路线查询: 9
1.1.7 一次换乘查询: 10
1.1.8 二次换乘查询: 11
1.1.9 综合查询: 12
1.1.10 获取地名对应的站点: 12
三、 引入步行路线 — 在乘车路线中插入步行路线 13
四、 换乘算法的改进与优化 — 改进原查询算法,提高其查询效率 17
1.7 “压缩”RouteT0 17
1.8 视图GRouteT0 19
1.9 二次查询算法 20
1.10 测试 24
1.11 效率优化 29
1.12 展开路线组 35
1.13 总结 41
查询算法 — 实现站点到站点的换乘路线查询
公交车路线信息在数据库中的存储方式
显然,如果在数据库中简单的使用表bus_route(路线名,路线经过的站点,费用)来保存公交车路线的线路信息,则很难使用查询语句实现乘车线路查询,因此,应该对线路的信息进行处理后再保存到数据库中,笔者使用的方法是用站点-路线关系表stop_route(站点,路线名,站点在路线中的位置)来存储公交车路线,例如,如果有以下3条路线
R1: S1-S2-S3-S4-S5
R2: S6-S7-S2-S8
R3: S8-S9-S10
则对应的站点-路线关系表stop_route为
Stop Route Position S1 R1 1 S2 R1 2 S3 R1 3 S4 R1 4 S5 R1 5 S6 R2 1 S7 R2 2 S2 R2 3 S8 R2 4 S8 R3 1 S9 R3 2 S10 R3 3 注:Stop为站点名,Route为路线名,Position为站点在路线中的位置
直达乘车路线查询算法
基于表stop_route可以很方便实现直达乘车路线的查询,以下是用于查询直达乘车路线的存储过程InquiryT0:
create proc InquiryT0(@StartStop varchar(32),@EndStop varchar(32))
as
begin
select
sr1.Stop as 启始站点,
sr2.Stop as 目的站点,
sr1.Route as 乘坐线路,
sr2.Position-sr1.Position as 经过的站点数
from
stop_route sr1,
stop_route sr2
where
sr1.Route=sr2.Route
and sr1.Positionsr2.Position
and sr1.Stop=@StartStop
and sr2.Stop=@EndStop
end
查询换乘路线算法
直达路线视图
直达路线视图可以理解为一张存储了所有直达路线的表(如果两个站点之间存在直达路线,那么在直达路线视图中就有一行与之相对应)
create view RouteT0
as
select
sr1.Stop as StartStop, --启始站点
sr2.Stop as EndStop, --目的站点
sr1.Route as Route, --乘坐线路
sr2.Position-sr1.Position as StopCount --经过的站点数
from
stop_route sr1,
stop_route sr2
where
sr1.Route=sr2.Route
and sr1.Positionsr2.Position
换乘路线算法
显然,一条换乘路线由若干段直达路线组成,因此,基于直达路线视图RouteT0可以很方便实现换乘查询,以下是实现一次换乘查询的存储过程InquiryT1:
create proc InquiryT1(@StartStop varchar(32),@EndStop varchar(32))
as
begin
select
r1.StartStop as 启始站点,
r1.Route as 乘坐路线1,
r1.EndStop as 中转站点,
r2.Route
显示全部