文章只截取部分代码,想要完整源码的小伙伴在评论区留言
目录
1 概述
1.2相关技术分析
2 系统功能设计
3数据库设计
3.1 概念结构设计
3.2逻辑结构设计
3.2.1 E-R图向关系模式的转换
3.2.2 表设计
3.3 物理结构设计
3.4 数据库实现
3.4.1 建表,并输入相关数据
3.4.2 触发器建立
3.4.3 存储过程建立
3.5数据库运行与维护
3.5.1备份与还原的原则
3.5.2 注意事项
3.5.3 数据库的备份计划
3.5.4 数据库的还原计划
4.系统功能实现
5 数据库操作界面
6 结束语
参考文献
1 概述
- 选题的背景与意义
随着我国经济快速发展,旅游出行的人民越来越多,商务活动也相当的活跃,大部分人在外都会选择居住宾馆。而传统的手工已不适应现代酒店管理的需要,及时、准确、全方位的网络化信息管理成为必需。宾馆客房管理系统是根据对客房管理的实际情况进行编写的,主要目的是为了方便酒店对客房的实际情况进行集中的查询与管理工作,以提高整个酒店的工作。
在众多宾馆客房管理系统中,此次课程设计旨在开发有关功能完善、界面友好、操作简单的宾馆客房管理系统。用户可以通过查询的方式获得客房信息情况,前台可以通过其身份认证实现对宾馆客房信息的修改和为客户办理入住、退房等功能。
1.2相关技术分析
操作系统Windows10
数据库软件navicat premium
操作语言SQL语言
2 系统功能设计
本系统主要用于对宾馆客房信息的管理,建立客房信息数据库,数据库中存储的主要信息有:
假设一个宾馆的客房信息都存储在客房信息表中,用户的信息存储在用户表中,客户类别信息存储在类别表中。前台管理员为网上预订或现场登记的用户办理入住,将用户表中没有的用户存储在用户表中,同时建立入住信息表。已经入住的用户可以通过呼叫服务人员将所需要的物品送到房间,建立物品使用表。用户办理退房手续时,管理员根据入住信息表和物品使用表的信息,结算相应的费用,将结算信息存储在结算表中。
通过sql语句,实现如下查询和修改功能:
- 查询指定用户
- 修改指定的房间信息
- 查询哪种类型房间居住的人最多
- 查询空的房间数量
- 查询名为“王惠”用户居住的客房信息
- 查询用户编号为1的物品使用情况
- 查询用户名为“王民”截至目前房间费用
- 查询用户名为“周慧”所用物品是谁结算的
- 若宾馆房间住满,一天的最大收入为多少
- 查询以客房类型分组,求各个类型的平均价格
- 当客户需要一间1人房和2人房时,在目前空房间下,有多少种选择,一一列出,按总价升序排列
3数据库设计
3.1 概念结构设计
在数据库设计时,需要考虑到数据的完整性、一致性和安全性。一般可以采用关系型数据库,如MySQL或Oracle来存储数据,我选择使用MySQL数据库来存储数据。同时,需要对数据库进行适当的优化,以提高系统的性能和响应速度。以下是部分实体属性图和E-R图。
用户表由用户编号、姓名、性别、身份证号、电话组成。如图1所示。
图1 用户的实体属性图
客房信息表由客房号、客房类型、客房状态、单价组成。如图2所示。
图2 客房的实体属性图
“用户”实体和“用户类别”实体存在“属于”的联系,一个用户只属于一个类别,一个类别包含多个用户,所以它们之间存在一对多的关系(1:n),如图3所示。
图3 用户与用户类别E-R图
“用户”实体与“物品”实体存在“使用”的联系,每个用户可以使用多种物品,每个物品只能被一个用户使用,所以“用户”实体与“物品”实体存在一对多的联系(1:n),如图4所示。
图4 用户与物品E-R图
“用户”实体与“客房”实体存在“住宿”关系,某个房间在某个时段分配给某个用户,在特定时段为1:1联系,但从整体来讲是多对多联系(m:n),如图5所示。
图5 用户与客房E-R图
“前台”实体与“客房”实体存在“结算”关系,一个前台人员可以结算多个房间的费用,每一个房间只需要一个前台人员结算,所以“前台”实体与“客房”实体存在一对多的联系(1:n)。如图6所示。
图6 前台与客房E-R图
系统总E-R图,如图7所示。
图7 系统总E-R图
3.2逻辑结构设计
逻辑结构设计一般分为三步:
1初始关系模式设计;
2关系模式规范化;
3模式的评价与改进
3.2.1 E-R图向关系模式的转换
转换原则:一个实体转换为一个关系模式,实体的属性就是关系的属性,实体的码就是关系的主码;一个联系转换为一个关系模式, 与该联系相连的各实体的主码以及联系的属性均转换为该关系的属性。该关系的主码有三种情况。
- 如果联系为1:1,则每个实体的主码都可以是关系的候选码。
②如果联系为1:n,则n端实体的主码是关系的主码。
- 如果联系为n:m,则每个实体的主码的组合是关系的主码。
将五个实体转换成关系模式:
用户类别(类别名称,需交押金,折扣);
用户(用户编号,姓名,性别,身份证号,电话,类别名称);
前台(员工编号,姓名,职称,电话)
客房(客房号,客房类型,客房状态,单价,员工编号);
物品(物品编号,物品名称,单价,物品数量,用户编号,员工编号);
将联系转化成关系模式:
住宿(用户编号,客房号,入住时间,退房时间)
由于上述转换基于的是全局E-R模型,因此,上述转换得到的模式满足3NF。
3.2.2 表设计
表1 用户类别表
字段名 | 类型 | 主键 | 外键 | 默认值 | 备注 |
Type | varchar | √ | 类别名称 | ||
deposit | Int | 需交押金 | |||
Discount | Decimal | 折扣 |
表2 用户表
字段名 | 类型 | 主键 | 外键 | 默认值 | 备注 |
userId | Int | √ | 用户编号 | ||
name | varchar | 姓名 | |||
sex | varchar | 男 | 性别 | ||
idnumber | varchar | 身份证号 | |||
phone | varchar | 电话 | |||
type | varchar | √ | 类别名称 |
表3 前台表
字段名 | 类型 | 主键 | 外键 | 默认值 | 备注 |
workId | Int | √ | 员工编号 | ||
name | varchar | 姓名 | |||
Job | varchar | 职称 | |||
phone | varchar | 电话 |
表4 客房表
字段名 | 类型 | 主键 | 外键 | 默认 | 备注 |
roomId | Int | √ | 客房号 | ||
Size | Varchar | 客房类型 | |||
State | Varchar | 客房状态 | |||
price | decimal | 单价 | |||
workId | int | √ | 员工编号 |
表5 物品表
字段名 | 类型 | 主键 | 外键 | 默认 | 备注 |
itemId | Int | √ | 物品编号 | ||
name | Varchar | 物品名称 | |||
price | decimal | 单价 | |||
count | int | 物品数量 | |||
userId | int | √ | 用户编号 | ||
workId | int | √ | 员工编号 |
表6 住宿表
字段名 | 类型 | 主键 | 外键 | 默认 | 备注 |
userId | Int | √ | √ | 用户编号 | |
roomId | Int | √ | √ | 客房号 | |
staytime | datetime | √ | 入住时间 | ||
lefttime | datetime | 退房时间 |
3.3 物理结构设计
不同的数据库产品所提供的物理环境、存取方法和存储结构有很大差别,能供设计人员使用的设计变量、参数范围也很不相同,隐藏没有通用的物理设计方法可遵循,只能给出一般的设计内容和原则。数据库上运行的各种事务响应时间小、存储空间利用率高、事务吞吐率大,首先对要进行的事务进行详细分析,获得选择物理数据库设计所需要的参数;其次,要充分了解所用关系数据库管理系统的内部特征,特别是系统所提供的存取方法和存取结构。
以下是确定关系的存取方法的依据:
1. 对于数据库查询事务,需要得到:查询的关系,查询条件所涉及的属性,连接条件所涉及的属性,查询的投影属性。
2. 对于数据更新事务,需要得到:被更新的关系,每个关系上的更新操作条件所涉及的属性,修改操作要改变的属性值。
3. 除此之外,还需要制定每个事务在各关系上运行的频率和性能要求。
所谓选择索引存取方法,实际上就是根据应用要求确定对关系的那些属性列建立索引、哪些属性列建立组合索引、哪些索引要设计唯一索引。
1)如果一个(或一组)属性经常在查询条件中出现,则考虑在这个(或这组)属性上建立索引(或组合索引)。
2)如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑在这个属性上建立索引。
3)如果一个(或一组)属性经常在连接操作的连接条件中出现,则考虑在这个(或这组)属性上建立索引。
而确定数据库存储结构时要综合考虑存取时间、存储空间利用率和维护代价三方面的因素.这三个方面常常是相互矛盾的,例如消除一切冗余数据虽然能够节约存储空间,但往往会导致检索代价的增加,因此必须进行权衡,选择一个折中方案
在宾馆客房管理系统中,由于用户编号,客房号,物品号必须不重复,且经常出现在连接查询和操作中出现,因此可通过用户编号,客房号,物品号分别创建唯一性索引,提高查询速度。
3.4 数据库实现
3.4.1 建表,并输入相关数据
(1)创建一个数据库,数据库名为Hotel
create database Hotel
(2)创建一个用户类别表,并输入相关的类别名称,折扣,需交押金
DROP TABLE IF EXISTS `usertype`;CREATE TABLE `usertype` ( `type` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `deposit` int(5) NULL DEFAULT NULL, `discount` decimal(4, 2) NULL DEFAULT NULL, PRIMARY KEY (`type`) USING BTREE);INSERT INTO `usertype` VALUES ('普通用户', 200, 0.95);INSERT INTO `usertype` VALUES ('白金会员', 100, 0.80);INSERT INTO `usertype` VALUES ('黑金会员', 50, 0.75);
(3)创建用户表,并输入相关用户编号,姓名,性别,身份证号,电话,类型名称。
(4)创建前台表,并输入相关员工编号,姓名,职称,电话
(5)创建客房表,输入有关客房号,客房类型,客房状态,单价,员工编号
(6)创建物品表,输入相关物品编号,物品名称,单价,物品数量,用户编号,员工编号。
(7)创建住宿表,输入相关用户编号,房间号,入住时间,退房时间
3.4.2 触发器建立
(1)宾馆入住办理时,未满18周岁的人不能办理房间,建立名为fun的触发器,通过身份证号的出生年月与当前时间做比较,判断是否满18周岁。
drop TRIGGER if EXISTS fun;create TRIGGER fun BEFORE INSERT on user for EACH ROWbeginDECLARE id varchar(18);DECLARE birth varchar(10);set id=new.idnumber;set birth=STR_TO_DATE(substring(id,7,8),'%Y%m%d');if DATE_ADD(birth,INTERVAL 18 year)>CURRENT_DATE() THEN SIGNAL SQLSTATE 'HY000' set message_text='年龄不能小于18岁';end if;end;
(2)用户办理退房时,输入退房日期,将各个费用和信息存储在相应变量中,同时让该房间的状态变为空。
drop TRIGGER if EXISTS fun2;create trigger fun2 AFTER UPDATE on living for each ROWBEGINDECLARE r int(4);DECLARE worker int(4);set r=old.roomId;-- 房间单价set @price=(select price from room where roomId=r);-- 房间单价*居住天数set @daytime=DATEDIFF(new.lefttime,old.staytime);set @roomprice=@price*@daytime;set worker=(select workId from room where roomId=r);-- 同时让该房间状态变为空update room set state='空' where roomId=r;set @id=old.userId;-- 同时结算物品费用update items set workId=worker where userId=@id;set @itemprice=(select sum(price*count) from items where userId=@id);-- 如果物品费用为null,将其置为0if @itemprice is null then set @itemprice=0;end if;-- 获取折扣set @discount=(select discount from usertype where type=(select type from user where userId=@id));insert into result(price,daytime,roomprice,itemprice,discount,allprice) values(@price,@daytime,@roomprice,@itemprice,@discount,(@roomprice+@itemprice)*@discount);end;
(3)当删除用户信息时,对应住宿表和物品表有关该用户的记录同时删除
drop trigger if EXISTS fun1;create TRIGGER fun1 before DELETE on user for EACH ROWBEGINDECLARE id int(4);set id=old.userId;set @room=(select roomId from living where userid=id);DELETE from living where userId=id;DELETE from items where userId=id;UPDATE room set state='空' where roomId=@room;end;DELETE from user where userid=8;select * from user;
3.4.3 存储过程建立
(1)调用存储过程a,接收参数“姓名”,可获得当前客户截至目前的总费用,
源码就不粘贴出来了
3.5数据库运行与维护
3.5.1备份与还原的原则
备份类型的选择和还原模式的确定都应遵循这样的原则:尽最大可能、以最快速度减少或消灭数据丢失。
3.5.2 注意事项
(1)如果只进行数据库备份,那么将无法还原自最近一次数据库备份以来数据库中所发生的所有事务。
(2)如果进行数据库备份时也进行事务日志备份,那么可以将数据库还原到失败点。那些在失败之前为提交的事务将无法还原,但如果您在数据库失败后立即对当前处于活动状态的事务进行备份,则为提交的事务也可以还原。
3.5.3 数据库的备份计划
(1)有规律地进行数据库备份,例如每晚进行备份。
(2)以较小的时间进行差异备份,比如每隔3小时或4小时。
(3)在相邻的两次差异备份之间进行事务日志备份,可以每20分钟或30分备份一次
3.5.4 数据库的还原计划
如果采用上述的备份方案,在进行还原的时候,我们可以先还原最近一次的数据库备份,接着进行差异备份的还原,最后进行事务日志备份的还原。
但是,在更多情况下我们希望还原到数据库失败的那一刻,此时我们只需按照下面的方法就可以达到目的了
(1)如果能访问数据库的事务日志文件,则应备份当前正处于活动状态的事务日志;
(2)还原最近一次数据库备份;
(3)还原最近一次差异备份;
(4)按顺序还原自差异备份以来进行的事务日志备份
备份数据库中所有的表:
C:\>mysqldump -u root -p123456 hotel>d:\hotel.sql
将备份文件恢复到数据库中:
mysql > use db
mysql > source d:\hotel.sql
4.系统功能实现
前面的较为简单,就不粘贴代码了
(1)查询指定用户
(2)修改指定的房间信息
(3)查询哪种类型房间居住的人最多
(4)查询空房间的数量
(5)查询名为“王惠”用户居住的客房信息
(6)查询用户编号为1的物品使用情况
(7)查询用户名为“王民”截至目前所需费用
(8)查询用户名为“周慧”所用物品是谁结算的
(9)若宾馆房间住满,一天的最大收入为多少
(10)查询以客房类型分组,求各个类型的平均价格
(11)当客户需要一间1人房和2人房时,在目前空房间下,有多少种选择,一一列出,按总价升序排列
drop procedure if EXISTS plan;create PROCEDURE plan()BEGINdeclare tmpName varchar(20) default '' ;DECLARE v_roomid int;DECLARE v_size varchar(2);DECLARE v_price DECIMAL(5,2);DECLARE m_roomid int;DECLARE m_size varchar(2);declare m_price decimal(5,2);DECLARE i int;DECLARE j int;DECLARE onecursor CURSOR for SELECT roomId,size,price from room where state='空' and (size+0)=1;DECLARE twocursor CURSOR for select roomId,size,price from room where state='空' and (size+0)=2;-- 一定要加这条语句declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname= null;set j=1;create table result(`房间一`int,`类型一` varchar(2),`价格一` decimal(5,2),`房间二` int,`类型二` varchar(2),`价格二` decimal(5,2),`总价` decimal(5,2));set @c=(select count(*) from room where state='空' and (size+0)=2);set @d=(select count(*) from room where state='空' and (size+0)=1);open onecursor;open twocursor;while j<=@d do FETCH onecursor into v_roomid,v_size,v_price; set i=1; while i<=@c DO FETCH twocursor into m_roomid,m_size,m_price;Insert into result VALUES(m_roomid,m_size,m_price,v_roomid,v_size,v_price,v_price+m_price); set i=i+1; end while; set j=j+1;end while;close onecursor;close twocursor;end;call plan();select * from result ORDER BY `总价`;drop table if EXISTS result;
5 数据库操作界面
1.前台登录界面,管理员通过相应编号和密码可以登录系统
2.查询客户信息界面,可以通过关键字搜索用户
3.查询房间信息界面,将空房间和已入住的房间分开排列,也可以通过房间号快速搜索。
4.办理入住界面,输入客户姓名,性别,身份证号,电话,房间,客户类型,入住时间。
5.退房结算界面,输入客户姓名,房间号,退房日期,系统首先匹配客户姓名与办理房间的客户姓名是否一致,一致则办理退房手续,自动列出账单。
6 结束语
通过此次数据库的课程设计,我们真正达到了学与用的结合,增强了对数据库方面应用的理解,对自己今后参与开发数据库系统积累了不少经验,在实验过程中,从建立数据开始,对数据库设计理念及思想上有更高的认识,从需求分析,到概念设计和逻辑设计,E-R 图的表示,懂得了不少有关数据库开发过程中的知识,增强了自己在数据库中应用SQL 语言的灵活性,其中包括,插入、删除、 修改、查询,牵涉表和表之间的联系,主建与外主键的定义,约束项的设置,使逻辑更严密,在学习过程中,我也上网查了不少资料,也看了一些别人设计的旅馆管理信息系统的设计报告,学以致用,自我创新,独立完成了这份自己的报告,从中在学到用,从用又到学,不断修改,系统更新。虽然不能达到完善系统,但也做到了尽善尽美,加强理论学习对完善系统会有很多帮助。
限于我们的技术水平有限这次的课程设计论文和编程软件的错误和不当之处在所难免,还请老师多多指教!在这次的课程设计中时间紧迫但我们学会了很多,也感到自身知识的贫乏,希望在日后的努力学习中把它做成更完善的系统,并能做其他完善的系统,发现其中的乐趣。这次实际操作必将成为我们人生旅途上一个非常美好的回忆!
参考文献
[1]张丽,黄国青.X宾馆客房管理系统的分析与设计[J].企业改革与管理,2015(22):30.DOI:10.13768/j.cnki.cn11-3793/f.2015.5592.
[2]李海燕.浅析宾馆客房管理系统的开发与应用[J].民营科技,2015(08):61.
[3]吴琼. 酒店宾馆客房管理系统的设计与实现[D].辽宁科技大学,2014.
[4]唐好魁. 数据库技术及应用.3版.北京:电子工业出版社,2015.
[5]杨海霞. 数据库原理与设计.2版.北京:人民邮电出版社,2015.