课程设计示例——客房管理系统设计
一、课程设计的目的和意义
在当今经济和商务交往日益频繁的状况下,宾馆服务行当正面临客流量骤增的压力。越来越多的宾馆饭店都认识到传统的管理方法已经不能适合当今社会的需要,必须借助先进的计算机信息技术对宾馆服务进行管理。“客房管理系统”可以说是整个宾馆计算机信息管理系统的中心子系统,因为宾馆最主要的功能就是为旅客提供客房。设计客房管理这样一个系统,可以涉及到大多数SQL Server数据库的重要数据库对象、重要功能和特性,比如:视图、触发器和存储过程等。由此,通过这个课程设计可以加深对这些SQL Server数据库知识的学习、理解,积累在实际工程应用中运用各种数据库对象的经验,使学生掌握使用应用软件开发工具开发数据库管理系统的基本方法。在实用性方面,客房管理系统是很普遍的一种应用,选择该系统作为课程设计也可以为学生以后可能遇到的实际开发提供借鉴。
二、系统功能设计
系统功能是在实际开发设计过程中经过调研、分析用户需求,和用户一起共同确定下来的,是系统为满足用户需求所应完成的功能。本课程设计模拟一个小型客房管理系统。本系统要求实现以下主要功能:
1、 数据录入功能:
在本系统中提供客人信息登记功能。可以录入客人的姓名、性别、年龄、身份证号码、 家庭住址、工作单位、来自地的地名、入住时间、预计入住天数、客房类别、客房号、离店时间以及缴纳押金金额等信息。在客人退房时,系统根据输入的离店时间以及客房单价自动计算客人住宿费金额。 2、 数据查询功能
系统需要提供以下查询功能:
1) 查某类客房的入住情况及空房情况,显示所有该类客房空房数目和客房号。
2) 根据客人姓名、来自地的地名、工作单位或家庭住址等信息查询客人信息;根据客
房号查询入住客人的信息。
3) 查询某个客人住宿费用情况,显示客人缴纳押金金额、实际入住天数、客房价格、
实际住宿费、住宿费差额及余额等信息。
4) 查询所有入住时间达到或超过预计入住天数的客人。 3、数据统计功能
1)统计一段时间内各类客房的入住情况。 2)统计全年各月份的客房收入。
3)统计一段时间内各类客房的入住率。
三、数据库设计
数据库设计是根据系统功能的要求和数据规模规划数据库服务器选型、数据表结构定义、分配数据库服务器端的功能实现以及创建数据库对象。
1、数据库与数据表设计 分析前面的系统功能要求,需要一个表来存储和管理客人信息,使系统能够接受客人入住时输入的各项数据,以实现数据录入、查询或统计客人信息等功能。客人是本系统的第一个实体。为了能实现查询和统计客房入住情况等功能,必须有一个表来存储和管理所有客房的信息,包括客房的类型、客房号、是否入住客人等。客房是本系统的第二个实体。一般来说,客房价格是以客房的类型来制定的。为了保证系统数据库最小的数据冗余和数据完整性,需要建立一个表来记录各种客房类型的信息。它主要为各种查询和统计功能提供客房价格数据。它与客房表是一对多的关系,在客房价格变动时,只需要在客房类型表中更改。
综上所述,在客房管理(KFGL)数据库中需要建立3个数据表:客人信息数据表、客房信息数据表和客房类型数据表。 (1)客人信息数据表定义
根据系统功能要求,客人信息表需要能接受客人登记入住和离店时输入的所有信息.还必须包括客人最终的住宿费金额,因为住宿费金额是统计客房收入的基本数据。
客人信息表的结构定义如表1所示。
表1 客人信息数据表定义 列名 数据类型 大小 空 值 键 说明 cId cName cSex cAge cPNum cAdd cWork cFrom cInTime cDay rNum cOutTime cDeposit cCost int 4 主键(标识列) 序号 char 8 姓名 bit 1 性别 tinyint 1 √ 年龄 char 18 身份证号码 varchar 50 √ 家庭住址 varchar 50 √ 工作单位 char 10 来自地的地名 smalldatetime 4 入住时间 Tinyint 1 预计入住天数 char 5 客房号 smalldatetime 4 √ 离店时间 smallmoney 4 √ 押金金额 smallmoney 4 √ 住宿费 其中,cId(序号)是表的主键,唯一标识一个入住的客人。设计时定义它为标识列,系统自动地产生连续的永不重复的序列号。
rNum(客房号)在客人信息表中是外键,它是客房信息表的主键,唯一标识一个房间。通过它,系统将引用到客房类型、客房单价等信息。 客人信息表取名为tblClient。 (2)客房信息数据表定义
客房信息表中应该记录每一个客房的信息和状态,系统查询这些信息并决定客人能否入住。每个客房的类型决定了客房的价格,可供客人入住时选择房间及离店时结算住宿费用。
客房数据表的定义如表2所示。
表2 客房信息数据表定义 列名 数据类型 大 小 空 值 键 说明 rNum rStats rType char 5 主键 客房号 char 1 客房状态 char 2 客房类型编号 char 9 √ 入住客人序号 cID 其中,rNum(客房号)是该表的主键,唯一标识一个客房房间。它将作为客人信息表的外键,保证客人信息表的参照完整性。
rStats 表示房间的状态,设定其值为“N”时,表示客房没有入住客人;值为“F”时,表示客房以有客人入住;值为“P”时,表示客房被预定。
rType 表示客房的类型,它是该表的一个外键,来自下面将要说明的客房类型数据表。 cId 将记录入住客人的序号,在客房信息表中增加这一列时,虽然增加了数据冗余,但可以在查询房间中入住客人信息时,提高系统的性能。因为客房信息表的记录数相对固定,相比之下,增加这个冗余的列对于整个系统来说是有利的。
客房信息表取名为tblRoom。 (3)客房类型数据表定义
客房类型主要描述客房的服务标准和收费价格,这些信息如果包含进每个客房的记录中,将会使客房信息表产生较大的数据冗余,特别在客房数量大的情况下。此外,如果客房信息表的每条记录都包括价格信息,那当某种类型的客房价格变动时,用户就不得不对客房
信息表中的记录逐一进行修改。客房类型数据表的定义如表3-3所示。
表3-3 客房类型数据表定义 列名 数据类型 大 小 空 值 键 说明 rType rName rPrice char 2 主键 客房类型编号 char 10 客房类型名称 smallmoney 4 该类型客房价格 其中,rType 表示客房类型的编号,作为该表的主键,唯一标识某一类客房。它将作为客房信息表的外键,保证客房信息表数据的完整性。 客房类型数据表取名为tblRoomType。
(4)根据上面三个数据表的设计,可执行下面的步骤创建数据表 1)在服务器计算机上安装 MS SQL Server 2000。
2)打开企业管理器,在本地服务器上创建新的数据库KFGL。 3)展开KFGL数据库,单击“表”,按照设计,创建表tblClient、tblRoom和tblRoomType 2、数据完整性设计
设计好表的结构后,需要根据实际应用和操作规则为表制定一系列约束和规则,从而达到保证数据完整性原则的目的。
约束
(1)主键约束、非空值约束
在三个表的设计中已经规定了每个表的主键列、非空列,这些规定都是在实际应用环境中所必需的。比如tblRoom表中定义了房间号rNum为主键,则在表tblRoomr中Num必须是唯一的——一个饭店不可能出现两个房间号码相同的客房;客房类型Type和客房状态rStats 不能为空值,因为rType是辨别客人入住客房中类、住宿费用结算的依据,所以不能 为空值;rStats是辨别客人能否入住的依据,所以也不能为空值。 (2)CHECK 约束
对于tblClient表,应该建立一个检查约束,即所有客人的离店时间都不可能小于入住时间。
按下列步骤创建这个约束:
1) 打开企业管理器,展开服务器,展开“数据库”,展开“KFGL”数据库,单击“表”。 2) 用鼠标右键单击“tblClent”表,选择“设计表”,系统将弹出“设计表”对话窗口。 3) 用鼠标右键单击此窗口的上方窗格,单击“CHECK约束”,单击“新建”按钮,在
“约束表达式”文本框中输入表达式:([cOutTime]>=[cInTime])。 4) 选择“对INSERT和UPDATE操作强制约束”复选框,单击“关闭”按钮,完成
CHECK约束创建操作。 (3)使用缺省值
可以将三个数据表中所有货币类型的列都定义为缺省值,特别是指定了“非空”约束的列。tblClient表的预住天数cDay的默认值可定义为1,而客人入住时间cInTime的缺省值应该就是添加客人记录的时间(除非是客房预定,在本系统中暂不考虑客房预定),所以可以设定缺省值为“(GETDATE)”。 (4)唯一约束
除了每个表的主键需定义为唯一外,对于tblRoomType的客房类型名rName,也应该定义为唯一的名称。因为在系统功能需求中,要求按客房类型对数据进行统计,如果在统计结果中只显示客房类型编号,用户就必须记忆那种类型是什么编号,这样很不直观。所以应按照相关的SQL Server数据库教材中建立唯一约束的方法进行创建。 (5)外键约束
在数据表设计中已经讨论了各个表的外键,这里以tblClient为例说明创建步骤,tblRoom和tblroomType表可以按照相同的步骤进行操作。
1)打开企业管理器,展开服务器,展开“数据库”,展开“KFGL”数据库,单击“表”。 2)用鼠标右键单击此“tblClient”表,选择“设计表”,系统将弹出“设计表”对话窗
口。 3)用鼠标右键单击此窗口的上方窗格,单击“关系”,在“主键表”下拉框中选择“tblRoom” 4)在“外键表”中选择“tblClient”。
5) 在“主键表”和“外键表”下方的窗格中都选择列名“rNum”,表明tblRoom表中
的主键“rNum”就是tubClient表中的外键。选择“对INSERT和UPDAET操作强制约束”复选框,表明以后对tblClient表中的rNum所有的添加和更新操作都会检查在tblRoom表中是否存在与此相应的rNum。单击“关闭”按钮,完成创建操作。 (6)规则
为了检查tblClinent表中输入的身份证号码cPNum是有效位数(我国身份证号码有旧的15位数字和18位数字两种),可以创建一个规则邦定到该列,在数据操作时进行检查。规则的定义语句为:
(LEN(@CardNum)=15) OR (LEN(@CardNum)=18) 创建和绑定的方法及步骤请参见教材中的相关内容。 (7)标识列
在设计客人信息表tblClient时,我们把客人序号cId定义为标识列,使其在添加记录时自动产生序列号,并且每个序号唯一地标识一次客人入住信息。
完成数据完整性设计后,登入模拟数据。 3、视图、触发器和存储过程设计
定义了系统需要的数据库和表的结构后,下面进一步分析整个客房管理系统中的业务流程。在这里,需要确定哪些业务处理和数据处理的功能使用MS SQL Server来实现,那些数据处理的功能由应用程序实现,从而设计特定的视图、触发器或存储过程。下面将讨论系统需要设计并创建的视图、触发器和存储过程。 (1)客人选择客房处理
客人来到饭店入住前要做的第一件事是选择合适的房间,客人将告知饭店服务员自己需要的客房类型,服务员在系统中选择指定的客房类型后系统将显示所有的空余的该类型房间,并显示该类型客房价格供客人参考选择。这个过程可以通过一个存储过程来实现。
在这个存储过程中,需要的输入参数是客房类型,输出的结果集是所有这种客房类型的空房记录和价格。定义这个存储过程为SelRoom,定义输入的参数名为RoomType,定义输出的价格参数名为RoomPrice。根据存储过程的创建语法,编写SelRoom的实现代码如下: CREATE PROCEDURE SelRoom @RoomType char(2)
@RoomPrice smallmoney OUTPUT
AS
SELECT rNUM FROM tblRoom
WHERE(rType=@RoomType) AND(rStats=‘N’) SELECT @RoomPrice=rprice FROM tblRoomType WHERE rType=@RoomType GO
在上面的代码中包含了两个SELECT语句,第一个SELECT语句从tblRoom表中选择了所有客房类型为输入参数指定类型并且客房状态为“空”(N)的客房号,并将所有记录作为结果集返回;第二个SELECT语句从tblRoomType中取得了指定客房类型的价格,作为输出参数RoomType返回。 (2)客人入住登记处理 客人入住登记操作完成后,入住的客房状态应该及时做相应的改变,并记录客人的序号供以后查询。这一功能可以使用触发器来自动进行:因为进行客人入住登记操作是在客人信息表tblClient中添加一条新的记录,所以可以为tblClient设计一个Insert触发器,当tblClient执行Insert操作后自动更改tblRoom相应客房记录的数据。
定义这个触发器名称为client-insert。其实现代码如下:

