资源描述
民航订票管理系统
13
2020年4月19日
文档仅供参考,不当之处,请联系改正。
实验十三 数据库管理系统综合应用
-------民航订票管理系统
一、 实验目的:
经过完成从用户需求分析、数据库设计到上机编程、调试和应用等全过程,进一步了解和掌握所讲解的内容。
二、 实验简述:
民航订票系统主要分为机场、航空公司和客户三方的服务。航空公司提供航线和飞机的资料,机场则对本机场起飞和降落的航班和机票进行管理,而客户能得到的服务应该有航班线路和剩余票数的查询,以及网上订票等功能。客户又能够分为两类,一类是普通客户,对于普通客户只有普通的查询功能和订票功能,没有相应的机票优惠,另一种是经常旅客,需要办理注册手续,但增加了里程积分功能和积分优惠政策。机场还要紧急应对措施,在航班出现延误时,要发送相应的信息。
三、 实验要求:
完成该系统的数据库设计;
用SQL实现数据库的设计,并在SQL Server上调试经过。
四、 参考答案:
1、 需求分析
(1) 航空公司
航空公司的操作流程如图C.1所示。
(2) 客户
客户的操作流程如图C.2所示。
(3) 机场
机场的任务是根据航空公司提供的航线和飞机,安排航班,以及航班的机票。如果出现晚点等情况,要记录并发送信息,对特殊客户记录其消费信息,并相应提供优惠。
(4) 客户订票
客户订票涉及到多个因素:由客户提出订票申请;由机场管理航班机票;对于特殊客户,除给予票价优惠以外,还要累计里程;订票后需判断是否超员。这些因素涉及到客户资料、航班资料以及由航空公司提供的航线(里程)和飞机(座位数)资料中所提供的相关数据。
客户订票的操作流程如图C.3所示。
2、 概念模型设计
数据库需要表述的信息有以下几种:
(1) 航空公司信息
(2) 客户信息
(3) 飞机信息
(4) 航线信息
(5) 航班信息
(6) 订票信息
(7) 特殊客户积分
能够用E/R模型表述该模型的设计,E/R图如图C.4所示。
3、 逻辑设计
经过E/R模型到关系模型的转化,能够得到如下关系模式:
(1)Airline(AID, Name, Addr, Cont)
(2)Customer(CID, Name, Cont, IsSpec, Points)
(3)Plane(PID, Type, SeatsNum, AID)
(4)Line(LID, SPosition, EPosition, Distance, AID)
(5)Flight(FID, PID, LID, Ftime, Price)
(6)BookTicket(BID, FID, CID, Pay)
每个关系模式的键码都用下划线标出。外键码用斜体标出。
4、 物理设计
为了提高在表中搜索元组的速度,在实际实现的时候应该基于键码建立索引。下面各表中建立索引的表项。
(1)Airline(AID)
(2)Customer(CID)
(3)Plane(PID)
(4)Line(LID)
(5)Flight(FID)
(6)BookTicket(BID)
5、 用SQL实现设计
(1) 建立航空公司表
CREATE TABLE Airline(
AID varchar(20) PRIMARY KEY,
Name varchar(100) NOT NULL,
Addr varchar(100),
Cont varchar(200)
);
(2) 建立客户表
CREATE TABLE Customer(
CID varchar(20) PRIMARY KEY,
Name varchar(50) NOT NULL,
Cont varchar(200),
IsSpec char(1) NOT NULL DEFAULT ‘N’,
Points int NOT NULL DEFAULT 0
);
(3) 建立飞机信息表
CREATE TABLE Plane(
PID varchar(20) PRIMARY KEY,
Type varchar(50) NOT NULL,
SeatsNum int NOT NULL,
AID varchar(20), CONSTRAINT FK_PLANE_AID
FOREIGN KEY(AID) REFERENCES Airline(AID)
);
(4) 建立航线表
CREATE TABLE Line (
LID varchar(20) PRIMARY KEY,
SPosition varchar(100) NOT NULL,
EPosition varchar(100) NOT NULL,
Distance real NOT NULL
AID varchar(20), CONSTRAINT FK_LINE_AID
FOREIGN KEY(AID) REFERENCES Airline(AID)
);
(5) 建立航班表
CREATE TABLE Flight(
FID varchar(20) PRIMARY KEY,
Ftime datetime NOT NULL,
PID varchar(20), CONSTRAINT FK_FLIGHT_PID
FOREIGN KEY(PID) REFERENCES Plane(PID)
LID varchar(20), CONSTRAINT FK_FLIGHT_LID
FOREIGN KEY(LID) REFERENCES Line(LID)
Price real NOT NULL
);
(6) 建立订票表
CREATE TABLE BookTicket (
BID int IDENTITY(1,1) PRIMARY KEY,
FID varchar(20), CONSTRAINT FK_BOOKTICKET_FID
FOREIGN KEY(FID) REFERENCES Flight(FID)
CID varchar(20), CONSTRAINT FK_ BOOKTICKET _CID
FOREIGN KEY(CID) REFERENCES CustomerCID)
Pay real NOT NULL
);
(7) 航空公司操作
1) 注册
INSERT INTO Airline(AID, Name, Addr, Cont)
VALUES(#AID, #Name, #Addr, #Cont);
这里的#AID必须是惟一的,否则不能够插入到数据库中.
2) 注销
DELETE FROM Airline WHERE(AID = #AID);
3) 修改公司信息
UPDATE Airline
SET Name=#Name, Addr= #Addr, Cont= #Cont WHERE(AID = #AID);
4) 增加飞机
INSERT INTO Plane(PID, Type, SeatsNum, AID)
VALUES(#PID, #Type, #SeatsNum, #AID);
5) 删除飞机
DELETE FROM Plane WHERE(PID = #PID);
6) 修改飞机
UPDATE Plane
SET Type= #Type, SeatsNum= #SeatsNum WHERE(PID = #PID);
7) 增加航线
INSERT INTO Line(LID, SPosition, EPosition, Distance, AID)
VALUES(#LID, #SPosition, #EPosition, #Distance, #AID);
8) 删除航线
DELETE FROM Line WHERE(LID = #LID);
9) 修改航线
UPDATE Line
SET SPosition=#SPosition, EPosition=#EPosition, Distance= #Distance WHERE(PID = #PID);
(8) 客户
1) 注册
INSERT INTO Customer(CID, Name, Cont)
VALUES(#CID, #Name, #Cont);
客户注册的时候,CID必须是惟一的,否则不能够插入数据库。
2) 注销
DELETE FROM Customer WHERE(CID = #CID);
3) 修改个人信息
UPDATE Line
SET Name= #Name, Cont= #Cont WHERE(CID = #CID);
4) 订票
CREATE PROC Book_Ticket
@FID varchar(20),
@CID varchar(6)
AS
DECLARE @TransName VARCHAR(20)
SELECT @ TransName=’Book_Ticket’
BEGIN TRANSACTION @TransName
DECLARE @booked int, @seat int, @IsSpec char(1)
DECLARE @distance real, @discount real, @dist real, @price real
----查看客户是否为特殊客户,如果不是,票价不打折扣。
----否则如果客户累计航程超过10万公里,票价打九折;超过20公里,打八折。
----下面的程序用来计算折扣
SELECT @IsSpec=IsSpec, @distance=Points
FROM Customer WHERE CID=@CID
SELECT @discount=1
IF @IsSpec=’Y’
BEGIN
IF @distance> 00
SELECT @distance=0.8
ELSE IF @distance>100000
SELECT @distance=0.9
END
----选择出票价
SELECT @price= Price FROM Flight WHERE FID=@FID
----加入客户订票信息
INSERT INTO BookTicket(FID, CID, Pay)
VALUES(@FID, @CID, @price*@discount)
----将客户新订票里程的信息累计到用户信息里面
SELECT @dist= Distance FROM Line
WHERE LID=(SELECT LID FROM Flight WHERE FID=@FID)
UPDATE Customer
SET Points= Points+@dist WHERE(CID = #CID);
----查看客户订票后,是否超过可容纳的座位数目,如果超过,取消所有操作。
SELECT @seats=SeatsNum FROM Plane
WHERE PID=(SELECT PID FROM Flight WHERE FID=@FID)
SELECT booked=count(*) FROM BookTicket WHERE FID=@FID
IF @booked>@seats
ROLLBACK TRANSACTION @TransName
ELSE
COMMIT TRANSACTION @TramsName
GO
订票过程一定要做成事务,因为订票的操作应该同时只能有一个人进行。
(9) 机场
1) 航班安排
INSERT INTO Flight(FID, PID, LID, Ftime, Price)
VALUES(#FID, #PID, #LID, #Ftime, #Price);
2) 通知客户航班变化
SELECT [Name],Cont FROM Customer
WHERE CID=IN
( SELECT CID FROM BookTicket WHERE FID=#FID
);
6、 实验总结
(请读者结合自己的实际情况,认真总结自己的收获、体会以及有待改进之处。)
展开阅读全文