公交车路线查询系统后台数据库设计--关联地名和站点

转:http://www.cnblogs.com/lucc/archive/2009/02/14/1390384.html

在《公交车路线查询系统后台数据库设计——查询算法》一文中,已经实现了查询站点到站点的路线查询算法,但是,现实中用户不一定使用站点进行查询,而是使用地名。因此,公交车查询系统数据库必需记录地名与站点的对应关系,在查询时将地名映射为站点。根据实际情况,某一地点附近通常有几个站点,因此,地名与站点之间是多对多的关系。显然,只需创建一个地名站点关系表stop_spot(Stop,Spot)用于储存这个关系即可。数据库关系图如下:

 

注:

Route:路线表 
Stop
:站点表 
Spot
:地名表 
stop_route
 路线-站点关系表 
stop_spot
:地名-站点关系表

1.路线和地名信息维护:

以下函数用于维护公交车路线和地名的相关信息

字符串分割函数(信息处理及路线查询的存储过程都需要使用到该函数: 

/*
函数功能:将@String以@SplitChar为分隔点分割为字符串数组,结果保留在表变量中
例如SplitString('A/B','/')返回表:
Value vindex
A       1
B       2
*/
CREATE   function SplitString(
    @String varchar(2048),
    @SplitChar char
)
returns @res table(
    Value varchar(128),
    vindex int
)
as
begin
    declare @index int,@unit varchar(128),@inext int,@len int,@i int
    set @index=1
    set @i=1
    set @len=len(@String)
    while @index<=@len
    begin
        set @inext=charindex(@SplitChar,@String,@index)
        if @inext=0 set @inext=@len+1
        if @inext>@index
        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(@@error<>0)
    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(@@error<>0)
    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(@@error<>0)
        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(@@error<>0)
    begin
        raiserror ('插入地点时发生错误',16,1)
        return
    end
end 

2.路线查询

在《公交车路线查询系统后台数据库设计——查询算法》一文中,使用储存过程InquiryT0InquiryT1InquiryT2实现了站点到站点的查询,但是地名可能对应多个站点,因此,当进行地点到地点的查询相当于站点集到站点集的查询。因此,为了支持使用地名进行查询,将InquiryT0InquiryT1InquiryT2修改为站点集到站点集的查询:

直达路线查询: 

/*
查询站点@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.Route<>r2.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 @stops table(name varchar(32))
    insert @stops select name from @ss_tab
    insert @stops select name from @es_tab
    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
        @ss_tab sst,
        @es_tab est,
        (select * from RouteT0 where EndStop not in (select name from @stops)) r1,
        (select * from RouteT0 where EndStop not in (select name from @stops)) r2,
        RouteT0 r3
    where
        sst.name=r1.StartStop
        and r1.EndStop=r2.StartStop
        and r2.EndStop=r3.StartStop
        and r3.EndStop=est.name
        and r1.Route<>r2.Route
        and r2.Route<>r3.Route
        and r3.Route<>r1.Route
end

综合查询: 

/*
查询站点@StartStops到站点@EndStops之间的乘车路线,先查询直达路线,
如不存在,则查询一次换乘路线,如果直达和一次换乘均不存在,则查询二次换乘
多个站点用'/'分开,如:
exec Inquiry  '站点1/站点2','站点3/站点4'
*/
CREATE  proc Inquiry(@StartStops varchar(32),@EndStops varchar(32))
as
begin
    exec InquiryT0 @StartStops,@EndStops
    if(@@rowcount=0)
    begin
        exec InquiryT1 @StartStops,@EndStops
        if(@@rowcount=0)
        begin
            exec InquiryT2 @StartStops,@EndStops
        end
    end
end

如要进行地名到地名的路线查询,必需先调用GetStopsOfSpot获取地名对应的所有站点,在调用Inquiry进行查询。 

获取地名对应的站点: 

/*
获取地名对应的站点,如有多个站点,用'/'隔开
*/
CREATE   function GetStopsOfSpot(@Spot varchar(32))
returns varchar(1024)
as
begin
    declare @stops varchar(1024)
    set @stops=''
    select @stops=@stops+'/'+stop from stop_spot where Spot=@Spot
    return substring(@stops,2,len(@stops)-1)
end 

使用地名查询乘车路线示例:

declare @sps varchar(1024),@eps varchar(1024)
set @sps=dbo.GetStopsOfSpot('起始地点名称')
set @eps=dbo.GetStopsOfSpot('目的地点名称')
exec Inquiry @sps,@eps


公交线路查询系统数据库设计 公交线路查询系统数据库设计   随着城市规划建设的持续展开,公交线路发展速度越来越快,城市公交系统规模日 益复杂。由于城市公交数量的增多,进而带来了道路拥堵、环境污染和交通事故频发的 问题。由此,公共交通工具在为城市人们提供便捷交通的同时,也出现了很多严重困扰 城市发展的问题。   摘要】随着城市规划建设的发展,城市人口数量的持续激增,城市公交由于其价格 低廉、安全稳定、乘坐方便、线路数量多、环境污染小等特征,成为了城市人们出行的 首选交通方式。本文针对公交线路查询系统,提出了系统数据库设计方案,方便城市 人们出行之前准确查询公交线路。   关键词】公交线路,线路查询,数据库设计   1引言   城市公交线路变换频发、信息量丰富,如果人们只能利用传统的公交线路图查阅方 式来获取公交线路信息,难以确保公交线路信息的准确性,无法掌握最优的乘车路线。 因此,本文基于公交线路查询系统,提出了数据库设计方案,从根本上解决了公交线 路查询的弊端问题,便于人们在出现之前获取到最优的路线信息,节约了人们的出行时 间,又降低了城市公交的运输压力,有利于城市环境污染的治理。   2公交线路查询系统数据库E-R图设计   本文在基于公交线路查询系统的基础上,给出了系统数据库设计方案,选择SQLS erver作为系统后台数据库开发工具,SQLServer功能完善,操作简单,安全性好,能够 防止非法分子恶意入侵数据库,适合用于查询系统数据库的开发。在公交线路查询系统 数据库设计过程中,要针对数据字典中的数据信息存储形式进行分析,得到系统数据的 关系模式。因此,本文选用E-R图来实现数据库结构分析,公交线路查询系统数据库E- R图如图1、图2、图3所示:   图1线路属性实体   图2公交线路实体   图3管理员实体   3公交线路查询系统数据库设计   3.1公交站台表   公交站台表负责记录公交站台的相关属性,根据系统开发需求,每个公交站台最多 可以容纳8条公交线路同时通过,为了确保后期系统的良好扩展,本表设计为可以容纳2 0条公交线路。公交站台线路的数据库格式是:线路1ID、线路2ID,#表示线路结束。   3.2公交线路表   为了保证系统后期扩展应用,公交线路站台设计为50个站点,实际公交线路站点 数量为28个,公交所经站台的数据库格式为:站台1ID、站台2ID,#表示站台结束。如果 分段标记为0,代表公交按照统一价格收费;如果分段标记设置为1,代表公交采用分段 计价方式。   3.3操作人员表   操作人员数据库表对操作人员的权限进行了规定,0代表操作人员没有权限,1代表 操作人员具有权限。其中,位数与操作人员的权限关系为:1、公交线路查询;2、公交 线路增加;3、公交线路修改;4、公交线路删除;5、增加公交站台;6、修改公交站台 ;7、删除公交站台;8、发布公交线路通知;9、发布公交站台通知,同时保留剩余的7 位数。   3.4操作日志表   操作日志数据库表中记录了操作人员的全部操作记录和操作时间,用于查询历史操 作记录,分清每名操作人员的工作责任。   4数据库的完整性和安全性设计   4.1数据库完整性设计   数据库完整性指的是要保证系统数据库中的数据正确和相容。DBMS数据库管理系统 采用相应机制来检测数据库中存储的数据信息是否能够满足完整性的规定条件,其规定 的条件是语义的体现。公交线路查询系统数据库设计中,定义了数据库表之间的联系 方式,有助于实现数据库的完整性,能够在正常使用中控制数据库的完整性。   4.2数据库安全性设计   数据库安全性指的是能够确保数据库不被非法入侵者恶意破坏,造成数据库数据信 息的丢失、篡改和泄露。公交线路查询系统中存储了海量数据信息,可以为不同用户提 供统一的资源共享,因此,数据库安全性设计更加重要,本文采用了用户授权、身份认 证和数据加密的方式,确保数据库中的重要信息不被非法人员恶意窃取。   5数据库设计相关说明   由于每条公交线路都拥有多个公交站台,每个公交站台又同属于多条公交线路,因 此,数据库设计中不能采用外键机制来确保公交线路(ALLLINES)和公交站台(ALLSTA TIONS)的正确性。本文选用了添加确认功能模块的方式,由系统后台程序负责实现外键 机制。   (1)当增加、修改和删除公交线路数据库表中的公交站台(ALLSTAIONS)字段时, 需要调用confirmStation模块;对公交站台数据库表进行查询时,遇到,则继续查询, 遇到#表示查询结束,一旦发现存在不合法的公交站台DI,要立刻拒绝操作并给出提示, 公交站台修改流程如图4所示:   (2)同理,如果需要对公交线路数据库表(ALLLINES)进行修改时,操作流程如下 :
公交线路查询系统数据库设计 【摘 要】随着城市规划建设的发展,城市人口数量的持续激增,城市公交由于其价格低廉、 安全稳定、乘坐方便、线路数量多、环境污染小等特征,成为了城市人们出行的首选交 通方式。本文针对公交线路查询系统,提出了系统数据库设计方案,方便城市人们出 行之前准确查询公交线路。 【关键词】公交线路;线路查询数据库设计 1 引言 随着城市规划建设的持续展开,公交线路发展速度越来越快,城市公交系统规模日益 复杂。由于城市公交数量的增多,进而带来了道路拥堵、环境污染和交通事故频发的问 题。由此,公共交通工具在为城市人们提供便捷交通的同时,也出现了很多严重困扰城 市发展的问题。城市公交线路变换频发、信息量丰富,如果人们只能利用传统的公交线 路图查阅方式来获取公交线路信息,难以确保公交线路信息的准确性,无法掌握最优的 乘车路线。因此,本文基于公交线路查询系统,提出了数据库设计方案,从根本上解 决了公交线路查询的弊端问题,便于人们在出现之前获取到最优的路线信息,节约了人 们的出行时间,又降低了城市公交的运输压力,有利于城市环境污染的治理。 2 公交线路查询系统数据库E-R图设计 本文在基于公交线路查询系统的基础上,给出了系统数据库设计方案,选择SQL Server作为系统后台数据库开发工具,SQL Server功能完善,操作简单,安全性好,能够防止非法分子恶意入侵数据库,适合用于 查询系统数据库的开发。在公交线路查询系统数据库设计过程中,要针对数据字典中的 数据信息存储形式进行分析,得到系统数据的关系模式。因此,本文选用E- R图来实现数据库结构分析,公交线路查询系统数据库E-R图如图1、图2、图3所示: 图1 线路属性实体 图2 公交线路实体 图3 管理员实体 3 公交线路查询系统数据库设计 3.1 公交站台表 公交站台表负责记录公交站台的相关属性,根据系统开发需求,每个公交站台最多可 以容纳8条公交线路同时通过,为了确保后期系统的良好扩展,本表设计为可以容纳20条 公交线路。公交站台线路的数据库格式是:线路1ID、线路2ID……,#表示线路结束。 3.2 公交线路表 为了保证系统后期扩展应用,公交线路站台设计为50个站点,实际公交线路站点数 量为28个,公交所经站台的数据库格式为:站台1ID、站台2ID……,#表示站台结束。如果 分段标记为0,代表公交按照统一价格收费;如果分段标记设置为1,代表公交采用分段 计价方式。 3.3 操作人员表 操作人员数据库表对操作人员的权限进行了规定,0代表操作人员没有权限,1代表操 作人员具有权限。其中,位数与操作人员的权限关系为:1、公交线路查询;2、公交线 路增加;3、公交线路修改;4、公交线路删除;5、增加公交站台;6、修改公交站台; 7、删除公交站台;8、发布公交线路通知;9、发布公交站台通知,同时保留剩余的7位 数。 3.4 操作日志表 操作日志数据库表中记录了操作人员的全部操作记录和操作时间,用于查询历史操作 记录,分清每名操作人员的工作责任。 4 数据库的完整性和安全性设计 4.1 数据库完整性设计 数据库完整性指的是要保证系统数据库中的数据正确和相容。DBMS数据库管理系统采 用相应机制来检测数据库中存储的数据信息是否能够满足完整性的规定条件,其规定的 条件是语义的体现。公交线路查询系统数据库设计中,定义了数据库表之间的联系方 式,有助于实现数据库的完整性,能够在正常使用中控制数据库的完整性。 4.2 数据库安全性设计 数据库安全性指的是能够确保数据库不被非法入侵者恶意破坏,造成数据库数据信息 的丢失、篡改和泄露。公交线路查询系统中存储了海量数据信息,可以为不同用户提供 统一的资源共享,因此,数据库安全性设计更加重要,本文采用了用户授权、身份认证 和数据加密的方式,确保数据库中的重要信息不被非法人员恶意窃取。 5 数据库设计相关说明 由于每条公交线路都拥有多个公交站台,每个公交站台又同属于多条公交线路,因此 ,数据库设计中不能采用外键机制来确保公交线路(ALL LINES)和公交站台(ALL STATIONS)的正确性。本文选用了添加确认功能模块的方式,由系统后台程序负责实现 外键机制。 (1)当增加、修改和删除公交线路数据库表中的公交站台(ALL STAIONS)字段时,需要调用confirm Station模块;对公交站台数据库表进行查询时,遇到","则继续查询,遇到"#"表示查 询结束,一旦发现存在不合法的公交站台DI,要立刻拒绝操作并给出提示,公交站台修 改流程如图4所示: (2)同理,如果需要对公交线路数据库表(ALL LINES)进行修改时,操作流程如下: 图4 公交站台修改流程图 6 结论 综上所述,本文基于公交线路查询系统提出了系统数据库的设
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值