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

上传人:飞*** 文档编号:26985583 上传时间:2018-01-04 格式:PDF 页数:46 大小:1.53MB
返回 下载 相关 举报
公交车路线查询系统后台数据库设计_第1页
第1页 / 共46页
公交车路线查询系统后台数据库设计_第2页
第2页 / 共46页
公交车路线查询系统后台数据库设计_第3页
第3页 / 共46页
公交车路线查询系统后台数据库设计_第4页
第4页 / 共46页
公交车路线查询系统后台数据库设计_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《公交车路线查询系统后台数据库设计》由会员分享,可在线阅读,更多相关《公交车路线查询系统后台数据库设计(46页珍藏版)》请在金锄头文库上搜索。

1、公交车路线查询系统后台数据库设计 - 查询算法1. 公交车路线信息在数据库中的存储方式显然, 如果在数据库中简单的使用表 bus_route( 路线名 ,路线经过的站点 ,费用 ) 来保存公交车路线的线路信息, 则很难使用查询语句实现乘车线路查询, 因此, 应该对线路的信息进行处理后再保存到数据库中,笔者使用的方法是用 站点 - 路线关系表 stop_route( 站点 ,路线名 ,站点在路线中的位置 ) 来存储公交车路线 ,例如,如果有以下 3 条路线R1 : S1-S2-S3-S4-S5R2 : S6-S7-S2-S8R3 : S8-S9-S10则对应的 站点 - 路线关系表 stop_r

2、oute 为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 varc

3、har(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

4、,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 Val

5、ue,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 na

6、me 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 插入新

7、地名函数:/* 插入新地名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= se

8、lect 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

9、. 路线查询在 公交车路线查询系统后台数据库设计查询算法 一文中,使用储存过程 InquiryT0 , InquiryT1 和 InquiryT2 实现了 站点到站点的查询 , 但是地名可能对应多个站点,因此,当进行地点到地点的查询相当于 站点集到站点集 的查询。 因此, 为了支持使用地名进行查询, 将 InquiryT0 , InquiryT1和 InquiryT2 修改为站点集到站点集的查询:直达路线查询:/* 查询站点 StartStops 到站点 EndStops之间的直达乘车路线,多个站点用 /分开,如:exec InquiryT0 站点 1/ 站点 2, 站点 3/ 站点 4 */

10、 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

11、_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

12、到站点 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_

13、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

14、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.

15、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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 技术指导

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号