我想做本地做一个模拟的汽车班次查询汽车票的数据库设计?
我自己设计一个数据库,但是我发现查询的时候不太方便,有没有提供一个好的方案?
我设计一个:
汽车表(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
我这样设计,发现我最后查询数据很难查找,请问有好的设计方案?
我自己设计一个数据库,但是我发现查询的时候不太方便,有没有提供一个好的方案?
我设计一个:
汽车表(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
我这样设计,发现我最后查询数据很难查找,请问有好的设计方案?
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)
--*/