《公交车路线查询系统后台数据库设计》由会员分享,可在线阅读,更多相关《公交车路线查询系统后台数据库设计(55页珍藏版)》请在人人文库网上搜索。
1、公交车路线查询系统后台数据库设计-查询算法1. 公交车路线信息在数据库中的存储方式显然,如果在数据库中简单的使用表bus_route( 路线名,路线经过的站点,费用)来保存公交车路线的线路信息,则很难使用查询语句实现乘车线路查询,因此,应该对线路的信息进行处理后再保存到数据库中,笔者使用的方法是用站点-路线关系表stop_route( 站点,路线名,站点在路线中的位置)来存储公交车路线,例如,如果有以下 3条路线R1 : S1-S2-S3-S4-S5R2 : S6-S7-S2-S8R3 : S8-S9-S10则对应的 站点-路线关系表stop_route 为StopRoutePositi on。
2、S1R11S2R12S3R13S4R14S5R15S6R21S7R22S2R23S8R24S8R31S9R32S10R33注:Stop为站点名,Route为路线名,Position为站点在路线中的位置2. 直达乘车路线查询算法基于表stop_route可以很方便实现直达乘车路线的查询,以下是用于查询直达乘车路线的存储过程InquiryTO :create proc In quiryTO(StartStop varchar(32),E ndStop varchar(32)asbeg inselectsr1.Stop as启始站点,sr2.Stop as目的站点,sr1.Route as乘坐线路,。
3、sr2.Positio n-sr1.Position as经过的站点数fromstop_route sr1,stop_route sr2wheresr1.Route=sr2.Routeand sr1.Position in dexbeg insetun it=ltrim(rtrim(substri ng(Stri ng,i ndex,i next-i ndex)if un it0)beg inrollback tran sp1commit tran t1raiserror(插入路线时发生错误,16,1)returnend-插入不存在的站点in sert Stop( name)select di。
4、st inct n ame from stops ss where n ame not in (select n ame from Stop)if(error0)beg inrollback tran sp1commit tran t1raiserror(插入路线时发生错误,16,1)returnendcommit tran t1end插入新地名函数:/*插入新地名name地名Stops:地名附近的所有站点,多个站点用/隔开Remark与地名相关的说明*/CREATE proc In sertSpot(n ame varchar(64),Stops_Str varchar(1024),Rema。
5、rk varchar(1024)asbeg indeclare stops table( name varchar(32)in sert stops select disti net Value fromdbo.SplitStri ng(Stops_Str,/)declare n varchar(32)set n=”select top 1 n=namfpom stops s where namenot in (select namefromstop)if(n)beg inraiserror (站点 s 不存在,16,1, n)returnendin sert into Spot (n ame。
6、,remark) values (n ame,remark)in sert stop_spot(Stop,Spot)select s.n ame, n ame from stops sif(errorr2 .R outeend二次换乘查询:/*查询站点StartStops到站点EndStops之间的二次换乘乘车路线,多个站点用 /分开,如:exec InquiryT2 站点1/站点2,站点3/站点4*/CREATE proc In quiryT2(StartStops varchar(32),E ndStops varchar(32) as beg indeclare ss_tab table。
7、( name varchar(32)declare es_tab table( name varchar(32)in sert ss_tab select Value from dbo.SplitStri ng(StartStops,/)in sert es_tab select Value from dbo.SplitStri ng(E ndStops,/) if(exists(select * from ss_tab sst,es_tab est wheresst. name=est .n ame)beg inraiserror (起点集和终点集中含有相同的站点,16,1)returnen。
8、ddeclare stops table( name varchar(32)in sert stops select n ame from ss_tabin sert stops select n ame from es_tab selectrl.StartStop as启始站点,rl.Route as乘坐路线1,rl.E ndStop as中转站点1,r2.Route as乘坐路线2,r2.EndStop as中转站点2,r3.Route as乘坐路线3,r3.EndStop as目的站点,r1.StopCou nt+r2.StopCou nt+r3.StopCou nt as总站点数fro。
9、mss_tab sst,es_tab est,(select * from RouteTO where En dStop not in (select n ame fromstops) r1,(select * from RouteTO where En dStop not in (select n ame fromstops) r2,RouteTO r3wheresst. name=r1.StartStopand r1.E ndStop=r2.StartStopand r2.E ndStop=r3.StartStopand r3.E ndStop=est. nameand r1.Router。
10、3 .R outeand r3.RouteS2-S3-S4-S5R2: S6-S7-S2-S8R3: S8-S9-S10假如现在要从站点 S1到S7,如果用Inquiry 查询路线,显然没有合适的乘 车方案。但是S2和S7相距仅仅一个站的距离, 可以用步行代替,因此可以 先从S1乘坐R1到S2再步行到S7。为了实现在乘车路线中插入步行路线,在数据库使用WalkRoute(StartStop, En dStop, Dista nee,Remark) (StartStop-起始站点,EndStop- 目的站点,Distanee- 距离Remark-备注)储存距离较近的两个站点。加入表 WalkRo。
11、ute后,查询算法也要作相应的修改,其实WalkRoute和RouteTO很相似,因此只需把 WalkRoute看成是特殊的直达线路即可,修改后的InqueryTI如下:/*查询站点StartStops到站点EndStops之间的一次换乘乘车路线,多个站点用/分开,如:exec InquiryTI 站点1/站点2, 站点3/站点4*/CREATE proc In quiryT1(StartStopsvarchar (32),E ndStops varchar (32)asbegindeclaress_tabtable ( name varchar(32)declarees_tab table(。
12、name varchar(32)in sertss_tab selectValue from dbo.SplitStri ng(StartStops,in sertes_tab selectValue from dbo.SplitStri ng(E ndStops,/)/)if (exists ( select * from ss_tab sst,es_tab estwheresst. name=est .n ame)begin raiserror(起点集和终点集中含有相同的站点 ,16,1)returnenddeclare stops table ( name varchar(32)in s。
13、ertstops select n ame fromss_tabinsertstops select n ame fromes_tabdeclareresult table (StartStopvarchar (32),Route1varchar (256),Tran sStopvarchar (32),Route2varchar (256),En dStopvarchar (32),StopCou ntint)declare co unt int setco un t=0-查询”步行-乘车”路线insert resultRoute1,in ( selectname fromRoute2,ss。
14、t.nameas Startstop, 从+r1.StartStop+ 步行到+r1.EndStop asr1.E ndStopas TransStop,r2.Routeas Route2,est. nameas EndStop,r2.StopCou ntas StopCountfromss_tab sst,es_tab est,( select * from WalkRoute where EndStop not stops) r1,RouteTO r2wheresst. name=r1.StartStopand r1.E ndStop=r2.StartStopand r2.E ndStop。
15、=est. nameorder byr2.StopCo untset co un t=rowco unt-查询”乘车-步行”路线insert resultselectsst.nameas StartStop,r1.Routeas Route1,r1.EndStopas TransStop,从+r2.StartStop+ 步行到+r2.EndStopasest.nameas EndStop,r1.StopCountas StopCountfromss_tab sst,es_tab est,RouteT0 r1,( select * from WalkRoute where StartStop f。
16、rom stops) r2wheresst. name=r1.StartStopand rl.E ndStop=r2.StartStopand r2.E ndStop=est. nameorder by rl.StopCou ntset co un t=co un t+rowco untif (count=O)begin-查询”乘车-乘车”路线in sert resultselectsst. name asStartStop,r1.RouteasRoute1,r1.EndStopas TransStop,r2.RouteasRoute2,est .n ameasEn dStop,r1.StopCount+r2.StopCountas StopCountfromss_tab sst,es_tab est,(select * from RouteT0 whereEndStopnot in ( select namefrom stops) r1,RouteT0 r2wheresst. name=r1.StartStopand r1.E ndStop=r2.StartStopand r2.En dStop=est. nameand r1.Routernfi/T Ltrr 】“收般孟毎2Jrf/236 LtttVM.W吓忏几。
如果觉得《城市公交线路查询系统mysql_公交车路线查询系统后台数据库设计》对你有帮助,请点赞、收藏,并留下你的观点哦!