zoukankan      html  css  js  c++  java
  • 公交车路线查询系统后台数据库设计--引入步行路线

    在《查询算法》和《关联地名和站点》两篇文章中,已经实现了通过地名或站点进行路线查询的算法,但是在现实中,从起点到终点不一定全程都是乘车,例如,有以下3条路线:

    R1: S1->S2->S3->S4->S5

    R2: S6->S7->S2->S8

    R3: S8->S9->S10

    假如现在要从站点S1到S7,如果用Inquiry查询路线,显然没有合适的乘车方案。但是S2和S7相距仅仅一个站的距离,可以用步行代替,因此可以先S1乘坐R1S2再步行到S7

    为了实现在乘车路线中插入步行路线,在数据库使用WalkRoute(StartStop, EndStop, Distance, Remark)(StartStop-起始站点,EndStop-目的站点,Distance-距离,Remark-备注)储存距离较近的两个站点。

    加入表WalkRoute后,查询算法也要作相应的修改,其实WalkRouteRouteT0很相似,因此只需把WalkRoute看成是特殊的直达线路即可,修改后的InqueryT1如下:

    /* 
    查询站点@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 
    
        declare @result table( 
            StartStop varchar(32), 
            Route1 varchar(256), 
            TransStop varchar(32), 
            Route2 varchar(256), 
            EndStop varchar(32), 
            StopCount int 
        ) 
        declare @count int 
        set @count=0 
    
        --查询"步行-乘车"路线 
        insert @result 
        select  
            sst.name as StartStop, 
            ''+r1.StartStop+'步行到'+r1.EndStop as Route1, 
            r1.EndStop as TransStop, 
            r2.Route as Route2, 
            est.name as EndStop, 
            r2.StopCount as StopCount 
        from  
            @ss_tab sst, 
            @es_tab est, 
            (select * from WalkRoute 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 
        order by r2.StopCount 
        set @count=@@rowcount 
    
        --查询"乘车-步行"路线 
        insert @result 
        select  
            sst.name as StartStop, 
            r1.Route as Route1, 
            r1.EndStop as TransStop, 
            ''+r2.StartStop+'步行到'+r2.EndStop as Route2, 
            est.name as EndStop, 
            r1.StopCount as StopCount 
        from  
            @ss_tab sst, 
    
            @es_tab est, 
            RouteT0 r1, 
            (select * from WalkRoute where StartStop not in (select name from @stops)) r2 
        where 
            sst.name=r1.StartStop 
            and r1.EndStop=r2.StartStop 
            and r2.EndStop=est.name 
        order by r1.StopCount 
        set @count=@count+@@rowcount 
         
        if(@count=0) 
        begin 
            --查询"乘车-乘车"路线 
            insert @result 
            select 
                sst.name as StartStop, 
                r1.Route as Route1, 
                r1.EndStop as TransStop, 
                r2.Route as Route2, 
                est.name as EndStop, 
                r1.StopCount+r2.StopCount as StopCount 
            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.Route<>r2.Route 
            order by r1.StopCount+r2.StopCount 
        end 
    
        select 
            StartStop as 起始站点, 
            Route1 as 路线1, 
            TransStop as 中转站点, 
            Route2 as 路线2, 
            EndStop as 目的站点, 
            StopCount as 总站点数 
        from 
            @result 
    end
  • 相关阅读:
    【总结】进程和线程的区别
    为什么要求数据链路层帧的长度必须限制在一定范围内?
    常用正交表
    用正交表设计测试用例
    测试中的杀虫剂困境
    作品集-1:淘宝支付宝登陆框
    # 36氪开放日 • 杭州 • 11月10日 # 谈谈参会感受
    《在你身边,为你设计》读后感
    抱怨的背后
    更快的方式实现PHP数组去重
  • 原文地址:https://www.cnblogs.com/jack-Star/p/3893816.html
Copyright © 2011-2022 走看看