关闭

关闭

关闭

封号提示

内容

首页 旅馆管理系统数据库设计.doc

旅馆管理系统数据库设计.doc

旅馆管理系统数据库设计.doc

上传者: 吴浩的帝国 2010-12-18 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《旅馆管理系统数据库设计doc》,可适用于IT/计算机领域,主题内容包含数据库上机实验报告SQL实践作业:旅馆管理系统数据库设计与实现自动化学院自动化专业小组成员及所完成的工作:所完成的工作:数据库整体结构的设计ER图的符等。

数据库上机实验报告SQL实践作业:旅馆管理系统数据库设计与实现自动化学院自动化专业小组成员及所完成的工作:所完成的工作:数据库整体结构的设计ER图的绘制和其他工作的审核系统名称:旅馆管理系统一、系统需求背景:随着科技和经济的发展旅游业已经成为一个热门的产业并且传统的手工已不适应现代酒店管理的需要及时、准确、全方位的网络化信息管理成为必需。在酒店的管理及业务日益复杂、要求在不断提高的现状下利用高科技、现代化的电脑自动化管理系统来处理日益繁重的酒店业务对于大型的酒店是必须具备的管理方式。酒店客房管理系统是根据酒店对客房管理的实际情况进行编写的主要目的是为了方便酒店对客房的实际情况进行集中的查询与管理工作以提高整个酒店的工作。酒店客房管理的科学化、系统化、信息化成为各个酒店追求的目标。因此而要实现这些功能就要求各个酒店配备一套客房管理系统以便在酒店内实施良好的完善的管理且以最快地速度响应客户的需求及时为他们提供服务为他们提供一个高效、便捷的居住环境。旅店需求特点分析:通过对旅店的调研对于旅店的需求特点有了基本了解()基本要求:系统能够进行客户的信息的存储客户信息的删除客户信息的更新客户账单的结算……因此要求系统一定要严密准确不能出现插入和删除异常因此要求数据库系统的设计符合第四范式()高级要求:旅店面对的经常是一些突发的情况比如客户的提前退房客户要求换房客户要求其他的附加服务……这些突发事件是我们在我们的系统中需要着重考虑的旅客需求特点分析:通过对用户的调研我们发现用户希望住旅馆的手续能够尽量简单但是要求旅馆的各种信息准确出现错误的可能性尽量低旅店管理系统需求分析:​ 旅店的客房特点分析:()​ 通过每个房间唯一的房间号来区别(也就是我们数据库系统中的roomnum),房间分成不同的类型(roomtype)有‘A’、‘B’、‘C’三种类型它们对应的价格也会不同这个由顾客自己选择体现了我们设计系统的人性化()​ 房间的状态(roomstate)会根据是否有用户入住而不同如果该房间有人入住的话那么就将房间的状态标记为busy()​ 房间同时拥有‘IsBooked’状态如果房间被预定的话那么就将这个房间的状态标记为‘Booked’如果没有预定的话那么房间的状态为‘nobook’这样的话方便旅客‘入住’、‘换房’、‘续住’种种操作避免住进了已经有人预订的房间,同时有些房间即使已经有人预定了但是在预定旅客之前其他旅客还是可以住进来的只要他在预定旅客入住之前退房就可以了样大大提高了客房的利用率。()​ 考虑房间和顾客的关系房间和旅客关系是一对多的因为从现实出发房间分为‘单人房’、‘双人房’等旅客的收费是按照‘床位’来收费的但是不同房间的床位的价格是不同的但是在我们的数据库中默认所有的房间都是单人房这是我们设计的不足更理想的是在每种类型中分为‘单人房’、‘双人房’然后为每个床位设立状态每位顾客都是按照床位来收房而不是简单的按照房间来收费但是在现实生活中旅馆的类型又有很多种我们所设计的数据库可能只是适合其中的部分类型的旅馆。​ 旅客特点分析:从旅馆的角度来说最重要的就是准确地记录旅客在住宿期间一切信息并且要求准确()​ lodger表用来记录旅客的信息有lodgername,idnum,roomnum,echeckindate,expcheckoutdate,prepayment()​ lodger表用来记录当前正在发生‘入住’的旅客的信息这个表是动态的​ 如果旅客退房与之相关的表示checkout实体集将用户的信息载入这个表因为退房的信息是非常关键的因为旅店的账目的结算是要依靠这个表的然后他的信息就会从lodger这个表中删除​ 旅客可能要求‘换房’实现这个功能的是changeroom联系集这个联系集联系了lodger和Room两个表将原来的房间的状态修改为‘Free’,将新入住的房间修改为‘busy’​ 旅客可能要求续住我们当然会满足这个要求实现这个要求的要求是联系集conroom如果旅客续住那么在情况允许的情况下可以继续在原来的房间住宿并修改expcheckoutdate的信息如果原来的房间已经有人预定的话那么建议旅客更改房间重新登记‘lodger’信息​ 旅店的账目管理特点分析​ 旅店的账目管理系统是一个比较复杂的系统要求每天都要进行更新同时还须具备‘日结’、‘月结’、‘季度结’、‘年结’的功能与此相关的是checkout,DayAccount,MonthAccount,YearAccount他们最终依赖的表都是checkout表在我们的系统中checkout表用于记录退房用户的信息我们并没有设定主键只是设立了外依赖因为在这个表中不可能有两个完全相同的元组(lodgername,roomnum,curdate,(curyear,curmonth,curday),roomaccount,backchange),属性(lodgername,roomnum,curdate,)使任意两个元组都不可能相同因为curdate是精确到秒的在实际情况中具有相同lodgername,在同一时间内从同一个房间退房时不会发生地之所以不删除这个表的元组是因为我们想保留这些信息以便日后的查询比如核对账单比如发生刑事案件需要旅店配合时可能需要查询相关的信息……​ 日结DayAccount的实现也比较复杂首先我们定制一个作业‘InsetingDayAccount’每天::向DayAccount插入一个用于初始化的元组然后建立一个checkout与DayAccount之间的触发器如果向checkout中插入信息那么就将roomaccount累加到DayAccount中的dayaccount中去这样就能自动统计了每天的盈利状况​ MonthAccount和YearAccount的算法和DayAccount类似同样通过定制作业和建立触发器实现自动运算在这就不多介绍了二、系统概念模型(ER图)三、关系模式(逻辑模型)四、物理设计(表结构)Table:Room(EntitySet)Attribute:roomnum(房间号),roomtype(房间类型),roomprice(房间价格),roomstate(房间状态),IsBooked(预定状态)PrimaryKey:roomnumTable:Lodger(EntitySet)Attribute:lodgername(客户姓名),idnum(身份证号),roomnum(房间号),checkindate(入住时间),expcheckoutdate(预期退房时间),pepayment(客户预付款)PrimaryKey:lodgernum,idnumForeignKey:roomnumreferencesRoomTable:RoomPrebook(EntitySet)Attribute:reservename(预定客户姓名),roomnum(预定房间号),expcheckindate(预期入住时间),prepayment(预付款)PrimaryKey:reservenameForeignKey:roomnumreferencesRoomTable:DayAccount(EntitySet)Attribute:curyear(年),curmonth(月),curday(日),dayaccount(月结)PrimaryKey:curyear,curmonth,curdayTable:checkout(RelationSet)Attribute:lodgername(客户姓名),roomnum(房间号),curdate(日期),(curyear,curmonth,curday)(年月日),livedays(住宿天数),roomaccount(账单),backchange(找零)ForeignKey:lodgernamereferencesLodgerroomnumreferencesRoomTable:MonthAccount(EntitySet)Attribute:curyear(年),curmonth(月),monthaccount(日结)PrimaryKey:curyear,curmonthTable:YearAccount(EntitySet)Attribute:curyear(年),yearaccount(年结)PrimaryKey:curyearTable:Remind(EntitySet)Attribute:lodgername(客户姓名),roomnum(房间号),curdate(日期)PrimaryKey:lodgername,curdateForeignKey:lodgername五、系统实现功能模块设计:()​ 客房信息管理集合a)​ 查询房间的空闲状态b)​ 查询房间的预定状态c)​ 查询某种类型房间的价格d)​ 更新某种类型房间的价格e)​ 更新房间的空闲状态f)​ 更新房间的预定状态()​ 旅客信息管理集合a)​ 查询入住旅客的详细信息b)​ 查询已预订旅客的信息c)​ 查询已退房旅客的信息d)​ 取消预定操作e)​ 换房操作f)​ 续住操作g)​ 退房操作()​ 旅店账户管理集合a)​ 退房客户结算b)​ 每日结算c)​ 每月结算d)​ 每年结算()​ 服务管理项目集合a)​ 每日提醒那些旅客已经到退房的时候b)​ 每日提醒那些预定的客户将在今天住进来创建数据库的SQL语句CREATEDATABASEHotelON(NAME=N'Hotel',FILENAME=N'E:HotelHotelmdf',SIZE=MB,MAXSIZE=UNLIMITED,FILEGROWTH=MB)LOGON(NAME=N'Hotellog',FILENAME=N'E:HotelHotelldf',SIZE=MB,MAXSIZE=GB,FILEGROWTH=)GO说明:分别建立了mdf文件和ldf文件,规定mdf文件的初始大小为MB,增长速率为MB每次日志文件初始大小为MB增长速率为.创建表的SQL语句()创建room表存储客房信息CREATETableRoom(roomnumintnot,roomstatechar()not,roomtypechar()not,roompricechar()not,primarykey(roomnum))()创建Lodger表存储旅客信息CREATETableLodger(lodgernamechar()not,idnumbigintnot,roomnumintnot,checkindatedatetimenot,expcheckoutdatedatetimenot,prepaymentmoney,primarykey(lodgername),foreignkey(roomnum)referencesRoom,unique(roomnum))()创建RoompreBook表用于存储预定客户信息CREATETABLERoomPrebook(reservenamechar()not,roomnumintnot,expcheckindatedatetimenot,prepaymentmoney,primarykey(reservename),foreignkey(roomnum)referencesRoom)()创建日结表存储日结信息CREATETableDayAccount(curyearint,curmonthint,curdayint,dayaccountmoney,)()创建退房表存储退房旅客信息CREATETableCheckout(lodgernamechar()not,roomnumintnot,curdatedatetimedefaultGETDATE(),curyearint,curmonthint,curdayint,livedaysint,roomaccountmoney,backchangemoney,foreignkey(roomnum)referencesRoom)()创建MonthAccount表存储月结信息createTableMonthAccount(curyearintnot,curmonthintnot,Monthaccountmoney,foreignkey(curyear)referencesDayAccount)()创建YearAccount表用于存储年结信息createTableYearAccount(curyearintnot,yearaccountintnot,foreignkey(curyear)referencesDayAccount)()创建Remind表用于每日提醒createTableRemind(lodgernamechar()not,roomnumchar()not,curdatedatetimedefaultgetdate()foreignkey(lodgername)referencesLodger)存储过程展示:存储过程一:procqueryfreeroom代码:createprocprocqueryfreeroomasselectroomnum,roomtype,roomstatefromroomwhereroomstate='Free'功能:查询当前空闲的房间存储过程二:procquerybookedroom代码:createprocprocquerybookedroomasselectroomnum,roomtype,IsBookedfromroomwhereIsBooked='booked'功能:查询当前已经预定出去的房间存储过程三:procqueryprice代码:createprocprocquerypriceasselectdistinctroomtype,roompricefromroom功能:查询不同类型房间的价格存储过程四:procincprice代码:createprocprocincpriceroomtypechar(),newpricemoneyasupdateroomsetroomprice=newpricewhereroomtype=roomtype功能:更改某种类型房间的价格存储过程五:procQueryLodger代码:createprocedureprocQueryLodgercheckindatedatetimeasselectlodgername,idnum,expcheckoutdate,prepaymentfromlodgerwheredatepart(day,checkindate)=datepart(day,checkindate)功能:查询指定日期入住的旅客存储过程六:procquerybook代码:createprocprocquerybookasselectroomnum,reservename,expcheckindate,prepaymentfromRoomprebook功能:查询预订的旅客的信息存储过程七:procbookCancel代码:createprocedureprocbookCancelreservenamechar()asupdateroomsetIsBooked='nobook'whereroomnum=(selectroomnumfromRoomPreBookwherereservename=reservename)deletefromRoomPreBookwherereservename=reservename执行:执行后的roomprebook表存储过程八:procchangeroom代码:createprocprocchangeroomlodgernamechar(),sourceroomnumint,targetroomnumintasiflodgernamein(selectlodgernamefromlodger)andtargetroomnumin(selectroomnumfromroomwhereroomstate='Free')beginupdateroomsetroomstate='Free'whereroomnum=sourceroomnumupdateroomsetroomstate='Busy'whereroomnum=targetroomnumupdatelodgersetroomnum=targetroomnumwherelodgername=lodgernameend存储过程九:proccontlodge代码:createprocproccontlodgelodgernamechar(),expcheckoutdatedatetimeAsupdateLodgersetexpcheckoutdate=expcheckoutdatewherelodgername=lodgernameupdateroomsetroomstate='Busy'whereroomnum=(selectroomnumfromlodgerwherelodgername=lodgername存储过程十:proccheckoutlodger代码:createprocedureproccheckoutlodgernamechar()asdeclareroomnumintinsertcheckout(lodgername,roomnum,curdate,curyear,curmonth,curday,livedays,roomaccount,backchange)selectllodgername,lroomnum,getdate(),year(getdate()),month(getdate()),day(getdate()),DATEDIFF(day,checkindate,getdate()),DATEDIFF(day,checkindate,getdate())*rroomprice,lprepaymentDATEDIFF(day,checkindate,getdate())*rroompricefromlodgerasl,roomasrwherellodgername=nameandlroomnum=rroomnum功能:退房并将旅客信息插进checkout表中存储过程十一:procdayaccountcheckout代码:createprocedureprocdayaccountcheckoutcuryearint,curmonthint,curdayintasinsertDayAccount(curyear,curmonth,curday,dayaccount)selectcuryear,curmonth,curday,sum(roomaccount)fromcheckoutwherecuryear=curyearandcurmonth=curmonthandcurday=curdaygroupbycuryear,curmonth,curday功能:对checkout表中某一天的所有盈利进行累加并将结果存入dayaccount中存储过程十二:procdayaccount代码:createprocedureprocQueryDayAccountyearint,monthint,dayintasselectcuryear,curmonth,curday,dayaccountfromDayAccountwherecuryear=yearandcurmonth=monthandcurday=day存储过程十三:procquerymonthaccount代码:createprocprocquerymonthaccountyearint,monthintasselectcuryear,curmonth,monthaccountfromMonthAccountwherecuryear=yearandcurmonth=month功能:查询月账单存储过程十四:procqueryYearAccount代码:createprocprocqueryYearAccountyearintasselectcuryear,yearaccountfromYearAccountwherecuryear=year功能:查询年盈利情况存储过程十五:procremind代码:createPROCprocremindasINSERTINTORemind(lodgername,roomnum)SELECTlodgername,roomnumFROMlodgerWHEREdatepart(day,expcheckoutdate)=datepart(day,getdate())功能:将住宿在当天要到期的旅客的姓名和其他相关信息放入每日提醒中以便对旅客进行提醒存储过程十六:procroomremind代码:createprocprocroomremindasupdateroomsetroomstate='Free'whereroomnumin(selectroomnumfromremindwheredatepart(day,curdate)=datepart(day,getdate()))功能:将到期旅客所住房间的状态标记为‘free’那么这间房在当天的下午就可以被租出去了这样的功能提高了房间的利用率执行前:存储过程十七:procdiscount代码:createprocprocdiscountlodgernamechar(),discountnumericasupdatecheckoutsetroomaccount=roomaccount*discountwherelodgername=lodgername功能:为某些符合条件的旅客进行打折存储过程十八:InitRoom代码:createprocInitRoomasupdateroomsetroomstate='free'whereroomnumnotin(selectroomnumfromlodger)updateroomsetroomstate='busy'whereroomnumin(selectroomnumfromlodger)updateroomsetroomtype='C'whereroomtype=''updateroomsetroomtype='B'whereroomtype=''updateroomsetroomtype='A'whereroomtype=''功能:规范化room存储过程十九:proccountfreeroom代码:createprocproccountfreeroomasselectroomtype,count(roomnum)fromroomwhereroomstate='Free'groupbyroomtype功能:统计目前空房数按照房间类型来区分存储过程二十:proccheckoutmonth代码:createprocproccheckoutmonthyearint,monthintasselectlodgername,curyear,curmonthfromcheckoutwherecuryear=yearandcurmonth=month功能:统计某月客户的退房情况触发器实践Tigger:triggerroomlodger代码:createtriggertriggerroomlodgeronlodgerforinsertasbegindeclareroomnumbigintselectroomnum=insertedroomnumfrominsertedupdateroomsetroomstate='Busy'whereroomnum=roomnumend功能:当向lodger中插入新的数据时(即有新旅客住进来)那么将相应的房间的状态修改为busy。说明在向lodger中插入后在触发器的作用下room的状态发生了改变。Trigger:triggerroomroomprebook代码:createtriggertriggerroomroomprebookonroomprebookforinsertasdeclareroomnumbigintselectroomnum=insertedroomnumfrominsertedbeginupdateroomsetIsBooked='Booked'whereroomnum=roomnumend功能说明:如果向roomprebook中插入订房旅客的信息那么相关的房间的IsBooked状态将会被标记为bookedTrigger:triggercheckoutoncheckoutcreatetriggertriggercheckoutoncheckoutforinsertasbegindeclareroomnumberintdeclareroomnumintdeclarelodgernamechar()修改room状态selectroomnumber=iroomnumfromcheckoutasc,insertedasiwhereilodgername=clodgernameupdateroomsetroomstate='Free'whereroomnum=roomnumber修改lodger状态selectroomnum=croomnum,lodgername=clodgernamefromcheckoutasc,insertedasiwhereclodgername=ilodgernameandcroomnum=iroomnumdeletefromlodgerwherelodgername=lodgernameandroomnum=roomnumend功能:如果checkout表有数据插入触发下列两项动作:()​ 将旅客所住房间在room中的roomstate标记为‘Free’()​ 将该旅客信息从lodger中删除Trigger:tiggerdayaccountcheckout代码:Createtriggertiggerdayaccountcheckoutoncheckoutforinsertasbegindeclareroomaccountmoneyselectroomaccount=roomaccountfrominsertedupdateDayAccountsetdayaccount=dayaccountroomaccountwherecuryear=year(getdate())andcurmonth=month(getdate())andcurday=day(getdate())end功能:这是旅店的日结系统首先通过定制作业每个一天向dayaccount中插入一个元组其中dayaccount为即对dayaccount每天的结算元组进行初始化如果有向checkout中插入元组那么将这笔roomaccount累加到dayaccount中去那么就能算出每天的营业额(定制作业将在后面介绍)Trigger:triggerMonthAccountcheckout代码:createtriggertriggerMonthAccountcheckoutoncheckoutforinsertasbegindeclareroomaccountmoneyselectroomaccount=roomaccountfrominsertedupdateMonthAccountsetmonthaccount=monthaccountroomaccountwherecuryear=year(getdate())andcurmonth=month(getdate())end功能:这是旅店月结的自动计算系统同样是通过定制作业向MonthAccount中插入关于每个月的一条元组对其初始化它依赖的同样是checkout表只要向checkout表插入的元组是在该元组对应的月份就将roomaccount累加到monthaccount中去Trigger:triggerroomremind代码:createtriggertriggerroomremindonremindforinsertasbegindeclareroomnumintselectroomnum=roomnumfrominsertedupdateroomsetroomstate='Free'whereroomnum=roomnumend功能:首先通过定制作业每当lodger中的表中旅客的expcheckindate和当前时间相等时就将旅客姓名放进remind中去只要插入到remind中那么就修改对应的roomnum的状态将roomstate的状态标记为空那么其他的旅客在当天就可以住进来了这样提高旅客房的利用率。作业一:InsertMonthAccount具体建立作业的步骤省略下面我们主要谈谈这个作业的功能在每个月的第一天向MonthAccount中插入一个元组(curyear,curmonth,monthaccount)curyear,curmonth都是当前的时间提取值而monthaccount=,然后我们建立一个触发器triggermonthaccountdayaccount如果当天有向dayaccount中插入数据的话那么就将roomaccount的累加到当月的monthaccount中去这样就实现了月结功能作业二:InsertRemindandDayAccount其中InsertDayAccount和InsertMonthAccount的实现基本一样而InsertRemind则将lodger中到期的客户信息插入到checkout中去从而建立了每日提醒这样就提高了旅店的管理的效率。

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/21
2下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部