我想做本地做一个模拟的汽车班次查询汽车票的数据库设计?
我自己设计一个数据库,但是我发现查询的时候不太方便,有没有提供一个好的方案?
我设计一个:
汽车表(id,seat,busnumber,type)
路线表(id,boardstation,deststation,mile,time,fullp,halfp)--ID、初始站、目的站、里程、时间、全票价,半票价格
路线详表(id,lineid,stationid,number,time,mile,fullp,halfp)--ID、路线表id、站点id、到站序号、里程、时间、全票价,半票价格
站表(id,name,province,city)--id,名字,省份,城市
调度表(id,carid,lineid,number,gate,starttime,endtime,tict)--id,汽车id,线路id,班次,门号,开始时间,到站时间,票数我根据上车日期查询两个站点(上车站、初始站)之间的车次、上车站、初始站、目的站、终点站、途时、客坐数、上车站id、目的站id
我这样设计,发现我最后查询数据很难查找,请问有好的设计方案?

解决方案 »

  1.   

    邹老大好像有个关于公交查询的例子 去他的BLOG找找
      

  2.   

    获取公交线路起始站点的例
    http://topic.csdn.net/u/20110122/16/368294ae-208a-4da2-a96e-fdb12bce9e0b.html?14747--最短乘车路线查询示例(邹老大的。)
    CREATE TABLE T_Line(
    ID      nvarchar(10),  --公交线路号
    Station nvarchar(10),  --站点名称
    Orders  int)           --行车方向(通过它反应每个站的上一个、下一个站)
    INSERT T_Line 
    SELECT N'8路'  ,N'站A',1 UNION ALL
    SELECT N'8路'  ,N'站B',2 UNION ALL
    SELECT N'8路'  ,N'站C',3 UNION ALL
    SELECT N'8路'  ,N'站D',4 UNION ALL
    SELECT N'8路'  ,N'站J',5 UNION ALL
    SELECT N'8路'  ,N'站L',6 UNION ALL
    SELECT N'8路'  ,N'站M',7 UNION ALL
    SELECT N'20路' ,N'站G',1 UNION ALL
    SELECT N'20路' ,N'站H',2 UNION ALL
    SELECT N'20路' ,N'站I',3 UNION ALL
    SELECT N'20路' ,N'站J',4 UNION ALL
    SELECT N'20路' ,N'站L',5 UNION ALL
    SELECT N'20路' ,N'站M',6 UNION ALL
    SELECT N'255路',N'站N',1 UNION ALL
    SELECT N'255路',N'站O',2 UNION ALL
    SELECT N'255路',N'站P',3 UNION ALL
    SELECT N'255路',N'站Q',4 UNION ALL
    SELECT N'255路',N'站J',5 UNION ALL
    SELECT N'255路',N'站D',6 UNION ALL
    SELECT N'255路',N'站E',7 UNION ALL
    SELECT N'255路',N'站F',8
    GO--乘车线路查询存储过程
    CREATE PROC p_qry
    @Station_Start nvarchar(10),
    @Station_Stop  nvarchar(10)
    AS
    SET NOCOUNT ON
    DECLARE @l int
    SET @l=0
    SELECT ID,Station,
    Line=CAST('('+RTRIM(ID)+': '+RTRIM(Station) as nvarchar(4000)),
    Orders=Orders,
    [Level]=@l
    INTO # FROM T_Line
    WHERE Station=@Station_Start
    WHILE @@ROWCOUNT>0 
    AND NOT EXISTS(SELECT * FROM # WHERE Station=@Station_Stop)
    BEGIN
    SET @l=@l+1
    INSERT #(Line,ID,Station,Orders,[Level])
    SELECT 
    Line=a.Line+CASE
    WHEN a.ID=b.ID THEN N'->'+RTRIM(b.Station)
    ELSE N') ∝ ('+RTRIM(b.ID)
    +N': '+RTRIM(b.Station) END,
    b.ID,b.Station,b.Orders,@l
    FROM # a,T_Line b
    WHERE a.[Level]=@l-1
    AND(a.Station=b.Station AND a.ID<>b.ID
    OR a.ID=b.ID AND(
    a.Orders=b.Orders+1
    OR
    a.Orders=b.Orders-1))
    AND LEN(a.Line)<4000
    AND PATINDEX('%[ >]'+b.Station+'[-)]%',a.Line)=0
    END
    SELECT N'起点站'=@Station_Start
    ,N'终点站'=@Station_Stop
    ,N'乘车线路'=Line+N')' 
    FROM # 
    WHERE [Level]=@l 
    AND Station=@Station_Stop
    IF @@ROWCOUNT =0 --如果未有可以到达的线路,则显示处理结果表备查
    SELECT * FROM #
    GO--调用
    EXEC p_qry N'站A',N'站L'
    /*--结果
    起点站  终点站  乘车线路
    ---------- ------------ -----------------------------------------------------------
    站A    站L    (8路: 站A->站B->站C->站D->站J->站L)
    --*/