第一章 绪论
1.1课题简介
随着时代的发展,计算系软件和系统的成熟,机票如果简单方面预定成为一个影响多数人生活的问题。而建立机票预定系统是一个很好的解决办法。经过三年的学习,我们对计算机方面的知识有了很大的提升,本着理论联系实际的宗旨,通过学校提供的这次课程设计实践的机会,在指导教师的帮助下,历经两周时间,我自行设计一套机票预定管理系统,在下面的各章中,我将以这套机票预定系统信息系统为例, 谈谈其开发过程和所涉及到的问题。
1.2设计目的
应用对数据库系统原理的理论学习,通过上机实践的方式将理论知识与实践更好的结合起来,巩固所学知识。
实践和巩固在课堂教学中学习的关于关系数据库原理的有关知识和数据库系统的建立方法,熟练掌握对于给定实际问题,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程,为毕业设计打下基础。
1.3设计内容
选择课题并且对课题的相关信息有一定的了解,对于我选的课题来说,我必须了解机票预定系统的构造以及购票人的信息还有机票的相关信息。通过这些信息制成表格,输入到数据库中,使之能够进行查询、修改、删除并且与机票预定系统执行相同的操作。需求分析阶段就是要研究我所作的机票预定系统的具体分类和实施过程流图。概念设计阶段要完成数据抽象与局部视图设计还有视图的集成。逻辑结构设计阶段要把E-R 图转化为关系模式。最后就是要运行和实施数据库。
第二章 需求分析
2.1 需求分析的任务
调查机票预定系统应用领域涉及的内容,对涉及到领域的各个应用的信息要求和操作要求进行详细分析,形成需求分析说明书。最重要的是调查、收集信息、分析购票人信息和飞机预定流程。处理要求、数据的安全性与完整性要求。
要求系统能有效、快速、安全、可靠和无误的完成上述操作。并要求客户机的界面要简单明了,易于操作,服务器程序利于维护。
2.2 需求分析的过程
航空公司为方便旅客,需开发一个机票预定系统。为便于旅客由旅行社代替航空公司负责为旅客定票,旅行社把预定机票的旅客信息,包括姓名、性别、工作单位、身份证号码、旅行时间、旅行目的地,输入机票预定系统的客户端程序,系统经过查询航空公司内的航班数据服务器后,为旅客安排航班,印出取票通知。旅客在飞机起飞前一天凭取票通知和帐单交款后取票,系统校对无误后即印出机票给旅客。如果某方面出现问题,旅客可以持有效证件去飞机场退票。
要求系统能有效、快速、安全、可靠和无误的完成上述操作。并要求客户机的界面要简单明了,易于操作,服务器程序利于维护。
经过综合分析,确定了机票预订管理系统主要包括以下功能: (1)订单信息管理功能
主要是实现管理员对订票信息的管理,包括对航班基本信息如航班号、起飞地、目的地、起飞时间等,旅客基本信息如旅客姓名、性别、电话号码、身份证号、座位号、订票数量的添加、修改、删除和查询功能。
订单信息管理系统图2-1
(2)旅客信息管理功能
主要是实现管理员对旅客一些基本信息,如旅客姓名、性别、电话号码、身份证号的添加、修改、删除和查询功能。
旅客信息管理系统图2-2
(3) 航班信息管理功能
主要实现管理员对航班的一些基本信息,航班号、起飞地、目的地、起飞时间的
添加、修改、删除查询和功能。
航班信息管理系统图2-3
(4) 机票信息管理功能
主要实现管理员对机票的一些基本信息,如航班号、座位号、座位信息、机票类型的添加、修改、删除和查询功能。
机票信息管理系统图2-4
(5) 退票信息管理功能
主要是实现管理员对退票信息的管理,包括对订单号、旅客姓名、电话号码、身份证号的添加、修改、删除和查询功能。
退票信息管理系统图2-5
2.3数据字典与流程图
2.3.1数据字典
数据字典是用来规范描述数据具体内容的工具,也是对数据汇总分析的一个总结。一般来说,可为每个数据建立一张二维表。在本系统中,分别为旅客信息、旅客订票信息、航班机票信息、旅客与机票的联系、退票信息建立了数据字典,具体如表2-1到表2-6所示。 主键:蓝色 外键:下划线
表2-1 订单信息的数据字典
表2-2 航班信息的数据字典
表2-3 机票信息的数据字典
表2-4 旅客信息的数据字典
表2-5 旅客与机票信息的联系数据字典
表2-6退票信息的数据字典
2.3.2基本流程图
机票预订系统流程图2-6
第三章 ER模型图
3.1实体属性图
订单信息实体属性图3-1
航班信息实体属性图3-2
机票信息实体属性图3-3
客户与机票实体属性图3-4
旅客信息实体属性图3-5
座位信息实体属性图3-6
3.2总体ER 模型图
退票信息实体属性图3-7
第四章 逻辑结构设计
4.1 E-R图向关系模型的转换
订单信息(订单号,航班号,座位号,数量,类型) 退票信息(订单号,旅客编号,时间)
旅客信息(旅客编号,身份证号,姓名,性别,联系电话)
4.2 数据模型的优化
将转化的关系模式进行优化,最终达到第三范式。 1、确定数据依赖
退票信息(订单号,旅客姓名,航班号)根据这个关系写出数据依赖 订单号→旅客姓名,订单号→座位号,订单号→航班号 旅客(旅客姓名,旅客编号,电话号,性别)
旅客姓名→身份证号,旅客姓名→电话号,旅客姓名→性别 航班信息表(航班号,起飞地,目的地,起飞时间)
航班号→起飞地,航班号→目的地,航班号→起飞时间 座位信息表(座位号,航班号, 座位信息,机票类型) (座位号,航班号)→座位信息,(座位号,航班号,座位信息)→机票类型
2、 3、
对各关系模式间数据依赖进行极小化处理,消除冗余
看这些模式是否符合要求,确定是否要对某些模式进行合并或者分解
订单号→旅客编号,订单号→座位号,订单号→机票编号,订单号→机票编号 最终分解成第三范式:
(订单号,机票编号,机票类型)(订单号,旅客编号)(旅客编号,旅客姓名,性别)(旅客姓名,座位号)(航班号,座位号,机票类型)(航班号,起飞地,目的地,起飞时间)
第五章 功能实现
5.1查询功能的实现
通过查询功能我们可以找到相关的信息。
USE MARKET
SELECT * FROM Seat
查询功能图5-1
5.2多条件查询功能的实现
使用多条件查询功能可以增加查询的限制条件,这样可以使查询的结果更准
确。
USE MARKET
SELECT * FROM Passenger WHERE Sex='女'AND Passenger_Name='小青'
多条件查询功能图5-2
5.3添加功能的实现
通过添加功能实现对数据的增加,录入需要的信息。 USE MARKET
INSERT INTO Passenger VALUES ('00001' , ' 大卫' , '1234566' , ' 男' , '[1**********]' );
添加功能图5-3
5.4删除功能的实现
可以实现对一些变更的信息删除,从而能够达到一定的效果。
USE MARKET
DELETE FROM Booking_Ticket WHERE Booking_Number='B00001'
删除功能图5-4
5.5更改功能的实现
通过更改功能我们可以对其信息修改,比如机票座位类型,目的地等做相应的修改
USE MARKET
SELECT * FROM Flight WHERE Flight_Number=A01 Update Flight
SET Destination='呼和浩特' where Flight_Number=A01 SELECT * FROM Flight_Number=A0
Flight Where
更改功能图5-5
5.6视图的建立
视图就是创建一个可以实现添加创建的续表,从而实现效果。
视图5-6
第六章 源代码
建库:
create database [MARKET] on primary (
name = 'ticket_db',
filename = 'F:\数据库课程设计\ticket.mdf', size = 5mb ,
maxsize = 30mb , filegrowth = 5% )
log on (
name = 'ticket' ,
filename = 'F:\数据库课程设计\ticket_log.ldf', size = 1mb ,
maxsize = 10mb , filegrowth = 10%
)
建表:
CREATE TABLE Booking_Ticket/--------订单信息表的创建---------/ (
Booking_Number varchar (50) primary key , /--------设置主键---------/Flight_Number varchar (50) not null, Seat_Number varchar (50) not null,
Passenger_Number varchar (50) not null, Amount varchar (50) not null, Price varchar (50) not null, Time varchar (50) not null, ) ;
USE MARKET
CREATE TABLE Flight/--------航班信息表的创建---------/ (
Flight_Number varchar (50) primary key , /--------设置主键---------/ akeoff_Time varchar (50) not null, ArTrival_Time varchar (50) not null, Flight_Time varchar (50) not null, Origin varchar (50) not null,
Destination varchar (50) not null, Flight_Type varchar (50) not null );
USE MARKET
CREATE TABLE Passenger/--------旅客信息表的创建---------/ (
Passenger_Number varchar (50) primary key , /--------设置主键---------/ Passenger_Name varchar (50) not null, ID_Number varchar (50) not null, Sex varchar (50) not null,
Telephone varchar (50) not null );
USE MARKET
CREATE TABLE Seat/--------座位信息表的创建---------/ (
Seat_Number varchar (50) primary key , /--------设置主键---------/ Seat_Type varchar (50) not null,
Ticket_Number varchar (50) not null, Destination varchar (50) not null );
USE MARKET
CREATE TABLE Ticket (
Ticket_Number varchar (50) primary key , /--------设置主键---------/ Destination varchar (50) not null, Price varchar (50) not null,
Takeoff_Time varchar (50) not null Seat_Number varchar (50) not null );
USE MARKET
CREATE TABLE Relation/--------关系的创建---------/ (
Number varchar (50) primary key , /--------设置主键---------/ Ticket_Number varchar (50) not null, Passenger_Number varchar (50) not null, );
USE MARKET
CREATE TABLE Refund/--------退票信息表的创建---------/ (
Order_Number varchar (50) primary key , /--------设置主键---------/ Passenger_Number varchar (50) not null, Booking_Number varchar (50) not null, );
设置外键:
use MARKET go
alter table Booking_Ticket
add constraint fk_storeDI foreign key (Seat_Number) references Seat (Seat_Number)
use MARKET go
alter table Booking_Ticket
add constraint fk_storeADI foreign key (Flight_Number) references Flight (Flight_Number)
use MARKET go
alter table Booking_Ticket
add constraint fk_storeI foreign key (Passenger_Number) references Passenger (Passenger_Number)
use MARKET
go
alter table Refund
add constraint fk_storI foreign key (Passenger_Number) references
Passenger (Passenger_Number)
use MARKET
go
alter table Refund
add constraint fk_sorI foreign key (Booking_Number) references
Booking_Ticket(Booking_Number)
use MARKET
go
alter table Booking_Ticket
add constraint fk_sosI foreign key (Ticket_Number) references
Ticket (Ticket_Number)
use MARKET
go
alter table Relation
add constraint fk_sowsI foreign key (Ticket_Number) references
Ticket (Ticket_Number)
use MARKET
go
alter table Relation
add constraint fk_saI foreign key (Passenger_Number) references
Passenger (Passenger_Number)
use MARKET
go
alter table Booking_Ticket
add constraint fk_saiI foreign key (Ticket_Number) references
Ticket (Ticket_Number)
设置约束条件:
use MARKET
go
alter table Passenger
add check (Sex in(' 男' , ' 女' )); /--------设置外键约束---------/
数据的插入:
use MARKET
INSERT INTO Flight VALUES ('A01' , '12:00', '14:30', '2小时分' , ' 包头' , ' 北京' , 'B0' ); INSERT INTO Flight VALUES ('A02' , '12:01', '14:31', '2小时分' , ' 包头' , ' 天津' , 'B1' ); INSERT INTO Flight VALUES ('A03' , '12:02', '14:32', '2小时分' , ' 包头' , ' 上海' , 'B2' ); INSERT INTO Flight VALUES ('A04' , '12:03', '14:33', '2小时分' , ' 包头' , ' 河北' , 'B3' ); INSERT INTO Flight VALUES ('A05' , '12:04', '14:34', '2小时分' , ' 包头' , ' 南京' , 'B4' ); /--------航班信息的插入---------/
use MARKET
INSERT INTO Ticket VALUES ('0001' , ' 北京' , '325' , '12:01', 'C001' );
INSERT INTO Ticket VALUES ('0002' , ' 天津' , '326' , '12:02', 'C002' );
INSERT INTO Ticket VALUES ('0003' , ' 上海' , '327' , '12:03', 'C003' );
INSERT INTO Ticket VALUES ('0004' , ' 河北' , '328' , '12:04', 'C004' );
INSERT INTO Ticket VALUES ('0005' , ' 南京' , '329' , '12:05', 'C005' );
/--------机票信息的插入---------/
INSERT INTO Passenger VALUES ('00001' , ' 大卫' , '1234566' , ' 男' , '[1**********]' ); INSERT INTO Passenger VALUES ('00002' , ' 小明' , '1234567' , ' 女' , '[1**********]' ); INSERT INTO Passenger VALUES ('00003' , ' 小张' , '1234568' , ' 男' , '[1**********]' ); INSERT INTO Passenger VALUES ('00004' , ' 小青' , '1234569' , ' 女' , '[1**********]' ); INSERT INTO Passenger VALUES ('00005' , ' 小白' , '1234560' , ' 男' , '[1**********]' ); /--------旅客信息的插入---------/
use MARKET
INSERT INTO Booking_ticket
VALUES ('B00001' , 'A01' , 'C001' , '00001' , '1' , '325' , '2小时分' , '0001' );
INSERT INTO Booking_ticket
VALUES ('B00002' , 'A02' , 'C002' , '00002' , '2' , '326' , '2小时分' , '0002' );
INSERT INTO Booking_ticket
VALUES ('B00003' , 'A03' , 'C003' , '00003' , '2' , '327' , '2小时分' , '0003' );
INSERT INTO Booking_ticket
VALUES ('B00004' , 'A04' , 'C004' , '00004' , '1' , '328' , '2小时分' , '0004' );
INSERT INTO Booking_ticket
VALUES ('B00005' , 'A05' , 'C005' , '00005' , '1' , '329' , '2小时分' , '0005' );
/--------订单信息的插入---------/
use MARKET
INSERT INTO Refund VALUES ('D001' , '00001' , '0001' );
INSERT INTO Refund VALUES ('D002' , '00002' , '0002' );
INSERT INTO Refund VALUES ('D003' , '00003' , '0003' );
INSERT INTO Refund VALUES ('D004' , '00004' , '0004' );
INSERT INTO Refund VALUES ('D005' , '00005' , '0005' );
/--------退票信息的插入---------/
use MARKET
INSERT INTO Relation VALUES ('E001' , '0001' , '00001' );
INSERT INTO Relation VALUES ('E002' , '0002' , '00002' );
INSERT INTO Relation VALUES ('E003' , '0003' , '00003' );
INSERT INTO Relation VALUES ('E004' , '0004' , '00004' );
INSERT INTO Relation VALUES ('E005' , '0005' , '00005' );
use MARKET
INSERT INTO Seat VALUES ('C001' , 'A' , '0001' , ' 北京' );
INSERT INTO Seat VALUES ('C002' , 'B' , '0002' , ' 天津' );
INSERT INTO Seat VALUES ('C003' , 'C' , '0003' , ' 上海' );
INSERT INTO Seat VALUES ('C004' , 'D' , '0004' , ' 河北' );
INSERT INTO Seat VALUES ('C005' , 'E' , '0005' , ' 南京' );
/--------座位信息的插入---------/
第七章 总结
本次数据库的课程设计总共用了两个星期,总的来说最困难的地方是设计分析阶段,我选择的是飞机票预定系统的数据库设计。开始不太了解情况,为了更加深入的了解,我在网上登录几个大的民航订票网站,我发现只有支付过机票钱才能提交订单,所以我没有看到订单的具体情况,只根据自己的理解写的订单的情况。之后关于机票的信息,所以我觉得电子机票里应该包括了所有信息,订单信息里面也有旅客信息,航班信息,机票信息等。
本来机票还可以退票和改签,网上我知道能退票,我本来想再设计可以在网上改签的功能,但是改签机票需要考虑许多因素,要考虑机票是否是打折的,和所在舱位,还有是否换航空公司等,不是一个因素决定的。如果时间再长一些,会仔细研究改签的问题。
通过本次实验,更加熟练的掌握了相关工具,还可以熟练的使用Visio 来画ER 图。也知道了如何搜索信息,对于画图也增加了审美感。虽然现在的许多系统看似很好,但是还有许多需要完善的地方,我们也要努力学习,有创新的思想,来完善未来的系统,虽然现在是模仿阶段,但应该会走的更远。
第八章 参考文献
1. 王英英 张少军 刘增杰. SQL SERVER 从零开始学〔D〕,清华大学出版社,2012
2. 数据库系统教程 (第三版) 施伯乐 丁宝康 汪卫 编著 高等教育出版社
附录
SQL 编程规范
一、sql 书写规范:
二、书写优化性能建议
三、其他经验性规则
一、sql 书写规范:
1、sql 语句的所有表名、字段名全部首字母大写,系统保留
字、内置函数名、sql 保留字大写。
2、连接符or 、in 、and 、以及=、=等前后加上一个空格。
3、对较为复杂的sql 语句加上注释,说明算法、功能。
注释风格:注释单独成行、放在语句前面。 (1) 应对不易理解的分支条件表达式加注释; (2) 对重要的计算应说明其功能; (3) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明; (4) 每条SQL 语句均应有注释说明(表名、字段名)。 (5) 常量及变量注释时,应注释被保存值的含义(必须) ,合法取值的范围(可选) (6) 可采用单行/多行注释。(-- 或 /* */ 方式)
4、SQL 语句的缩进风格
(1) 一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进
(2) where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。
5、多表连接时,使用表的别名来引用列。
6、供别的文件或函数调用的函数,绝不应使用全局变量交换数据; 如例(1)
二、书写优化性能建议
1、避免嵌套连接。例如:A = B and B = C and C = D
2、where 条件中尽量减少使用常量比较,改用主机变量
3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表
作为驱动表(from 后边最后一个表)。
4、大量的排序操作影响系统性能,所以尽量减少order by和group by 排序操作。
如必须使用排序操作,请遵循如下规则:
(1) 排序尽量建立在有索引的列上。 (2) 如结果集不需唯一,使用union all代替union 。
5、索引的使用。
(1) 尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。 (2) 尽量注意比较值与索引列数据类型的一致性。
(3) 对于复合索引,SQL 语句必须使用主索引列 (4) 索引中,尽量避免使用NULL 。 (5) 对于索引的比较,尽量避免使用NOT=(!=) (6) 查询列和排序列与索引列次序保持一致
6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析。
7、尽量使用共享的SQL 语句。
8、查询的WHERE 过滤原则,应使过滤记录数最多的条件放在最前面。
9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
10、in 、or 子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
三、其他经验性规则
1、尽量少用嵌套查询。如必须,请用not exist代替not in子句。如例(2)
2、用多表连接代替EXISTS 子句。如例(3)
3、少用DISTINCT ,用EXISTS 代替 如例(4)
4、使用UNION ALL、MINUS 、INTERSECT 提高性能
5、使用ROWID 提高检索速度。对SELECT 得到的单行记录,需进行DELETE 、UPDATE 操作时,使用ROWID 将会使效率大大提高。
6、使用优化线索机制进行访问路径控制。
7、使用cursor 时,显示光标优于隐式光标
第一章 绪论
1.1课题简介
随着时代的发展,计算系软件和系统的成熟,机票如果简单方面预定成为一个影响多数人生活的问题。而建立机票预定系统是一个很好的解决办法。经过三年的学习,我们对计算机方面的知识有了很大的提升,本着理论联系实际的宗旨,通过学校提供的这次课程设计实践的机会,在指导教师的帮助下,历经两周时间,我自行设计一套机票预定管理系统,在下面的各章中,我将以这套机票预定系统信息系统为例, 谈谈其开发过程和所涉及到的问题。
1.2设计目的
应用对数据库系统原理的理论学习,通过上机实践的方式将理论知识与实践更好的结合起来,巩固所学知识。
实践和巩固在课堂教学中学习的关于关系数据库原理的有关知识和数据库系统的建立方法,熟练掌握对于给定实际问题,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程,为毕业设计打下基础。
1.3设计内容
选择课题并且对课题的相关信息有一定的了解,对于我选的课题来说,我必须了解机票预定系统的构造以及购票人的信息还有机票的相关信息。通过这些信息制成表格,输入到数据库中,使之能够进行查询、修改、删除并且与机票预定系统执行相同的操作。需求分析阶段就是要研究我所作的机票预定系统的具体分类和实施过程流图。概念设计阶段要完成数据抽象与局部视图设计还有视图的集成。逻辑结构设计阶段要把E-R 图转化为关系模式。最后就是要运行和实施数据库。
第二章 需求分析
2.1 需求分析的任务
调查机票预定系统应用领域涉及的内容,对涉及到领域的各个应用的信息要求和操作要求进行详细分析,形成需求分析说明书。最重要的是调查、收集信息、分析购票人信息和飞机预定流程。处理要求、数据的安全性与完整性要求。
要求系统能有效、快速、安全、可靠和无误的完成上述操作。并要求客户机的界面要简单明了,易于操作,服务器程序利于维护。
2.2 需求分析的过程
航空公司为方便旅客,需开发一个机票预定系统。为便于旅客由旅行社代替航空公司负责为旅客定票,旅行社把预定机票的旅客信息,包括姓名、性别、工作单位、身份证号码、旅行时间、旅行目的地,输入机票预定系统的客户端程序,系统经过查询航空公司内的航班数据服务器后,为旅客安排航班,印出取票通知。旅客在飞机起飞前一天凭取票通知和帐单交款后取票,系统校对无误后即印出机票给旅客。如果某方面出现问题,旅客可以持有效证件去飞机场退票。
要求系统能有效、快速、安全、可靠和无误的完成上述操作。并要求客户机的界面要简单明了,易于操作,服务器程序利于维护。
经过综合分析,确定了机票预订管理系统主要包括以下功能: (1)订单信息管理功能
主要是实现管理员对订票信息的管理,包括对航班基本信息如航班号、起飞地、目的地、起飞时间等,旅客基本信息如旅客姓名、性别、电话号码、身份证号、座位号、订票数量的添加、修改、删除和查询功能。
订单信息管理系统图2-1
(2)旅客信息管理功能
主要是实现管理员对旅客一些基本信息,如旅客姓名、性别、电话号码、身份证号的添加、修改、删除和查询功能。
旅客信息管理系统图2-2
(3) 航班信息管理功能
主要实现管理员对航班的一些基本信息,航班号、起飞地、目的地、起飞时间的
添加、修改、删除查询和功能。
航班信息管理系统图2-3
(4) 机票信息管理功能
主要实现管理员对机票的一些基本信息,如航班号、座位号、座位信息、机票类型的添加、修改、删除和查询功能。
机票信息管理系统图2-4
(5) 退票信息管理功能
主要是实现管理员对退票信息的管理,包括对订单号、旅客姓名、电话号码、身份证号的添加、修改、删除和查询功能。
退票信息管理系统图2-5
2.3数据字典与流程图
2.3.1数据字典
数据字典是用来规范描述数据具体内容的工具,也是对数据汇总分析的一个总结。一般来说,可为每个数据建立一张二维表。在本系统中,分别为旅客信息、旅客订票信息、航班机票信息、旅客与机票的联系、退票信息建立了数据字典,具体如表2-1到表2-6所示。 主键:蓝色 外键:下划线
表2-1 订单信息的数据字典
表2-2 航班信息的数据字典
表2-3 机票信息的数据字典
表2-4 旅客信息的数据字典
表2-5 旅客与机票信息的联系数据字典
表2-6退票信息的数据字典
2.3.2基本流程图
机票预订系统流程图2-6
第三章 ER模型图
3.1实体属性图
订单信息实体属性图3-1
航班信息实体属性图3-2
机票信息实体属性图3-3
客户与机票实体属性图3-4
旅客信息实体属性图3-5
座位信息实体属性图3-6
3.2总体ER 模型图
退票信息实体属性图3-7
第四章 逻辑结构设计
4.1 E-R图向关系模型的转换
订单信息(订单号,航班号,座位号,数量,类型) 退票信息(订单号,旅客编号,时间)
旅客信息(旅客编号,身份证号,姓名,性别,联系电话)
4.2 数据模型的优化
将转化的关系模式进行优化,最终达到第三范式。 1、确定数据依赖
退票信息(订单号,旅客姓名,航班号)根据这个关系写出数据依赖 订单号→旅客姓名,订单号→座位号,订单号→航班号 旅客(旅客姓名,旅客编号,电话号,性别)
旅客姓名→身份证号,旅客姓名→电话号,旅客姓名→性别 航班信息表(航班号,起飞地,目的地,起飞时间)
航班号→起飞地,航班号→目的地,航班号→起飞时间 座位信息表(座位号,航班号, 座位信息,机票类型) (座位号,航班号)→座位信息,(座位号,航班号,座位信息)→机票类型
2、 3、
对各关系模式间数据依赖进行极小化处理,消除冗余
看这些模式是否符合要求,确定是否要对某些模式进行合并或者分解
订单号→旅客编号,订单号→座位号,订单号→机票编号,订单号→机票编号 最终分解成第三范式:
(订单号,机票编号,机票类型)(订单号,旅客编号)(旅客编号,旅客姓名,性别)(旅客姓名,座位号)(航班号,座位号,机票类型)(航班号,起飞地,目的地,起飞时间)
第五章 功能实现
5.1查询功能的实现
通过查询功能我们可以找到相关的信息。
USE MARKET
SELECT * FROM Seat
查询功能图5-1
5.2多条件查询功能的实现
使用多条件查询功能可以增加查询的限制条件,这样可以使查询的结果更准
确。
USE MARKET
SELECT * FROM Passenger WHERE Sex='女'AND Passenger_Name='小青'
多条件查询功能图5-2
5.3添加功能的实现
通过添加功能实现对数据的增加,录入需要的信息。 USE MARKET
INSERT INTO Passenger VALUES ('00001' , ' 大卫' , '1234566' , ' 男' , '[1**********]' );
添加功能图5-3
5.4删除功能的实现
可以实现对一些变更的信息删除,从而能够达到一定的效果。
USE MARKET
DELETE FROM Booking_Ticket WHERE Booking_Number='B00001'
删除功能图5-4
5.5更改功能的实现
通过更改功能我们可以对其信息修改,比如机票座位类型,目的地等做相应的修改
USE MARKET
SELECT * FROM Flight WHERE Flight_Number=A01 Update Flight
SET Destination='呼和浩特' where Flight_Number=A01 SELECT * FROM Flight_Number=A0
Flight Where
更改功能图5-5
5.6视图的建立
视图就是创建一个可以实现添加创建的续表,从而实现效果。
视图5-6
第六章 源代码
建库:
create database [MARKET] on primary (
name = 'ticket_db',
filename = 'F:\数据库课程设计\ticket.mdf', size = 5mb ,
maxsize = 30mb , filegrowth = 5% )
log on (
name = 'ticket' ,
filename = 'F:\数据库课程设计\ticket_log.ldf', size = 1mb ,
maxsize = 10mb , filegrowth = 10%
)
建表:
CREATE TABLE Booking_Ticket/--------订单信息表的创建---------/ (
Booking_Number varchar (50) primary key , /--------设置主键---------/Flight_Number varchar (50) not null, Seat_Number varchar (50) not null,
Passenger_Number varchar (50) not null, Amount varchar (50) not null, Price varchar (50) not null, Time varchar (50) not null, ) ;
USE MARKET
CREATE TABLE Flight/--------航班信息表的创建---------/ (
Flight_Number varchar (50) primary key , /--------设置主键---------/ akeoff_Time varchar (50) not null, ArTrival_Time varchar (50) not null, Flight_Time varchar (50) not null, Origin varchar (50) not null,
Destination varchar (50) not null, Flight_Type varchar (50) not null );
USE MARKET
CREATE TABLE Passenger/--------旅客信息表的创建---------/ (
Passenger_Number varchar (50) primary key , /--------设置主键---------/ Passenger_Name varchar (50) not null, ID_Number varchar (50) not null, Sex varchar (50) not null,
Telephone varchar (50) not null );
USE MARKET
CREATE TABLE Seat/--------座位信息表的创建---------/ (
Seat_Number varchar (50) primary key , /--------设置主键---------/ Seat_Type varchar (50) not null,
Ticket_Number varchar (50) not null, Destination varchar (50) not null );
USE MARKET
CREATE TABLE Ticket (
Ticket_Number varchar (50) primary key , /--------设置主键---------/ Destination varchar (50) not null, Price varchar (50) not null,
Takeoff_Time varchar (50) not null Seat_Number varchar (50) not null );
USE MARKET
CREATE TABLE Relation/--------关系的创建---------/ (
Number varchar (50) primary key , /--------设置主键---------/ Ticket_Number varchar (50) not null, Passenger_Number varchar (50) not null, );
USE MARKET
CREATE TABLE Refund/--------退票信息表的创建---------/ (
Order_Number varchar (50) primary key , /--------设置主键---------/ Passenger_Number varchar (50) not null, Booking_Number varchar (50) not null, );
设置外键:
use MARKET go
alter table Booking_Ticket
add constraint fk_storeDI foreign key (Seat_Number) references Seat (Seat_Number)
use MARKET go
alter table Booking_Ticket
add constraint fk_storeADI foreign key (Flight_Number) references Flight (Flight_Number)
use MARKET go
alter table Booking_Ticket
add constraint fk_storeI foreign key (Passenger_Number) references Passenger (Passenger_Number)
use MARKET
go
alter table Refund
add constraint fk_storI foreign key (Passenger_Number) references
Passenger (Passenger_Number)
use MARKET
go
alter table Refund
add constraint fk_sorI foreign key (Booking_Number) references
Booking_Ticket(Booking_Number)
use MARKET
go
alter table Booking_Ticket
add constraint fk_sosI foreign key (Ticket_Number) references
Ticket (Ticket_Number)
use MARKET
go
alter table Relation
add constraint fk_sowsI foreign key (Ticket_Number) references
Ticket (Ticket_Number)
use MARKET
go
alter table Relation
add constraint fk_saI foreign key (Passenger_Number) references
Passenger (Passenger_Number)
use MARKET
go
alter table Booking_Ticket
add constraint fk_saiI foreign key (Ticket_Number) references
Ticket (Ticket_Number)
设置约束条件:
use MARKET
go
alter table Passenger
add check (Sex in(' 男' , ' 女' )); /--------设置外键约束---------/
数据的插入:
use MARKET
INSERT INTO Flight VALUES ('A01' , '12:00', '14:30', '2小时分' , ' 包头' , ' 北京' , 'B0' ); INSERT INTO Flight VALUES ('A02' , '12:01', '14:31', '2小时分' , ' 包头' , ' 天津' , 'B1' ); INSERT INTO Flight VALUES ('A03' , '12:02', '14:32', '2小时分' , ' 包头' , ' 上海' , 'B2' ); INSERT INTO Flight VALUES ('A04' , '12:03', '14:33', '2小时分' , ' 包头' , ' 河北' , 'B3' ); INSERT INTO Flight VALUES ('A05' , '12:04', '14:34', '2小时分' , ' 包头' , ' 南京' , 'B4' ); /--------航班信息的插入---------/
use MARKET
INSERT INTO Ticket VALUES ('0001' , ' 北京' , '325' , '12:01', 'C001' );
INSERT INTO Ticket VALUES ('0002' , ' 天津' , '326' , '12:02', 'C002' );
INSERT INTO Ticket VALUES ('0003' , ' 上海' , '327' , '12:03', 'C003' );
INSERT INTO Ticket VALUES ('0004' , ' 河北' , '328' , '12:04', 'C004' );
INSERT INTO Ticket VALUES ('0005' , ' 南京' , '329' , '12:05', 'C005' );
/--------机票信息的插入---------/
INSERT INTO Passenger VALUES ('00001' , ' 大卫' , '1234566' , ' 男' , '[1**********]' ); INSERT INTO Passenger VALUES ('00002' , ' 小明' , '1234567' , ' 女' , '[1**********]' ); INSERT INTO Passenger VALUES ('00003' , ' 小张' , '1234568' , ' 男' , '[1**********]' ); INSERT INTO Passenger VALUES ('00004' , ' 小青' , '1234569' , ' 女' , '[1**********]' ); INSERT INTO Passenger VALUES ('00005' , ' 小白' , '1234560' , ' 男' , '[1**********]' ); /--------旅客信息的插入---------/
use MARKET
INSERT INTO Booking_ticket
VALUES ('B00001' , 'A01' , 'C001' , '00001' , '1' , '325' , '2小时分' , '0001' );
INSERT INTO Booking_ticket
VALUES ('B00002' , 'A02' , 'C002' , '00002' , '2' , '326' , '2小时分' , '0002' );
INSERT INTO Booking_ticket
VALUES ('B00003' , 'A03' , 'C003' , '00003' , '2' , '327' , '2小时分' , '0003' );
INSERT INTO Booking_ticket
VALUES ('B00004' , 'A04' , 'C004' , '00004' , '1' , '328' , '2小时分' , '0004' );
INSERT INTO Booking_ticket
VALUES ('B00005' , 'A05' , 'C005' , '00005' , '1' , '329' , '2小时分' , '0005' );
/--------订单信息的插入---------/
use MARKET
INSERT INTO Refund VALUES ('D001' , '00001' , '0001' );
INSERT INTO Refund VALUES ('D002' , '00002' , '0002' );
INSERT INTO Refund VALUES ('D003' , '00003' , '0003' );
INSERT INTO Refund VALUES ('D004' , '00004' , '0004' );
INSERT INTO Refund VALUES ('D005' , '00005' , '0005' );
/--------退票信息的插入---------/
use MARKET
INSERT INTO Relation VALUES ('E001' , '0001' , '00001' );
INSERT INTO Relation VALUES ('E002' , '0002' , '00002' );
INSERT INTO Relation VALUES ('E003' , '0003' , '00003' );
INSERT INTO Relation VALUES ('E004' , '0004' , '00004' );
INSERT INTO Relation VALUES ('E005' , '0005' , '00005' );
use MARKET
INSERT INTO Seat VALUES ('C001' , 'A' , '0001' , ' 北京' );
INSERT INTO Seat VALUES ('C002' , 'B' , '0002' , ' 天津' );
INSERT INTO Seat VALUES ('C003' , 'C' , '0003' , ' 上海' );
INSERT INTO Seat VALUES ('C004' , 'D' , '0004' , ' 河北' );
INSERT INTO Seat VALUES ('C005' , 'E' , '0005' , ' 南京' );
/--------座位信息的插入---------/
第七章 总结
本次数据库的课程设计总共用了两个星期,总的来说最困难的地方是设计分析阶段,我选择的是飞机票预定系统的数据库设计。开始不太了解情况,为了更加深入的了解,我在网上登录几个大的民航订票网站,我发现只有支付过机票钱才能提交订单,所以我没有看到订单的具体情况,只根据自己的理解写的订单的情况。之后关于机票的信息,所以我觉得电子机票里应该包括了所有信息,订单信息里面也有旅客信息,航班信息,机票信息等。
本来机票还可以退票和改签,网上我知道能退票,我本来想再设计可以在网上改签的功能,但是改签机票需要考虑许多因素,要考虑机票是否是打折的,和所在舱位,还有是否换航空公司等,不是一个因素决定的。如果时间再长一些,会仔细研究改签的问题。
通过本次实验,更加熟练的掌握了相关工具,还可以熟练的使用Visio 来画ER 图。也知道了如何搜索信息,对于画图也增加了审美感。虽然现在的许多系统看似很好,但是还有许多需要完善的地方,我们也要努力学习,有创新的思想,来完善未来的系统,虽然现在是模仿阶段,但应该会走的更远。
第八章 参考文献
1. 王英英 张少军 刘增杰. SQL SERVER 从零开始学〔D〕,清华大学出版社,2012
2. 数据库系统教程 (第三版) 施伯乐 丁宝康 汪卫 编著 高等教育出版社
附录
SQL 编程规范
一、sql 书写规范:
二、书写优化性能建议
三、其他经验性规则
一、sql 书写规范:
1、sql 语句的所有表名、字段名全部首字母大写,系统保留
字、内置函数名、sql 保留字大写。
2、连接符or 、in 、and 、以及=、=等前后加上一个空格。
3、对较为复杂的sql 语句加上注释,说明算法、功能。
注释风格:注释单独成行、放在语句前面。 (1) 应对不易理解的分支条件表达式加注释; (2) 对重要的计算应说明其功能; (3) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明; (4) 每条SQL 语句均应有注释说明(表名、字段名)。 (5) 常量及变量注释时,应注释被保存值的含义(必须) ,合法取值的范围(可选) (6) 可采用单行/多行注释。(-- 或 /* */ 方式)
4、SQL 语句的缩进风格
(1) 一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进
(2) where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。
5、多表连接时,使用表的别名来引用列。
6、供别的文件或函数调用的函数,绝不应使用全局变量交换数据; 如例(1)
二、书写优化性能建议
1、避免嵌套连接。例如:A = B and B = C and C = D
2、where 条件中尽量减少使用常量比较,改用主机变量
3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表
作为驱动表(from 后边最后一个表)。
4、大量的排序操作影响系统性能,所以尽量减少order by和group by 排序操作。
如必须使用排序操作,请遵循如下规则:
(1) 排序尽量建立在有索引的列上。 (2) 如结果集不需唯一,使用union all代替union 。
5、索引的使用。
(1) 尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。 (2) 尽量注意比较值与索引列数据类型的一致性。
(3) 对于复合索引,SQL 语句必须使用主索引列 (4) 索引中,尽量避免使用NULL 。 (5) 对于索引的比较,尽量避免使用NOT=(!=) (6) 查询列和排序列与索引列次序保持一致
6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析。
7、尽量使用共享的SQL 语句。
8、查询的WHERE 过滤原则,应使过滤记录数最多的条件放在最前面。
9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
10、in 、or 子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
三、其他经验性规则
1、尽量少用嵌套查询。如必须,请用not exist代替not in子句。如例(2)
2、用多表连接代替EXISTS 子句。如例(3)
3、少用DISTINCT ,用EXISTS 代替 如例(4)
4、使用UNION ALL、MINUS 、INTERSECT 提高性能
5、使用ROWID 提高检索速度。对SELECT 得到的单行记录,需进行DELETE 、UPDATE 操作时,使用ROWID 将会使效率大大提高。
6、使用优化线索机制进行访问路径控制。
7、使用cursor 时,显示光标优于隐式光标