资源预览内容
第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
第9页 / 共46页
第10页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
公交车路线查询系统后台数据库设计 - 查询算法1. 公交车路线信息在数据库中的存储方式显然, 如果在数据库中简单的使用表 bus_route( 路线名 ,路线经过的站点 ,费用 ) 来保存公交车路线的线路信息, 则很难使用查询语句实现乘车线路查询, 因此, 应该对线路的信息进行处理后再保存到数据库中,笔者使用的方法是用 站点 - 路线关系表 stop_route( 站点 ,路线名 ,站点在路线中的位置 ) 来存储公交车路线 ,例如,如果有以下 3 条路线R1 : S1-S2-S3-S4-S5R2 : S6-S7-S2-S8R3 : 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 为站点在路线中的位置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.Positionindex begin set unit=ltrim(rtrim(substring(String,index,inext-index) if unit begin insert into res (value,vindex) values (unit,i) set i=i+1 end end set index=inext+1 end return end 插入新的公车路线:/* 插入新的公交车路线Route: 路线名Stops: 公交车经过的所有站点,站点用 - 隔开*/ CREATE proc InsertRoute(Route varchar(32),Stops_Str varchar(1024) as begin declare stops table(name varchar(32),position int) insert stops(name,position) select Value,vIndex from dbo.SplitString(Stops_Str,-) begin tran t1 save tran sp1 - 插入路线信息insert into Route (name) values (Route) if(error0) begin rollback tran sp1 commit tran t1 raiserror( 插入路线时发生错误 ,16,1) return end - 插入不存在的站点insert Stop(name) select distinct name from stops ss where name not in (select name from Stop) if(error0) begin rollback tran sp1 commit tran t1 raiserror( 插入路线时发生错误 ,16,1) return end insert stop_route(Stop,Route,Position) select ss.name,Route,ss.position from stops ss if(error0) begin rollback tran sp1 commit tran t1 raiserror( 插入路线时发生错误 ,16,1) return end commit tran t1 end 插入新地名函数:/* 插入新地名name:地名Stops:地名附近的所有站点,多个站点用 / 隔开Remark:与地名相关的说明*/ CREATE proc InsertSpot( name varchar(64), Stops_Str varchar(1024), Remark varchar(1024) ) as begin declare stops table(name varchar(32) insert stops select distinct Value from dbo.SplitString(Stops_Str,/) declare n varchar(32) set n= select top 1 n=name from stops s where name not in (select name from stop) if(n) begin raiserror ( 站点 %s不存在 ,16,1,n) return end insert into Spot (name,remark) values (name,remark) insert stop_spot(Stop,Spot) select s.name,name from stops s if(error0) begin raiserror ( 插入地点时发生错误 ,16,1) return end end 2. 路线查询在 公交车路线查询系统后台数据库设计查询算法 一文中,使用储存过程 InquiryT0 , InquiryT1 和 InquiryT2 实现了 站点到站点的查询 , 但是地名可能对应多个站点,因此,当进行地点到地点的查询相当于 站点集到站点集 的查询。 因此, 为了支持使用地名进行查询, 将 InquiryT0 , InquiryT1和 InquiryT2 修改为站点集到站点集的查询:直达路线查询:/* 查询站点 StartStops 到站点 EndStops之间的直达乘车路线,多个站点用 /分开,如:exec InquiryT0 站点 1/ 站点 2, 站点 3/ 站点 4 */ CREATE proc InquiryT0(StartStops varchar(32),EndStops varchar(32) as begin declare ss_tab table(name varchar(32) declare es_tab table(name varchar(32) insert ss_tab select Value from dbo.SplitString(StartStops,/) insert es_tab select Value from dbo.SplitString(EndStops,/) if(exists(select * from ss_tab sst,es_tab est where sst.name=est.name) begin raiserror ( 起点集和终点集中含有相同的站点 ,16,1) return end select sst.name as 启始站点 , est.name as 目的站点 , r.Route as 乘坐线路 , r.StopCount as 经过的站点数from ss_tab sst, es_tab est, RouteT0 r where sst.name=r.StartStop and r.EndStop=est.name end 一次换乘查询:/* 查询站点 StartStops 到站点 EndStops之间的一次换乘乘车路线,多个站点用/ 分开,如:exec InquiryT1 站点 1/ 站点 2, 站点 3/ 站点 4 */ CREATE proc InquiryT1(StartStops varchar(32),EndStops varchar(32) as begin declare ss_tab table(name varchar(32) declare es_tab table(name varchar(32) insert ss_tab select Value from dbo.SplitString(StartStops,/) insert es_tab select Value from dbo.SplitString(EndStops,/) if(exists(select * from ss_tab sst,es_tab est where sst.name=est.name) begin raiserror ( 起点集和终点集中含有相同的站点 ,16,1) return end declare stops table(name varchar(32) insert stops select name from ss_tab insert stops select name from es_tab select sst.name as 起始站点 , r1.Route as 乘坐路线 1, r1.EndStop as 中转站点 1, r2.Route as 乘坐路线 2, est.name as 目的站点 , r1.StopCount+r2.StopCount as 总站点数from ss_tab sst, es_tab est, (select * from RouteT0 where EndStop not in (select name from stops) r1, RouteT0 r2 where sst.name=r1.StartStop and r1.EndStop=r2.StartStop and r2.EndStop=est.name and r1.Router2.Route end 二次换乘查询:/* 查询站点 StartStops 到站点 EndStops之间的二次换乘乘车路线,多个站点用/ 分开,如:exec InquiryT2 站点 1/ 站点 2, 站点 3/ 站点 4 */ CREATE proc InquiryT2(StartStops varchar(32),EndStops varchar(32) as begin declare ss_tab table(name varchar(32) declare es_tab table(name varchar(32) insert ss_tab select Value from dbo.SplitString(StartStops,/) insert es_tab select Value from dbo.SplitString(EndStops,/) if(exists(select * from ss_tab sst,es_tab est where sst.name=est.name) begin raiserror ( 起点集和终点集中含有相同的站点 ,16,1) return end declare
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号