课 程 设 计 报 告
课程设计名称: 数据库系统概论
系 部:
学生姓名:
班 级:
学 号:
成 绩:
**** **
开课时间: 2011-2012 学年 2 学期
一、设计题目:
《机票预订系统》
系统功能的基本要求:
每个航班信息的输入、每个航班的坐位信息的输入;
当旅客进行机票预定时,输入旅客基本信息,系统为旅客安排航班;
旅客能够退订机票;
能够查询每个航班的预定情况、统计航班的满座率。
二、主要内容:
(一)、需求分析
随着互联网的不断发展,以及电子商务的不断普及,人们对能够网上预订民航机票的需求越来越大。航空公司为方便旅客出行,需开发一个机票预定系统。预定机票时,通过输入相关信息,包括姓名、身份证号码、旅行时间、旅行始发地、旅行目的地,机票预定系统的客户端程序将查询航空公司内的航班数据库,为旅客安排最合适的航班,并显示订票交易编号。旅客在飞机起飞前至机场自动售票处凭订票单编号付款后取票,系统校对无误后即印出机票给旅客。未付款时若需退订机票,旅客可以凭订单号和身份证号在线退订。
综合分析,我认为机票预订系统至少应包括以下几种功能(如图1):
图1 机票预订系统的总体功能模块
各部分功能如下表1所示:
表1 系统功能模块分析
| 功能模块名 | 功 能 |
| 航班信息管理 | 实现基本航班信息的增删查改 |
| 机票信息管理 | 实现基本机票信息的增删查改 |
| 旅客信息管理 | 记录乘坐航班的旅客的信息 |
| 订票信息管理 | 记录已预订的机票 |
| 取消机票预订 | 已预订的机票的预订记录 |
图2 顶层数据流图
图3 底层数据流图
部分数据项如下所示:
| 属性名 | 别名 | 数据类型 | 长度 |
| id | 身份证号 | char | 20 |
| passagername | 姓名 | char | 20 |
| telephone | 联系方式 | char | 20 |
| ordersnumber | 订单号 | char | 20 |
| flightnumber | 航班编号 | char | 20 |
| placefrom | 起飞地 | char | 20 |
| destination | 目的地 | char | 20 |
| flighttime | 起飞时间 | datetime | |
| seatcount | 总座位数 | int | |
| price | 票价 | int | - |
| ticketnumber | 机票号 | char | 20 |
| seatnumber | 座位号 | int | - |
根据需求分析抽象出所需的实体及其属性,并画出总体概念结构E-R图:
1、旅客实体属性图,如图4所示。
图4 旅客实体属性图
2、航班实体属性图,如图5所示。
图5 航班实体属性图
3、机票实体属性图,如图6所示。
图6 机票实体属性图
4、总体概念结构E-R图,如图7所示。
图7 总体概念结构E-R图
(三)、逻辑结构设计
1、E-R图向关系模型的转换(关系的码用下划线标出)
●航班(航班编号,起飞地,目的地,起飞时间,总座位数,票价)
此为航班实体对应的关系模式。航班编号是关系的候选码。
●机票(机票号,航班编号,座位号,身份证号)
此为机票实体的关系模式。该关系模式已经包含了联系“组成”所对应的关系模式。
●旅客(身份证号,姓名,联系方式)
此为旅客实体对应的关系模式。身份证号是关系的候选码。
●订票单(订单编号,机票号,身份证号)
此为联系“预/退订”所对应的关系模式。
2、数据模型的优化
由前面已给出的关系模式易知,各个关系都满足第一范式(1NF)。且每个关系中的每个非主属性都完全依赖于各自的码。故而关系也满足第二范式(2NF)。
但在关系模式“订票单”中,存在属性依赖于非主属性(机票号→身份证号)。故关系模式不满足第三范式(3NF)。考虑到订退票操作时需要增删旅客信息,如若去掉订票单表中的身份证号属,在需要退票时,删除旅客信息将需要先进行订票单表和机票表的连接运算才能获得身份证号,这将影响系统的效率。故决定保留身份证号属性,以减少连接运算,提高关系模型的效率。
最终关系模式满足第二范式(2NF)。
3、设计用户子模式
为消费者建立视图:
航班信息(起飞地,目的地,起飞时间,票价)
订票单表(订单编号,起飞地,目的地,起飞时间,票价,身份证号,姓名,联系电话)
4、各个表的结构如下:
根据总体结构图设计机票预定系统基本表结构,其相应标的定义如下:
表2 旅客信息系统的结构
| 字段名 | 数据类型 | 长度 | 约束 | 描述 |
| id | char | 20 | 主码 | 身份证号 |
| passagername | char | 20 | 不为空 | 姓名 |
| telephone | char | 20 | 不为空 | 联系方式 |
| 字段名 | 数据类型 | 长度 | 约束 | 描述 |
| flightnumber | char | 20 | 主码 | 航班编号 |
| placefrom | char | 20 | 不为空 | 起飞地 |
| destination | char | 20 | 不为空 | 目的地 |
| flighttime | datatime | - | 不为空 | 起飞时间 |
| seatcount | int | - | 不为空 | 总座位数 |
| price | int | - | 不为空 | 票价 |
| 字段名 | 数据类型 | 长度 | 约束 | 描述 |
| ticketnumber | char | 20 | 主码 | 机票号 |
| flightnumber | char | 20 | 外码 | 航班编号 |
| seatnumber | int | - | 不为空 | 座位号 |
| id | char | 20 | 外码 | 身份证号 |
| 字段名 | 数据类型 | 长度 | 约束 | 描述 |
| ordersnumber | char | 20 | 主码 | 订单编号 |
| ticketnumber | char | 20 | 外码 | 机票号 |
| id | char | 20 | 外码 | 身份证号 |
1、索引的建立
因为有机票预订情况的查询,为提高系统查询效率,可对机票建立聚簇索引;
(五)、数据库实施及应用程序编制
数据库的建立共有4个基本表,建立数据库的SQL语句如下:
1、创建数据库Airplane
create database Airplane ;
2、创建旅客基本表passager
Use Airplane
create table passager
(
id char(20) primary key ,
passagername char(20) not null ,
telephone char(20) not null
)
3、创建航班基本表flight
use Airplane
Create table flight
(
flightnumber char(20) primary key ,
placefrom char(20) not null ,
destination char(20) not null ,
flighttime datetime not null ,
seatcount int not null ,
price int not null
)
4、创建机票基本表ticket
use Airplane
create table ticket
(
ticketnumber char(20) ,
flightnumber char(20) ,
seatnumber int ,
id char(20) ,
primary key(ticketnumber) ,
foreign key(flightnumber)references flight(flightnumber) ,
foreign key(id)references passager(id) ,
)
5、创建订票单基本表
use Airplane
create table orders
(
ordersnumber char(20),
ticketnumber char(20) ,
id char(20) ,
primary key(ordersnumber) ,
foreign key(ticketnumber)references ticket(ticketnumber) ,
foreign key(id)references passager(id) ,
)
6、旅客查询航班视图:
Create view v_flight
As
Select flightnumber ,flighttime ,placefrom ,destination ,price
From flight
7、旅客个人信息查看的视图:
Create view v_passager
As
Select flightnumber,id,passagername,flighttime
From passager,flight
8、满座率的查询:
Select count/seatcount
From ticket,flight
Where ticketnumber like ‘_ _ _ _ _ _ _ _1201_ _ _’
9、航班预订情况查看:
Select count *
From ticket
Where flightnumber = CA1201
10、系统界面截图:
图8 系统界面截图
(六)、心得体会
短暂的一个半星期的课程设计转眼就结束了,在这次课程中,我学到了很多与数据库有关的软件编程实用技术,收获不小。一个软件的开发看似简单,其实前前后后十分辛苦。从需求分析到E-R图,从E-R图到逻辑结构设计,从逻辑结构设计到物理结构设计,直至数据库SQL语句的编写以及最后的程序编制。整个过程,充分考验了我们的综合知识的能力。
我这次的课题名是《机票的预订系统》,需求分析中的顶层流程图很简单。但是底层数据流图的数据流就较为复杂。概念设计中实体属性图和E-R图的设计是后期程序是否高效的关键。逻辑结构设计中,将E-R图转换为关系模式时,要区分是实体还是联系转换的。转换为关系后又对其进行优化,并讨论最终范式。我的原本设计的系统已达到第三范式的要求。但考虑到物理设计及存储和存取的效率后,我决定放弃第三范式,转而选择第二范式。方便系统查看机票预订情况的查看,我在“机票号”属性上增加了聚簇索引。关系上定义的索引数不是越多越好,因为系统为维护索引要付出代价,查找索引也要付出代价,因此索引数要适量。我的数据库最终使用的是Microsoft SQL Server2005环境。用SQL语句建立好数据库,输入简单的几个可供检验的数据旋即完成。界面是直接在Dreamweaver8里使用动态页面设计的。期间我通过阅读官方参考手册,一步一步,利用图形化界面编写了简单的软件使用界面。
通过这次课程设计,我学到了很多课本上学不到的软件使用方法,和实用技术。同时也加深了对课本知识的了解。而且我发现,有目标的学习更能促进我高效的投入到学习中来。学习课本知识需要更多的课后实践练手,那样的学习经验对我们来说十分珍贵。
最后,感谢指导老师的认真指导。
(七)、参考资料
1、王珊,萨师煊,《数据库系统概论》,高等教育出版社,2008年;
2、徐国志,SQL-Server数据库开发案例精粹,北京电子工业出版社;
3、《数据库课程设计_机票预定系统》;
4、Dreamweaver8官方教程;下载本文