资源描述
《数据库技术》课程设计
课题 KTV管理系统
班级 08电子商务B
学号
姓名 张婷婷
2023年 7月 1日—2023 年 7 月 8 日
目录
1.需求分析: 3
1.1现实需求分析 3
1.2系统需求分析 3
1.3数据库需求分析 3
1.4 系统功能模块分析 4
1.5据字典 5
2数据库概念设计 6
2.1局部概念模式设计 6
2.2全局概念模式设计 10
3.数据库逻辑设计 11
3.1数据模型的映射 11
3.2数据库结构优化和完整性设计 12
3.3数据库的逻辑结构设计 13
4.数据库物理设计 17
4.1:建库 17
4.2建表 18
4.3 将数据插入表中 21
4.4建立视图 23
4.5数据库索引的建立 23
5.数据的实行与维护 24
5.1查询 24
5.2 触发器 25
5.3 存储过程 28
1.需求分析:
1.1现实需求分析
随着社会的发展和人民生活水平的提高,人们对精神文化生活的需求也在不断的增长。KTV的出现和发展满足了人们这种需求。各行业的发展和计算机系统的结合越来越紧密,很多歌厅借助现代高科技的所带来的优质的服务,大大提高服务的档次,提高了公司的管理水平,提高了竞争力达成管理的系统化,规范化。
1.2系统需求分析
KTV管理信息系统重要是完毕对歌厅的管理(涉及预定,开房,结账,维修,打扫)和各种相关信息的管理的录入和查询。
用户登入系统,输入用户名和密码,系统从数据库的用户信息表进行核对,完全一致这进入系统。房间或会员信息的增长时,系统会把这些信息写入到数据库中的房间和会员信息表中。若客人取消预定,则在预定单表中删除这些信息。当结账时,通过房间编号从房间消费表中读取消费信息。结账后,就把此行信息删除,写入到结账表中。假如是会员,消费的信息会写入到会员信息表中,消费的次数和消费的金额都将累加,假如消费金额达成一定的限度,这签单的金额度将发生变化。
1.3数据库需求分析
本系统是为一般歌厅设计的KTV管理系统,程序规定能录入一些基本的资料,需要对房间完毕对房间的预定,开房,结账等基本信息操作,并可以对这些信息进行记录,根据以上的需求,数据库的设计,必需满足一下几点:
l 记录房间的基本信息:房间号,房间名称,房间类型,房间的价格,房间状态
l 记录会员的基本信息:会员编号,会员姓名,固定电话,手机,地址,签单的额度,消费次数,消费积分,备注。
l 记录预订单信息:涉及预订单编号,客户名称,房间编号,房间类型,房间价格,客户地电话,人数,开房日期,开房时间,操作员,预付金额,会员编号,预定日期,备注。
l 记录房间消费信息:开房单编号,房间编号,房间类型,房间价格,人数,客户名称,客户电话,开房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员编号,备注
l 记录账单信息:账单编号,房间编号,房间类型,房间价格,客户名称,开房时间,关房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员的编号
l 记录维修单信息:维修单编号,房间编号,维修因素,维修结果
l 记录维修单历史:维修单编号,房间编号,维修因素,维修结果
l 记录用户信息,涉及用户ID,用户名,用户密码,用户权限代码,用户类型
1.4 系统功能模块分析
1.根据以上的需求分析,KTV的功能模块如下:
KTV管理系统
基本信息
基本业务
查询记录
系统设立
退出系统
房间信息
会员信息
预定
开房
结账
维修
打扫
房间管理
信息
预订单
开房单
维修单
账单查询
房间查询
状态
类型
会员查询
用户设立
密码设立
用户查询
图一系统功能模块图
1. 功能模块说明:
l 基本信息模块:用于记录房间几会员的基本信息
l 基本业务模块:重要解决房间的预定,开房,结账以及维修等项目。
l 查询记录模块:重要用于对房间基本信息,会员基本信息的查询
l 系统设立模块:重要是 通用户设立,密码的设立,来加强对用户的管理,并且提高系统的安全性。
l 退出系统
1.5据字典
数据字典重要是对数据结构(数据元素)、数据存储和数据解决进行更具体的相应。
1. 房间基本信息
含义说明:KTV房间的基本信息(原始资料)
组成:房间号,房间名称,房间类型,房间的价格,房间状态
2. 会员基本信息:
含义说明:KTV的顾客可通过办理睬员卡成为KTV的会员,会员可以享受一些打折,积分换金钱优惠,会员基本信息表记录了所有会员的信息(是原始数据)。
组成:会员编号,会员姓名,固定电话,手机,地址,签单的额度,消费次数,消费积分,备注
3. 房间消费信息:
含义说明:记录当某个房间被预定或使用后发生的所有消费(结账时需要用到这些数据)
组成:订单编号,客户名称,房间编号,房间类型,房间价格,客户地电话,人数,开房日期,开房时间,操作员,预付金额,会员编号,预定日期,备注
4. 预定单信息
含义说明:某些客户为了防止到期没房可以住,所以向KTV预定房间,预定需要交纳一定的定金,并且产生了预订单,依次作为预定的凭证,事后无论哪一方违约,可以此为证据。
组成:账单编号,房间编号,房间类型,房间价格,客户名称,开房时间,关房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员的编号
5. 账单信息:
含义:用于记录消费时的账单的基本信息
组成:编号,房间编号,房间类型,房间价格,人数,客户名称,客户电话,开房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员编号,备注
6. 维修单信息
含义说明:随着时间的推移或者使用不妥,房间里的设备等会被损坏,因此要对这些房间进行维修,维修单记录了维修中的基本元素
组成:维修单编号,房间编号,维修因素,维修结果
7. 维修历史
含义:间不一定只修过一次,,维修历史表将维修从时间的角度进行管理
组成:维修单编号,房间编号,维修因素,维修结果
8. 用户信息
含义:用于存储用户登录系统的基本信息
组成:用户ID,用户名,用户密码,用户权限代码,用户类型
2数据库概念设计
2.1局部概念模式设计
本系统的数据库所涉及到的实体有房间实体,会员实体,预单实体,开房单实体,账单实体,维修单实体,维修单历史实体,用户实体,下面为各实体的E-R图
1.房间实体E-R图,属性涉及
房间号,房间名称,房间类型,房间的价格,房间状态
房间
编号
名称
类型
价格
状态
房间实体E-R图
2.会员实体ER
会员编号,会员姓名,固定电话,手机,地址,签单的额度,消费次数,消费积分,备注
编号
名称
时间
日期
…………
会员
会员实体E_R图
3.预订单实体E-R
账单编号,房间编号,房间类型,房间价格,客户名称,开房时间,关房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员的编号
预订单实体
编号
名称
日期
会员编号
……
预订单实体ER图
4. 开房实体E-R
编号,房间编号,房间类型,房间价格,人数,客户名称,客户电话,开房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员编号,备注
开房单实体
编号
开房时间
客户名称
会员编号
……
开房实体E-R图
5账单信息实体E-R图:
编号,房间编号,房间类型,房间价格,人数,客户名称,客户电话,开房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员编号,备注
编号
房间编号
备注
……
账单信息实体
账单信息实体E-R图
6. 维修单信息
维修单编号,房间编号,维修因素,维修结果
维修单实体
维修单编号
房间编号
维修缘由
维修单实体E-R图
7. 维修历史E-R图
维修单编号,房间编号,维修因素,维修结果
维修单实体
编号
房间编号
维修结果
维修缘由
维修单历史实体E-R图
5. 用户信息E-R图
用户ID,用户名,用户密码,用户权限代码,用户类型
用户实体
编号
姓名
密码
权限
类型
用户实体E-R图
2.2全局概念模式设计
会员
开房
预定
消费
房间
开房
账单
设立
维修
查看
用户
各实体之间关系E-R图
在SQL数据中,各表的关系如下:
3.数据库逻辑设计
3.1数据模型的映射
1.数据实体的映射:
房间信息(房间号,房间名称,房间类型,房间的价格,房间状态)
会员信息(会员编号,会员姓名,固定电话,手机,地址,签单的额度,消费次数,消费积分,备注)
预订单信息(预订单编号,客户名称,房间编号,房间类型,房间价格,客户地电话,人数,开房日期,开房时间,操作员,预付金额,会员编号,预定日期,备注)
房间消费信息(开房单编号,房间编号,房间类型,房间价格,人数,客户名称,客户电话,开房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员编号,备注)
账单信息(账单编号,房间编号,房间类型,房间价格,客户名称,开房时间,关房时间,预付金额,付款方式,折扣,消费金额,开房日期,会员的编号)
维修单信息(维修单编号,房间编号,维修因素)
维修单历史(维修单编号,房间编号,维修因素,维修结果)
用户登录信息(用户ID,用户名,用户密码,用户权限代码,用户类型)
3.2数据库结构优化和完整性设计
1.建立表之间的联系,如图
2.建立存储过程ExistByID,查看某个表中是否存在某个整形字段等于某个值的记录
use KTVDB
GO
/*查看某个数据表中,是否存在某个字段等于某个值的记录*/
create Proc dbo.ExistByID
(
@strTableName varchar(225),
@strFiledName varchar(225),
@intFieldValue int,
@bitResult bit Output
)
as
set Nocount on
declare @strSQL varchar(3000)
declare @nCount int
/*构建存储符号条件的记录数的临时表 */
if Object_ID('DBO.#tmpTable') is null
create table #tmpTable(tepField int )
else
truncate table #tmpTable
/*在数据库表中检索符合条件的记录数,并且存储在临时表中*/
select @strSQL='select count(['+@strFiledName+']) from ['+@strTableName+']
e['+@strFiledName+']='+convert(varchar(50),@intFieldValue)
select @strSQL='insert #tmpTable '+@strSQL
exec(@strSQL)
/*在临时表中返回存储记录数*/
select top 1 @nCount =tmpField from #tmpTable order by tmpField
drop table #tmpTable
if @nCount>0
select @bitResult =1
else
select @bitResult =0
go
3.3数据库的逻辑结构设计
1数据库中的八个表的逻辑结构图,为
表4—1 用户登入信息表 UseInfo
字段名
字段说明
数据类型
字段长度
必填字段
主键
UserID
用户ID
char
2
是
是
Username
用户姓名
varchar
8
否
否
UserPwd
用户密码
varchar
10
是
否
UserType
用户权限代码
int
4
否
否
Remake
用户类型
varchar
8
否
否
表4-2 房间信息表 RoomInfo
字段名
字段说明
数据类型
字段长度
必填字段
主键
RoomID
房间编号
char
2
是
是
RoomName
房间名称
varchar
20
否
否
RoomTypeName
房间类型
varchar
10
否
否
RoomPrice
价格
float
8
是
否
RoomState
房间状态
char
6
否
否
表4-3会员信息表MemberInfo
字段名
字段说明
数据类型
字段长度
必填字段
主键
MemberID
会员编号
char
3
是
是
MemberName
会员姓名
varchar
8
否
否
Tel1
固定电话
varchar
20
否
否
Tel2
手机
varchar
20
否
否
Address
地址
varchar
30
否
否
SignCheck
签单额度
int
4
是
否
ConsumedTime
消费次数
int
4
是
否
ConsumedIntegral
消费积分
float
8
是
否
Remake
备注
varchar
50
否
否
表4-4 预订单信息表DestineInfo
字段名
字段说明
数据类型
字段长度
必填字段
主键
DestineID
预订单编号
char
4
是
是
ClientName
客户名称
varchar
10
否
否
RoomID
房间编号
char
2
是
否
RoomType
房间类型
varchar
8
否
否
RoomPrice
房间价格
float
8
否
否
ClientTel
客户电话
varchar
20
否
否
ClientCount
人数
int
4
否
否
OpenRoomDate
开房日期
datetime
8
是
否
OpenRoomTime
开房时间
datetime
8
是
否
Waitor
操作员
varchar
10
否
否
Prepry
预付金额
float
8
否
否
Remake
备注
varchar
50
否
否
DestineDate
预订日期
datetime
8
是
否
MemberID
会员编号
char
3
否
否
表4-5 房间消费信息表 RoomConsumed
字段名
字段说明
数据类型
字段长度
必填字段
主键
RoomConsumed
开房编号
char
4
是
是
RoomID
房间编号
char
10
是
否
RoomType
房间类型
varchar
2
否
否
RoomPrice
房间价格
float
8
否
否
ClientCount
人数
int
8
否
否
ClientName
客人姓名
varchar
20
否
否
OpenTime
开房时间
datetime
4
是
否
ClientTel
客户电话
varchar
8
否
否
Prepay
预付定金
float
8
否
否
Agio
折扣
int
10
否
否
PayMode
付款方式
varchar
8
否
否
OpenDate
开房日期
datetime
8
是
否
Remake
备注
datetime
50
是
否
MemberID
会员编号
varchar
3
否
否
表4-6结账单信息表 CheckInfo
字段名
字段说明
数据类型
字段长度
必填字段
主键
CheckID
结账单编号
char
4
是
是
RoomID
房间编号
char
2
是
否
RoomType
房间类型
varchar
10
否
否
RoomPrice
房间价格
float
8
否
否
ClientName
客人姓名
varchar
10
否
否
Agio
折扣
int
4
否
否
OpenRoomTime
开房时间
datetime
8
是
否
EndTime
结账时间
datetime
8
是
否
Prepay
预付定金
float
8
否
否
PayMode
付款方式
varchar
10
否
否
RoomMoney
消费金额
float
8
是
否
OpenDate
开房日期
datetime
8
是
否
MemberID
会员编号
varchar
3
否
否
表4-7维修单信息表 RepairInfo
字段名
字段说明
数据类型
字段长度
必填字段
主键
RepairID
维修编号
char
3
是
是
RoomID
房间编号
char
2
是
否
Remakr
维修缘由
varchar
50
否
否
表4- 8 维修单历史表 RepairHistory
字段名
字段说明
数据类型
字段长度
必填字段
主键
RepairHisID
维修编号
char
3
是
是
RoomID
房间编号
char
2
是
否
Remakr
维修缘由
varchar
50
否
否
RemakrAfter
维修结果
varchar
50
否
否
4.数据库物理设计
物理设计的目的不仅要保证存储数据的适当结构,并且要以适当的方式对性能提供保证。数据库物理设计重要涉及以下两方面的工作:
l 数据库的数据文献的分布结构。
l 拟定索引的结果。
4.1:建库
IF exists(select * from sysdatabases where name ='KTVDB')
drop database KTVDB
create database KTVDB
on
(name='KTVDB_dat',
filename ='D:\KTVDB\KTVDB.MDF',
SIZE=5MB,
maxsize=20MB,
filegrowth =2MB)
LOG ON
(name ='KTVDB_log',
filename ='D:\KTVDB\KTVDB.ldf',
size=2MB,
filegrowth=15%)
4.2建表
1. 用户登录
use KTVDB
GO
create table UseInfo
(
UserID char(2) primary key not null,
Usename varchar(10),
UsePwd varchar(10) not null,
UseType int,
Remake varchar(10))
2.房间信息
create table RoomInfo
(
RoomID char(2) primary key not null,
Roomname varchar(20),
RoomTypeName varchar(10),
RoomPrice Float not null,
RoomState char(6))
3会员信息
create table MemberInfo
(
MemberID char(3) primary key not null,
MemberName varchar(8),
Tel1 varchar(20),
Tel2 varchar(20),
Address varchar(30),
SignCheck int not null,
ConsumedTime int not null,
ConsumeIntegral float not null,
Remake varchar(50))
4预订单信息
create table DestineInfo
(
DestineID char(4) primary key not null,
ClientName varchar(10),
RoomID char(2) not null,
RoomType varchar(8),
RoomPrice Float,
ClientTel varchar(20),
ClientCount int,
OpenRoomDate datetime not null,
OpenRoomTime datetime not null,
Waitor varchar(10),
Prepay float,
Remake varchar(50),
DestineDate datetime,
MemberID char(3))
5房间消费信息
create table RoomConsumed
(
RoomConsumedID char(4) primary key not null,
RoomID char(2) not null,
RoomType varchar(10),
RoomPrice Float ,
ClientCount int,
ClientName varchar(8),
OpenTime datetime not null,
ClientTel varchar(20),
Prepay float,
Agio int,
PayMode Varchar(8),
OpenDate datetime not null,
Remake varchar(50),
MemberID char(3))
6账单信息
create table CheckInfo
(
CheckID char(10)primary key not null,
RoomID char(2) not null,
RoomType varchar(10),
RoomPrice Float ,
ClientName varchar(10),
Agio int,
OpenRoomTime datetime not null,
EndTime datetime not null,
Prepay float,
PayMode Varchar(8),
RoomMoney float not null,
OpenDate datetime not null,
MemberID char(3))
7维修单信息
create table RepairInfo
(
RepairID char(3)primary key not null,
RoomID char(2) not null,
Remake varchar(50))
8维修单历史
create table RepairHistory
(
RepairHisID char(3)primary key not null,
RoomID char(2) not null,
Remake varchar(50),
RemakeAfter varchar(50))
4.3 将数据插入表中
图4-1 UserInfo
图4-2 RoomInfo
图4-3 MemberInfo
图4-4 DestineID
图4-5RoomConsumed
图4-6 CheckInfo
图4-7RepairInfo
图4-8RepairHistory
4.4建立视图
发明视图的好处是,可以在别的视图或者用户自定义函数中,按照各种不同条件过滤该视图的检索数据而不要各自内在构造复杂的检索条件并在相应的表中检索数据。
为用户登录表创建视图
4.5数据库索引的建立
索引可加快查询的,还可以对数据进行唯一的标记
现在为个张表的主键建立索引
为UseID ,RoomID,MemberID,DestineID, RoomConsumedID CheckID RepairID RepairHisID 创建索引
use KTVDB
GO
create index index_UserID on UseInfo(UserID )
create index index_RoomID on RoomInfo(RoomID )
create index index_MemberID on MemberInfo (MemberID )
create index index_DestineID on DestineInfo (DestineID )
create index index_RoomConsumedID on RoomConsumed(RoomConsumedID )
create index index_CheckID on CheckInfo(CheckID )
create index index_RepairID on RepairInfo(RepairID )
create index index_RepairHisID on RepairHistory(RepairHisID )
5.数据的实行与维护
5.1查询
1)嵌套查询
查询房间信息表中,房间状态为空并且不在维修单信息表中的房间的所有信息,同时显示“这些房间可以正常营业”
use KTVDB
GO
if exists
(select * from RoomInfo
where RoomID not in (select RoomID from RepairInfo ) and RoomState='空')
begin
print '这些房间可以正常营业'
end
2)变量查询
查找积分比小文多的会员的所有信息
此代码中用到变量,变量有很大的灵活性,可以通过直接改变赋值来进行各种不同的查询
5.2 触发器
1)结账的时间一般有结账时系统直接给出,不能修改。假如修改了,则会给出警告,并且修改失败。
use KTVDB
GO
create trigger 结账时间修改
on CheckInfo
for update
as
if update(EndTime)
begin
print'结账失败!!'
raiserror('安全警告:结账日期不能修改,结账时由系统直接给出',16,1)
rollback transaction
end
go
现在修改EndTime中的数据,系统将给出如下警告
2)创建一个触发器,查询会员信息,假如消费积分超过10000分,则签单额度可以增长2023元。
use KTVDB
GO
create trigger 签单额度增长
on MemberInfo
for update
as
if exists (select * from MemberInfo where ConsumeIntegral>'10000')
begin
update MemberInfo
set SignCheck=SignCheck+2023
end
例如会员小超,本来的签单额度为
修改后的签单额度为:
3)更新住房信息时,同时也会更新会员表的金额和消费的次数
create trigger RoomConsumed_insert
on dbo.RoomConsumed
for insert
as
update M
set M.ConsumedTime=(M.ConsumedTime+1),M.SignCheck=(M.SignCheck+RC.RoomPrice )
from MemberInfo as M inner join RoomConsumed as RC
ON M.MemberID=RC.MemberID
向表中插入数据
对比修改前后的MemberInfo
修改前的表
修改后的表
4)假如某个房间有人住,则房间的状态为使用中
use KTVDB
GO
/*假如某个房间有人住时,则房间状态为使用中,假如无人住,则为空房*/
create trigger RoomState_update1
on dbo.RoomConsumed
for update
as
if exists(select ClientName from RoomConsumed)
begin
update RoomInfo
set RoomState='使用中'
from RoomInfo
where RoomID in (select RoomID from RoomConsumed )
end
向RoomConsumed 表中插入信息
再查看RoomID表
修改前
修改后
5.3 存储过程
1)验证用户名和密码,并输出验证结果,用户编号,真实姓名,用户类型
use KTVDB
GO
/*验证用户名和密码,并输出验证结果,用户编号,真实姓名,用户类型*/
create proc dbo.IsValidUser
(
@Usename varchar(10),
@UsePwd varchar(10) ,
@UserID int output,
@UseType bit output,
/*输出值(VB组建自定义的枚举数),为合法用户,为用户名错,为密码错*/
@ReturnValue int output
)
as
declare @RightPwd varchar(10)
select top 1 @RightPwd =UsePwd,@UserID=UserID,@UseType =UseType
from UseInfo where Usename=@Usename order by Usename
/*用户名不存在*/
if @RightPwd is null
begin
set @ReturnValue=2
return
end
/*用户名不在,则比较密码*/
if @RightPwd <>@UsePwd
begin
set @ReturnValue=3
return
end
2)建立存储过程计算结账时的金额
use KTVDB
GO
create ProCedure up_check
@cOpenTime datetime,
@cCloseTime datetime,
@cRoomID CHAR(4),
@cPrice float,
@cAgio int,
@cPrepay int,
@Money float output
as
select @cPrice =RoomPrice from RoomInfo where RoomID=@cRoomID
select @cOpenTime =OpenTime from RoomConsumed where RoomID=@cRoomID
select @cPrepay= Prepay from RoomConsumed where RoomID=@cRoomID
select @cCloseTime =Getdate()
select @Money=(datediff(mi,@cOpenTime,@cCloseTime))
*@cPrice/60.0*@cAgio/100.0-@cPrepay
3)积分超过一万分的为“钻石级会员”,建立一个存储过程,找出这些会员,并输出这些会员的信息。并且将remark中的值改为“钻石级会员”
create proc 钻石会员
@cit float='10000',
@citsum int output
as
print '------------------------------'
print'本KTV的钻石级会员为'
select * from MemberInfo
where ConsumeIntegral>@cit
select @citsum=count(MemberID)
from MemberInfo
where ConsumeIntegral>@cit
update MemberInfo
set Remake='钻石级会员'
where ConsumeIntegral>@cit
declare @citsum int
exec 钻石会员'1000',@citsum output
select @citsum
update MemberInfo
set Remake='钻石级会员'
where ConsumeIntegral>10000
4)建立带游标的存储过程,将维修单信息表中的备注添加到维修单历史表中的“备注”字段
create proc 维修历史单添加
as
declare @RoomID char(2),@Remark varchar(50)
declare cursor_添加cursor
for
select RoomID,Remake from RepairHistory
where Remake is null and RoomID is not null
open cursor_添加
fetch next from cursor_添加into @RoomID,@Remark
while @@fetch_status=0
begin
select @Remark=Remake from RepairInfo where RoomID=@RoomID
update RepairHistory
set Remake=@Remark where RoomID=@RoomID
if exists(select RoomID,Remake from RepairHistory
where Remake is null and RoomID is not null )
continue
else
break
end
exec 维修历史单添加
select * from RepairHistory
修改前后比较
展开阅读全文