数据库课程设计航空订票管理系统1.docx
《数据库课程设计航空订票管理系统1.docx》由会员分享,可在线阅读,更多相关《数据库课程设计航空订票管理系统1.docx(23页珍藏版)》请在冰豆网上搜索。
![数据库课程设计航空订票管理系统1.docx](https://file1.bdocx.com/fileroot1/2023-2/25/92d16377-fed0-42b6-b67e-77126616723e/92d16377-fed0-42b6-b67e-77126616723e1.gif)
数据库课程设计航空订票管理系统1
数据库课程设计
学院计算机
专业计算机科学与技术
班级
学号
姓名
指导教师左亚饶
(2013年1月)
目录
一、需求分析3
二、概念结构设计4
三、逻辑结构设计4
四、数据库设计实现及运行5
五、系统实现主要模块描述以及关键代码18
七、心得与体会23
一、需求分析
1)、问题描述:
航空订票管理系统主要是为机场、航空公司和客户三方服务。
航空公司提供航线和飞机的资料,机场则对在本机场起飞和降落的航班和机票进行管理,而客户能得到的服务应该有查询航班路线和剩余票数,以及网上订票等功能。
客户可以分为两类:
一类是普通客户,对于普通客户只有普通的查询功能和订票功能没有相应的票价优惠;另一类是经常旅客,需要办理注册手续,但增加了里程积分功能和积分优惠政策。
机场还要有紧急应对措施,在航班出现延误时,要发送相应的信息。
2)、系统功能描述:
航班查询:
根据用户输入的“起飞机场”和“降落机场”信息找到符合要求的航班号,并显示相应的起飞时间、飞行里程、各舱等的余票情况、各舱等的票价情况。
供用户进行选择。
订票:
根据用户输入的“所订航班号”和“订票乘客信息”,为用户查看该航班是否有余票:
有则生成一条新的票务信息,根据该用户的积分情况制定票价,修改其积分里程;若已无余票,则将该乘客登机在侯票名单之中。
退票:
根据用户输入的“所退票流水号”信息,修改订票乘客的积分信息,将相关的票务记录删除;并在侯票记录中找到符合航班要求的第一名乘客,为其办理订票服务,相关的修改其积分。
售票情况统计:
统计每个航班的各个舱位等级的已售票数目,侯票数目。
积分功能:
为每一个已订购的乘客记录其飞行里程积分,当积分达到一定程度后,为其提供打折的票价。
航班延误:
当要延误一个航班时,找到已订购该航班的乘客,发送提示信息。
3)、有何安全性与完整性方面的要求:
订票事务的原子性:
每个乘客的订票过程是互斥执行的,防止有一张票卖给两个人的情况发生。
通过订票存储过程实现。
飞机、航班、票务的级联:
当删除一个飞机,级联的删除该飞机所飞行的航班,以及订购了该航班的乘客订票。
通过触发器实现。
二、概念结构设计
画出系统整体的E-R模型;并对模型中所出现的实体及属性等信息加以说明。
三、逻辑结构设计
1)、模式设计:
按系统整体E-R模型,写出关系模式;并利用数据字典加以描述。
航空公司表:
(公司名称,公司网址);
飞机表:
(飞机号,机型,头等舱定额数,普通舱定额数,所属航空公司);
航线表:
(航线号,起飞机场,降落机场,飞行里程,所属航空公司);
航班表:
(航班号,执行飞机号,所飞航线号,头等舱票价,普通舱票价,起飞时间);
乘客表:
(乘客姓名,里程积分,E_mail);
机票表:
(机票流水号,所乘航班号,订票乘客姓名,所乘舱位等级,票价);
侯票表:
(所侯航班,侯票乘客姓名,所需舱位等级,乘客E_mail);
除各主键外,其余各非主属性也为非空。
“头等舱定额数,普通舱定额数,飞行里程,机票流水号,票价,里程积分”为数值型,约束不能小于0,其余为字符型,舱位等级只能选“头等舱或普通舱”。
2)、子模式设计:
即针对自己的设计模块的应用需定义什么样的视图表结构;并利用数据字典加以描述。
售票情况视图:
(航班号,头等舱数目,头等舱已售出数目,头等舱侯票数目,普通舱数目,普通舱已售出数目,普通舱侯票数目)
用于方便机场管理票务,统计各舱等的售票、须票情况。
航班选择视图:
(航班号,起飞机场,降落机场,飞行里程,头等舱票价,头等舱是否有票,普通舱票价,普通舱是否有票)
提供航班飞行的基本情况,包括判断是否有票,以便选择订票。
票务信息视图:
(机票流水号,订票乘客姓名,所订航班,所订舱等,票价,飞行里程)
提供机票的相关信息,以便退票时事物处理。
四、数据库设计实现及运行
1)、数据库的创建
T-SQL语句:
createdatabaseBookTicket_6222on(
name=N'BookTicket_6222_Data',filename=N'C:
\ProgramFiles\MicrosoftSQLServer\MSSQL\data\BookTicket_6222_Data.MDF',
size=1,filegrowth=10%)
logon(
name=N'BookTicket_6222_Log',filename=N'C:
\ProgramFiles\MicrosoftSQLServer\MSSQL\data\BookTicket_6222_Log.LDF',
size=1,filegrowth=10%)
2)、数据表的创建(可同时在创建时定义相关的约束)
T-SQL语句:
createtableCompany(
company_namevarchar(20)constraintpk_cpyprimarykey,
phonevarchar(15)notnull)
createtablePlane(
plane_numbervarchar(10)constraintpk_plnprimarykey,
plane_typevarchar(20)notnull,
quota_fintnotnull,
quota_sintnotnull,
company_namevarchar(20)constraintfk_cp
foreignkeyreferencesCompany(company_name)ondeletecascade)
createtableLine(
line_numbervarchar(10)constraintpk_lneprimarykey,
airport_svarchar(20)notnull,
airport_evarchar(20)notnull,
distanceintnotnull,
company_namevarchar(20)constraintfk_cl
foreignkeyreferencesCompany(company_name)ondeletecascade)
createtableFlight(
flight_numbervarchar(10)constraintpk_fltprimarykey,
plane_numbervarchar(10)constraintfk_pf
foreignkeyreferencesPlane(plane_number)ondeletecascade,
line_numbervarchar(10)constraintfk_lf
foreignkeyreferencesLine(line_number)ondeletecascade,
price_fintnotnull,
price_sintnotnull,
flydatevarchar(20)notnull)
createtablePassenger(
passenger_namevarchar(10)constraintpk_psgprimarykey,
distancesintnotnull,
E_mailvarchar(20)notnull)
createtableTicket(
ticket_numberintidentity(1,1)constraintpk_tktprimarykey,
flight_numbervarchar(10)constraintfk_ft
foreignkeyreferencesFlight(flight_number)ondeletecascade,
passenger_namevarchar(10)constraintfk_pt
foreignkeyreferencesPassenger(passenger_name)ondeletecascade,
cabinvarchar(10)constraintch_cbncheck
(cabin='头等舱'orcabin='普通舱')notnull,
payintconstraintch_paycheck
(pay>0)notnull)
createtableWait(
passenger_namevarchar(10)constraintfk_pw
foreignkeyreferencesPassenger(passenger_name)ondeletecascade,
flight_numbervarchar(10)constraintfk_fw
foreignkeyreferencesFlight(flight_number)ondeletecascade,
cabin_wvarchar(10)notnull,
primarykey(passenger_name,flight_number),
E_mailvarchar(20)notnull)
3)、视图的创建(仅需给出自己设计模块中所用的视图)
T-SQL语句:
--方便乘客进行航班查询的视图
createviewflight_cf(flight_number,count_f)
as
selectflight_number,count(ticket_number)
fromTicketwherecabin='头等舱'groupbyflight_number
createviewflight_cs(flight_number,count_s)
as
selectflight_number,count(ticket_number)
fromTicketwherecabin='普通舱'groupbyflight_number
createviewflight_wf(flight_number,wait_f)
as
selectflight_number,count(passenger_name)
fromWaitwherecabin_w='头等舱'groupbyflight_number
createviewflight_ws(flight_number,wait_s)
as
selectflight_number,count(passenger_name)
fromWaitwherecabin_w='普通舱'groupbyflight_number
createviewflight_q(flight_number,quota_f,quota_s)
as
selectFlight.flight_number,quota_f,quota_s
fromFlightleftjoinPlaneonFlight.plane_number=Plane.plane_number
createviewbook_info(flight_number,quota_f,count_f,wait_f,quota_s,count_s,wait_s)
as
selectflight_q.flight_number,quota_f,count_f,wait_f,quota_s,count_s,wait_s
fromflight_qleftjoinflight_cfonflight_q.flight_number=flight_cf.flight_number
leftjoinflight_csonflight_q.flight_number=flight_cs.flight_number
leftjoinflight_wfonflight_q.flight_number=flight_wf.flight_number
leftjoinflight_wsonflight_q.flight_number=flight_ws.flight_number
createviewflight_choose(flight_number,airport_s,airport_e,distance,flydate,price_f,remain_f,price_s,remain_s)
as
selectFlight.flight_number,airport_s,airport_e,distance,flydate,price_f,
remain_f=case
when(quota_f-count_f)<=0then'无'
else'有'
end,price_s,
remain_s=case
when(quota_s-count_s)<=0then'无'
else'有'
end
fromLine,Flight,book_info
whereLine.line_number=Flight.line_numberandFlight.flight_number=book_info.flight_number
createviewticket_info(ticket_number,passenger_name,flight_number,cabin,pay,distance)
as
selectticket_number,passenger_name,Ticket.flight_number,cabin,pay,flight_choose.distance
fromTicketleftjoinflight_chooseonTicket.flight_number=flight_choose.flight_number
4)、存储过程的定义实现(仅需给出自己设计模块中所用的)
T-SQL语句:
--订票
createprocbook_ticket
@flight_numbervarchar(10),@passenger_namevarchar(10),@cabinvarchar(10),@E_mailvarchar(20)
as
begin
begintran
declare@remainvarchar(10),@payfloat,@distanceint
if(@cabin='头等舱')
begin
select@remain=remain_ffromflight_choosewhereflight_number=@flight_number
select@pay=price_ffromflight_choosewhereflight_number=@flight_number
end
else
begin
select@remain=remain_sfromflight_choosewhereflight_number=@flight_number
select@pay=price_sfromflight_choosewhereflight_number=@flight_number
end
select@distance=distancefromflight_choosewhereflight_number=@flight_number
if(@remain='有')
begin
if(exists(selectpassenger_namefromPassengerwherepassenger_name=@passenger_name))
begin
declare@distancesfloat
select@distances=distancesfromPassengerwherepassenger_name=@passenger_name
if(@distances>=200000)
select@distances=0.8
elseif(@distances>=100000)
select@distances=0.9
insertintoTicket(flight_number,passenger_name,cabin,pay)
values(@flight_number,@passenger_name,@cabin,(@pay*@distances))
updatePassengersetdistances=distances+@distancewherepassenger_name=@passenger_name
updatePassengersetE_mail=@E_mailwherepassenger_name=@passenger_name
end
else
begin
insertintoPassenger(passenger_name,distances,E_mail)
values(@passenger_name,@distance,@E_mail)
insertintoTicket(flight_number,passenger_name,cabin,pay)
values(@flight_number,@passenger_name,@cabin,@pay)
end
end
else
begin
if(exists(selectpassenger_namefromPassengerwherepassenger_name=@passenger_name))
updatePassengersetE_mail=@E_mailwherepassenger_name=@passenger_name
else
insertintoPassenger(passenger_name,distances,E_mail)
values(@passenger_name,0,@E_mail)
insertintoWait(flight_number,passenger_name,cabin_w,E_mail)
values(@flight_number,@passenger_name,@cabin,@E_mail)
end
committran
end
--退票
createproccancel_ticket
@ticket_numberint
as
begin
begintran
declare@passenger_namevarchar(10),@flight_numbervarchar(10),@cabinvarchar(10),@distanceint,@payint
select@passenger_name=passenger_namefromticket_infowhereticket_number=@ticket_number
select@flight_number=flight_numberfromticket_infowhereticket_number=@ticket_number
select@cabin=cabinfromticket_infowhereticket_number=@ticket_number
select@distance=distancefromticket_infowhereticket_number=@ticket_number
select@pay=payfromticket_infowhereticket_number=@ticket_number
updatePassengersetdistances=distances-@distancewherepassenger_name=@passenger_name
deletefromTicketwhereticket_number=@ticket_number
if(exists(selecttop1*fromWaitwhereflight_number=@flight_numberandcabin_w=@cabin))
begin
select@passenger_name=passenger_namefromWaitwhereflight_number=@flight_numberandcabin_w=@cabin
insertintoTicket(flight_number,passenger_name,cabin,pay)values(@flight_number,@passenger_name,@cabin,@pay)
deletefromWaitwherepassenger_name=@passenger_nameandflight_number=@flight_number
updatePassengersetdistances=distances+@distancewherepassenger_name=@passenger_name
end
committran
end
在宿主语言中调用存储过程代码段(粘贴):
publicvoidexecuteProc(intticket_number){
try{
con=DriverManager.getConnection(url);
PreparedStatementcmd=con.prepareStatement("{callcancel_ticket(?
)}");
cmd.setInt(1,ticket_number);
cmd.executeUpdate();
}catch(Exceptionex){
ex.printStackTrace();
}
}
publicvoidexecuteProc(Stringfn,Stringpn,Stringcb,Stringem){