公交车路线查询系统后台数据库设计—路线查询

1. 公交车路线信息在数据库中的存储方式

显然,如果在数据库中简单的使用表bus_route(路线名,路线经过的站点,费用)来保存公交车路线的线路信息,则很难使用查询语句实现乘车 线路查询,因此,应该对线路的信息进行处理后再保存到数据库中,笔者使用的方法是用站点-路线关系表stop_route(站点,路线名,站点在路线中的 位置)来存储公交车路线,例如,如果有以下3条路线

复制   保存
R1: S1->S2->S3->S4->S5
R2: S6->S7->S2->S8
R3: S8->S9->S10


则对应的站点-路线关系表stop_route为

StopRoutePosition
S1R11
S2R12
S3R13
S4R14
S5R15
S6R21
S7R22
S2R23
S8R24
S8R31
S9R32
S10R33


注:Stop为站点名,Route为路线名,Position为站点在路线中的位置


2.直达乘车路线查询算法

基于表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.Position<sr2.Position
and sr1.Stop=@StartStop
and sr2.Stop=@EndStop
end



3.查询换乘路线算法

(1)直达路线视图

直达路线视图可以理解为一张存储了所有直达路线的表(如果两个站点之间存在直达路线,那么在直达路线视图中就有一行与之相对应)

复制   保存
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.Position<sr2.Position



(2)换乘路线算法

显然,一条换乘路线由若干段直达路线组成,因此,基于直达路线视图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 as 乘坐路线2,
r2.EndStop as 目的站点,
r1.StopCount+r2.StopCount as 总站点数
from
RouteT0 r1,
RouteT0 r2
where
r1.StartStop=@StartStop
and r1.EndStop=r2.StartStop
and r2.EndStop=@EndStop
end


同理可以得到二次换乘的查询语句

复制   保存
create
 proc
 InquiryT2(@StartStop
 varchar
(32),@EndStop
 varchar
(32))
as
begin
select
r1.StartStop as 启始站点,
r1.Route as 乘坐路线1,
r1.EndStop as 中转站点1,
r2.Route as 乘坐路线2,
r2.EndStop as 中转站点2,
r3.Route as 乘坐路线3,
r3.EndStop as 目的站点,
r1.StopCount+r2.StopCount+r3.StopCount as 总站点数
from
RouteT0 r1,
RouteT0 r2,
RouteT0 r3
where
r1.StartStop=@StartStop
and r1.EndStop=r2.StartStop
and r2.EndStop=r3.StartStop
and r3.EndStop=@EndStop
end



3.测试

复制   保存
exec
 InquiryT0 'S1'
,'S2'

exec InquiryT1 'S1' ,'S8'
exec InquiryT2 'S1' ,'S9'



运行结果:
单击显示全图,Ctrl+滚轮缩放图片

数据库下载
http://files.cnblogs.com/lucc/bris.zip

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值