资源描述
数据库课程设计
题 目 ____飞机订票系统__ _
学 院 计算机学院
专 业 计算机科学与技术
年级班别
学 号
学生姓名
指导教师 左亚尧
2013 年 1 月 15 日
目 录
一、需求分析…………………………………………………………….1
二、系统设计…………………………………………………………….3
三、详细设计……………………………………………………………6
四、课程设计总结………………………………………………………16
五、参考文献……………………………………………………………16
六、附录…………………………………………………………………16
一、需求分析
(一)系统综合需求
航空订票管理系统主要是为机场、航空公司和客户三方服务。航空公司提供航线和飞机的资料,机场则对在本机场起飞和降落的航班和机票进行管理,而客户能得到的服务应该有查询航班路线和剩余票数,以及网上订票等功能。
客户可以分为两类:一类是普通客户,对于普通客户只有普通的查询功能和订票功能没有相应的票价优惠;另一类是经常旅客,需要办理注册手续,但增加了里程积分功能和积分优惠政策。机场还要有紧急应对措施,在航班出现延误时,要发送相应的信息。
(二)系统功能
航班查询:根据用户输入的“起飞机场” 和“降落机场”信息找到符合要求的航班号,并显示相应的起飞时间、飞行里程、各舱等的余票情况、各舱等的票价情况。供用户进行选择。
订票: 根据用户输入的“所订航班号”和“订票乘客信息”,为用户查看该航班是否有余票:有则生成一条新的票务信息,根据该用户的积分情况制定票价,修改其积分里程;若已无余票,则将该乘客登机在侯票名单之中。
退票:根据用户输入的“所退票流水号”信息,修改订票乘客的积分信息,将相关的票务记录删除;并在侯票记录中找到符合航班要求的第一名乘客,为其办理订票服务,相关的修改其积分。
售票情况统计:统计每个航班的各个舱位等级的已售票数目,侯票数目。
积分功能:为每一个已订购的乘客记录其飞行里程积分,当积分达到一定程度后,为其提供打折的票价。
航班延误:当要延误一个航班时,找到已订购该航班的乘客,发送提示信息。
2.数据字典
该软件的数据库由下述四张数据表组成:
1、航空公司: Company
字段
字段名
类型
宽度
说明
1
company_name
varchar
20
航空公司
2
phone
varchar
15
公司电话
2、飞机信息:Plane
字段
字段名
类型
宽度
说明
1
plane_number
varchar
1.0
飞机编号
2
plane_type
varchar
20
飞机类型
3
quota_f
int
头等舱定额数,
4
quota_s
int
普通舱定额数
5
company_name
varchar
20
所属公司
3、航线信息 Line
字段
字段名
类型
宽度
说明
1
line_number
varchar
10
航线号码
2
airport_s
varchar
20
起飞地点
3
airport_e
varchar
20
起飞终点
4
distance
int
距离
5
company_name
varchar
20
所属公司
4、航班信息: Flight
字段
字段名
类型
宽度
说明
1
flight_number
varchar
10
航班信息
2
plane_number
varchar
10
飞机号
3
line_number
varchar
10
航线
4
price_f
int
头等舱价格
5
price_s
int
普通舱价格
6
flydate
varchar
20
飞行日期
5、客户信息 : Passenger
字段
字段名
类型
宽度
说明
1
passenger_name
varchar
10
客户名
2
distances
int
积分
3
E_mail
varchar
20
邮箱
6、订票信息 :Ticket
字段
字段名
类型
宽度
说明
1
ticket_number
int
票号 (自动增一)
2
flight_number
varchar
10
航班号
3
passenger_name
varchar
10
乘客名
4
cabin
varchar
头等舱还是普通舱
5
pay
int
价格
6、候选票信息 : Wait
字段
字段名
类型
宽度
说明
1
passenger_name
varchar
乘客名
2
flight_number
varchar
10
航班号
3
cabin
varchar
头等舱还是普通舱
4
E_mail
varchar
10
邮箱
三、系统设计
(一)数据库概念设计
E-R图如下:
(二)数据库逻辑设计
将数据库的概念模型转换为关系模型:
航空公司表:(公司名称,公司电话);
飞机表:(飞机号, 机型, 头等舱定额数, 普通舱定额数, 所属航空公司);
航线表:(航线号, 起飞机场, 降落机场, 飞行里程, 所属航空公司);
航班表:(航班号, 执行飞机号, 所飞航线号, 头等舱票价, 普通舱票价, 起飞时间);
乘客表:(乘客姓名, 里程积分, E_mail);
机票表:(机票流水号, 所乘航班号,订票乘客姓名, 所乘舱位等级, 票价);
侯票表:(所侯航班, 侯票乘客姓名, 所需舱位等级, 乘客E_mail);
(三)数据库与数据表设计 ——物理结构设计
在SQL数据库中需要建立3个数据表:表、部门信息数据表和工资数据表。
1.数据库与数据表设计
①company
②Flight
③ Line
④Passenger
⑤Plane
⑥Ticket
⑦Wait
2.数据完整性设计
1) 给每个表实施主键约束。
主键——图中PK
2)实施CHECK约束
全部not null
3)外键约束
外键——途中FK
4)惟一约束 每个表的主键需定义为惟一性:
5) 强制约束
6)规则
cabin 约束为 (cabin = '头等舱' or cabin = '普通舱')两种类型。
四、详细设计
(一)建数据库
CREATE DATABASE PLANE_DB
ON PRIMARY(
NAME=PLANE_DB ,
FILENAME='D:\PLANE_DB .mdf',
SIZE=4MB,
MAXSIZE=6MB,
FILEGROWTH=2MB
)
LOG ON (NAME ='PLANE_DB _log',
FILENAME ='D:\PLANE_DB .ldf',
SIZE=1MB,MAXSIZE=25MB,FILEGROWTH=10%)
(二)建表
create table Company (
company_name varchar(20) primary key,
phone varchar(15) not null)
create table Plane (
plane_number varchar(10) primary key,
plane_type varchar(20) not null,
quota_f int not null,
quota_s int not null,
company_name varchar(20) foreign key references Company(company_name) )
create table Line (
line_number varchar(10) primary key,
airport_s varchar(20) not null,
airport_e varchar(20) not null,
distance int not null,
company_name varchar(20) foreign key references Company(company_name) )
create table Flight (
flight_number varchar(10) primary key,
plane_number varchar(10) foreign key references Plane(plane_number) ,
line_number varchar(10) foreign key references Line(line_number) ,
price_f int not null,
price_s int not null,
flydate varchar(20) not null)
create table Passenger (
passenger_name varchar(10) primary key,
distances int not null,
E_mail varchar(20) not null)
create table Ticket (
ticket_number int identity(1, 1) primary key,
flight_number varchar(10) foreign key references Flight(flight_number),
passenger_name varchar(10) foreign key references Passenger(passenger_name),
cabin varchar(10) check (cabin = '头等舱' or cabin = '普通舱') not null,
pay int check (pay>0) not null)
create table Wait (
passenger_name varchar(10) foreign key references Passenger(passenger_name) ,
flight_number varchar(10) foreign key references Flight(flight_number) ,
cabin_w varchar(10) not null,
primary key (passenger_name, flight_number),
E_mail varchar(20) not null)
(三)视图
(1)查询头等舱订票量
create view flight_cf (flight_number, count_f)
as
select flight_number, count(ticket_number)
from Ticket where cabin = '头等舱' group by flight_number
(2)查询普通舱订票量
create view flight_cs (flight_number, count_s)
as
select flight_number, count(ticket_number)
from Ticket where cabin = '普通舱' group by flight_number
(3)查询某航班的普通舱和头等舱总量
create view flight_q (flight_number, quota_f, quota_s)
as
select Flight.flight_number, quota_f, quota_s
from Flight left join Plane on Flight.plane_number = Plane.plane_number
(四)存储过程
--订票
create proc book_ticket
@flight_number varchar (10), @passenger_name varchar (10), @cabin varchar(10), @E_mail varchar(20)
as
begin
begin tran
declare @remain varchar(10), @pay float, @distance int
if (@cabin = '头等舱')
begin
select @remain = remain_f from flight_choose where flight_number = @flight_number
select @pay = price_f from flight_choose where flight_number = @flight_number
end
else
begin
select @remain = remain_s from flight_choose where flight_number = @flight_number
select @pay = price_s from flight_choose where flight_number = @flight_number
end
select @distance = distance from flight_choose where flight_number = @flight_number
if (@remain = '有')
begin
if (exists(select passenger_name from Passenger where passenger_name = @passenger_name))
begin
declare @distances float
select @distances = distances from Passenger where passenger_name = @passenger_name
if (@distances >= 200000)
select @distances = 0.8
else if (@distances >= 100000)
select @distances = 0.9
insert into Ticket (flight_number, passenger_name, cabin, pay)
values (@flight_number, @passenger_name, @cabin, (@pay * @distances))
update Passenger set distances = distances + @distance where passenger_name = @passenger_name
update Passenger set E_mail = @E_mail where passenger_name = @passenger_name
end
else
begin
insert into Passenger (passenger_name, distances, E_mail)
values (@passenger_name, @distance, @E_mail)
insert into Ticket (flight_number, passenger_name, cabin, pay)
values (@flight_number, @passenger_name, @cabin, @pay)
end
end
else
begin
if (exists(select passenger_name from Passenger where passenger_name = @passenger_name))
update Passenger set E_mail = @E_mail where passenger_name = @passenger_name
else
insert into Passenger (passenger_name, distances, E_mail)
values (@passenger_name, 0, @E_mail)
insert into Wait (flight_number, passenger_name, cabin_w, E_mail)
values (@flight_number, @passenger_name, @cabin, @E_mail)
end
commit tran
end
--退票
create proc cancel_ticket
@ticket_number int
as
begin
begin tran
declare @passenger_name varchar(10), @flight_number varchar(10), @cabin varchar(10), @distance int, @pay int
select @passenger_name = passenger_name from ticket_info where ticket_number = @ticket_number
select @flight_number = flight_number from ticket_info where ticket_number = @ticket_number
select @cabin = cabin from ticket_info where ticket_number = @ticket_number
select @distance = distance from ticket_info where ticket_number = @ticket_number
select @pay = pay from ticket_info where ticket_number = @ticket_number
update Passenger set distances = distances - @distance where passenger_name = @passenger_name
delete from Ticket where ticket_number = @ticket_number
if (exists(select top 1 * from Wait where flight_number = @flight_number and cabin_w = @cabin))
begin
select @passenger_name = passenger_name from Wait where flight_number = @flight_number and cabin_w = @cabin
insert into Ticket (flight_number, passenger_name, cabin, pay) values (@flight_number, @passenger_name, @cabin, @pay)
delete from Wait where passenger_name = @passenger_name and flight_number = @flight_number
update Passenger set distances = distances + @distance where passenger_name = @passenger_name
end
commit tran
end
(五)触发器
--级联删除飞机所对应的航班
create trigger pln_del
on Plane
for delete
as
begin
begin tran
declare @plane_number varchar(10)
select @plane_number = deleted.plane_number from deleted
delete from Flight where Flight.plane_number = @plane_number
commit tran
end
--级联删除航线所对应的航班
create trigger lne_del
on Line
for delete
as
begin
begin tran
declare @line_number varchar(10)
select @line_number = deleted.line_number from deleted
delete from Flight where Flight.line_number = @line_number
commit tran
end
--级联删除航班所对应的票务
create trigger flt_del
on Flight
for delete
as
begin
begin tran
declare @flight_number varchar(10)
select @flight_number = deleted.flight_number from deleted
delete from Ticket where Ticket.flight_number = @flight_number
delete from Wait where Wait.flight_number = @flight_number
commit tran
end
--延误航班时,触发对订票车功乘客的提示
create trigger flt_upd
on Flight
instead of update
as
begin
begin tran
declare @flight_number varchar(10)
select @flight_number = inserted.flight_number from inserted
select Ticket.passenger_name, E_mail from Ticket, Passenger where
Ticket.passenger_name = Passenger.passenger_name and Ticket.flight_number = @flight_number
commit tran
end
(六)索引
(七)运行和维护
1. 关系图的建立
2.简单查询
1)航空公司基本信息情况
代码如下: select *
from Company;
2) 航线的基本信息情况
代码如下: select *
from Flight;
3)航班的订票信息。
代码如下:select *
from Ticket;
4)航线信息
代码如下:
select *
from Line;
5)查询订票客户
代码如下:select *
from Ticket;
;
3.复杂查询
1)查询航班F001所剩下的头等舱座位:
代码如下:
select Flight.flight_number as '航班号',(Plane.quota_f-flight_cf.count_f) as '头等舱剩余票数'
from Plane,Flight,flight_cf
where Flight.Flight_number='F001' AND Flight.plane_number=Plane.plane_number AND flight_cf.flight_number='F001';
2) 查询航班F001所剩下的普通舱座位:
select Flight.flight_number as '航班号',(Plane.quota_s-flight_cs.count_s) as '普通舱剩余票数'
from Plane,Flight,flight_cs
where Flight.Flight_number='F001' AND Flight.plane_number=Plane.plane_number AND flight_cs.flight_number='F001';
5.数据库的备份
6.数据的导入与导出
五、课程设计总结
经过一周的时间,同学,互联网的帮助下,基本完成本次课程设计,基本达到了飞机订票系统的要求。
这次数据库课程设计给我的最大的印象是:数据存储在数据库系统有很多种方法。本次实验,我熟悉利用范式来构建数据库的逻辑结构。有的人说:流程是一切的根本;架构是重要的;很多程序要在机子上跑一遍才知道自己理论的不娴熟。计算机就是一门以实验为主的科目。从做这个数据库开始无论遇到什么困难,要学会利用互联网这个资源才能很好地解决问题。正所谓磨刀不误砍柴功,在设计过程中,一开始我习惯凭空想象,不画流程图,但问题百出,后来,试着实验的方法,先,逐步按标准的方法去设计数据库,才是最有效率的。做实例过程中要注意与说明书中数据项数据类型,数据长度等的一致,命令中心输入任何命令都要谨记一条原则,那就是严格按照格式来,考虑各种约束才行。
在本系统的设计与实现的过程中,对于客户来说订票,买票,查询所买的票的飞机信息的主要设计。系统设计部分,包括功能模块设计、数据库结构设计等。系统设计为整个程序构建了骨架,各个功能模块实现各个细节部分。
六、参考文献
[1] 数据库系统概论:高等教育出版社;
七、附录
部分源代码
21
展开阅读全文