长沙理工大学《程序设计实践》课程设计报告邹松林学院计通学院专业计算机科学与技术班级计算机03-05 学号27学生姓名邹松林指导教师卢曼莎课程成绩完成日期2006年9月20号图书馆管理系统数据库分析与设计学生姓名:邹松林指导老师:卢曼莎摘要:图书信息管理系统主要由读者信息管理模块,图书信息管理模块,借阅信息管理模块,系统信息管理模块等组成。
其中又各自分成读者注册,证件修改,用户注销,图书查询,操作记录等子模块。
在设计本系统过程中,我们第一步由自顶而下的需求分析概括设计出系统总模块的数据流图,再设计个子模块的相应数据流图,列出数据流信息及数据字典;第二步概念设计在需求分析基础上用E-R图表示出数据及相互间联系,采用先作子图,再合并成初步E-R图,进行修改和重构后得到基本E-R图;第三步逻辑设计,在SQL Server的设计环境下把图书馆管理系统E-R图转化为成逻辑数据模型表示的逻辑模式,同时实现数据模型的优化和数据模式的规范化;第四步进行物理设计设计数据的内模式,确定数据的存储结构,存取路径,存储空间分配等等,具体形式为表,视图,索引的建立。
关键字:数据库,SQL语言,MS SQL Server,图书管理1 需求分析用户的需求具体体现在各种信息的提供、保存、更新和查询,这就要求数据库结构能充分满足各种信息的输入和输出。
收集基本数据,数据结构以及数据处理的流程,为后面的具体设计打下基础。
在仔细分析调查有关图书馆管理信息需求的基础上,我们主要考虑以下几个方面的需求:1) 用户需求:图书用户要求计算机系统和SQL Server所工作的范围;2) 应用资源:数据库应用的平台包括物理平台和图书等;3) 应用质量和可靠性要求:包括操作人员素质和系统的纠错能力等项目名称:图书馆信息管理系统项目背景和内容概要对图书馆管理信息系统进行详细地分析后,我们将系统分为以下几个模块:借阅管理模块、借书证信息管理模块、图书信息管理模块、系统管理模块。
其主要功能如下: 借阅管理模块主要功能如下:1).可以为读者办理,修改,注销借书证,输入读者借书证基本信息等,定制读者的借阅权限。
2).可以通过借书证查询图书信息、借出图书信息,借阅图书。
3).通过借书证还书,管理员可以通过对借阅信息的管理对到期还未还的书,通过查询读者的借书证信息查询读者联系方式发出催还通知。
●借书证信息管理模块主要功能如下:1).读者基本信息的输入,如:读者姓名、性别、单位等。
2).读者信息的修改、注销等功能。
3).添加新的读者及其信息等。
●图书信息管理模块主要功能如下:1).定制书籍的各种信息管理,如:书名、作者、出版信息等。
2).书籍信息的修改,新图书的入库管理和图书的注销等。
●系统管理模块主要功能如下:1).用户登录。
2).修改密码。
3).添加用户。
●系统备份和数据传输模块主要功能如下:1).备份数据库数据2).恢复数据库数据3).网络数据传输1.3 数据流图●数据流总体图示图1-1 数据流总体图●办理借书证图1-2 输借书证流图●借书证修改图1-3 借书证修改流图●借书证注销图1-4借书证注销流图●借书系统不能借书的原因图1-5借书系统流图●检索系统图1-6 检索系统流图●还书系统图1-7 还书系统流图图书档案管理系统图1-8 档案管理流图表1数据字典2 概念结构设计这一阶段我们将客户的应用需求抽象为信息世界的结构,即对系统的人、物、事和概念进行人为处理,抽取人们所关心的共同特性,同时把这些特性用概念精确的描述。
我们首先根据需求分析的结果(数据流图、数据字典等)对现实世界的数据进行抽象,设计各个局部E-R图,然后合并成初步E-R图,再进行修改与重构。
局部E-R图图书信息管理系统主要分为以下几个局部E-R图:1).借书证处理系统ER图:图2-1 借书证处理系统ER 图图中各实体属性如下:读者档案:学号,读者姓名,性别,出生日期,借书证号,职业,单位,通讯地址,邮政编码,联系电话借书证:借书证号,姓名,性别,办证日期,借阅范围,最大借书量,照片,身份证号 管理员:管理员编号,管理员姓名,登陆密码 2).借书系统ER 图:图2-2借书系统ER 图图中各实体属性如下:读者:身份证号,读者姓名,借书证号MM借书证:借书证号,姓名,性别,办证日期(借阅范围,最大借书量,照片,身份证号) 库存信息:书号,图书编号借出信息:图书编号,借书证号,借书日期,归还日期 3).索书系统ER 图:图2-3索书系统ER 图图中各实体属性如下:读者:读者姓名,借书证号图书档案:图书编号,书号,书名,作者,出版单位,出版日期,单价,藏书册书,类别,入库日期4).还书系统ER 图:图2-4 还书系统ER 图图中各实体属性如下:读者:学号,读者姓名,借书证号借书证:借书证号,姓名,性别,办证日期 库存信息:书号,图书编号借出信息:图书编号,借书证号,借书日期,归还日期 管理员:操作员编号,管理员姓名,登陆密码 5).图书档案管理系统ER 图:N图2-5 档案管理系统ER图图中各实体属性如下:管理员:操作员编号,管理员姓名,登陆密码库存信息:书号,图书编号图书档案:图书编号,书号,书名,作者,出版单位,出版日期,单价,类别,入库日期入库清单:入库日期,图书编号,管理员编号,书名6). 整体E-R图图2-6 整体ER图图中各实体属性如下:读者档案:学号,读者姓名,性别,借书证号,单位借书证:借书证号,姓名,性别,办证日期管理员:操作员编号,管理员姓名,登陆密码库存信息:书号,图书编号借出信息:图书编号,借书证号,借书日期,归还日期图书档案:书号,书名,作者,出版单位,出版日期,单价,类别,藏书册书,图书编号入库日期实体描述说明:1、由于读者的信息可以在借书证办理档案中查到所以合并为借书证办理档案2. 将借出书库和入库清单分别合并到了借书登记表和图书信息表中表2 实体描述关系描述 (已包含在E-R 图中) 实体--关系调整 (实体描述表中已消除冗余实体和关系) 数据项定义1).图书库的数据项定义:表3 图书库数据项定义2).借、还书库的数据项定义:表4借、还书库数据项定义3).借书证库的数据项定义:表5借书证库数据项定义4).操作员库的数据项定义:表6操作员库数据项定义数据表(库)描述图书数据库=图书书名+图书编号+着者+出版社+单价+书号+出版时间 借书库=姓名+借书证号++教师姓名+图书名称+借书日期+还书日期 教师数据库=姓名+借书证号+单位 操作员库=操作员用户名+口令 系统功能模块图软件功能结构图:图2-7 软件功能结构系统流程图:图2-8 系统流程图3 逻辑结构设计为了能够用计算机和SQL Server 实现用户需求,可将概念结构转化为相应的数据模型,即是设计逻辑结构。
即由E -R 图建立了适当的表,并按不同的范式的定义,对表进行规范化。
对规范化的表,更据用户需求建立数据库结构。
3.2.1关系模式的优化(1) 借书证信息:借书证(借书证号,姓名,性别,单位,发证日期,已借书册书,是否容许借书) 满足BCNF范式(2) 管理员信息:管理员信息(管理员编号,管理员姓名,登陆密码)满足BCNF 范式(3) 库存信息:库存信息(图书编号,书号) 满足BCNF 范式(4) 借书信息:借书信息(图书编号,借书证号,姓名,书名,借书日期,是否归还)满足BCNF 范式(5) 还书信息:还书信息(姓名,图书编号,书名,借出日期,还书日期)满足BCNF 范式(6) 图书信息:图书档案(图书编号,书名,作者,图书类别,单价,出版社,进册书,库存量)均满足BCNF范式(7) 入库清单:入库清单(图书编号,管理员编号,书名,入库日期)满足BCNF范式3.2.2关系模式的调整虽然在关系模式的优化中将各种关系满足了BCNF范式的要求,但是对某些数据库的操作却并没有简化,相反导致了数据库查询等数据库操作的效率低下。
于是对‘借书证信息’,和‘图书信息’作出了以下调整。
(1) 借书证信息:借书证(借书证号,姓名,性别,办证日期,单位,已借书册数,借书许可,)(3NF)(2) 图书信息:图书档案(图书编号,书名,作者,出版单位,单价,图书类别,进册数,入库量)(2NF)4 代码设计图书管理系统部分源代码[图书外借情况查询代码]tempstr="%"+tempstr+"%"借书证号"select * from 借书登记表where 借书登记表.借书证号like tempstr into cursor tempcursorendif姓名"select * from 借书登记表where 借书登记表.姓名like tempstr into cursor tempcursorendif图书编号"select * from 借书登记表where 借书登记表.图书编号like tempstr into cursor tempcursorendif书名"select * from 借书登记表where 借书登记表.书名like tempstr into cursor tempcursorendif是否归还"select * from 借书登记表where 借书登记表.是否归还like tempstr into cursor tempcursorendif[图书外借和归还情况查询代码]tempstr="%"+tempstr+"%"借书证号"select * from 还书登记表where 还书登记表.借书证号like tempstr into cursor tempcursorendif姓名"select * from 还书登记表where 还书登记表.姓名like tempstr into cursor tempcursorendif图书编号"select * from 还书登记表where 还书登记表.图书编号like tempstr into cursor tempcursorendif书名"select * from 还书登记表where 还书登记表.书名like tempstr into cursor tempcursorendif[存储过程代码]procedure rideletelocal llretvalllretval=.t.if (isrlocked() and !deleted()) or !rlock()llretval=.f.elseif !deleted()deleteif cursorgetprop('buffering') > 1=tableupdate()endifllretval=pnerror=0endif not already deletedendifunlock record (recno())lparameters tcfieldname,tcnewvalue,tccascadeparentlocal llretvalllretval=.t.if isrlocked() or !rlock()llretval=.f.elseif eval(tcfieldname)<>tcnewvalueprivate pccascadeparentpccascadeparent=upper(iif(type("tccascadeparent")<>"c","",tccascadeparent)) replace (tcfieldname) with tcnewvalueif cursorgetprop('buffering') > 1=tableupdate()endifllretval=pnerror=0endif values don't already matchendif it's locked already, or i was able to lock itunlock record (recno())return llretvalprocedure rierrorparameters tnerrno,tcmessage,tccode,tcprogramlocal lnerrorrows,lnxxlnerrorrows=alen(gaerrors,1)if type('gaerrors[lnerrorrows,1]')<>"l"dimension gaerrors[lnerrorrows+1,alen(gaerrors,2)]lnerrorrows=lnerrorrows+1endifgaerrors[lnerrorrows,1]=tnerrnogaerrors[lnerrorrows,2]=tcmessagegaerrors[lnerrorrows,3]=tccodegaerrors[lnerrorrows,4]=""lnxx=1do while !empty(program(lnxx))gaerrors[lnerrorrows,4]=gaerrors[lnerrorrows,4]+","+;program(lnxx)lnxx=lnxx+1enddogaerrors[lnerrorrows,5]=pcparentdbfgaerrors[lnerrorrows,6]=pnparentrecgaerrors[lnerrorrows,7]=pcparentidgaerrors[lnerrorrows,8]=pcparentexprgaerrors[lnerrorrows,9]=pcchilddbfgaerrors[lnerrorrows,10]=pnchildrecgaerrors[lnerrorrows,11]=pcchildidgaerrors[lnerrorrows,12]=pcchildexprparameters tctable,tcorderlocal lccurwkarea,lcnewwkarea,lninusespotlninusespot=atc(tctable+"*",pcricursors)if lninusespot=0lccurwkarea=select()select 0lcnewwkarea=select()if not empty(tcorder)use (tctable) again order (tcorder) ;alias ("__ri"+ltrim(str(select()))) shareelseuse (tctable) again alias ("__ri"+ltrim(str(select()))) shareendifif pnerror=0pcricursors=pcricursors+upper(tctable)+"?"+str(select(),5)elselcnewwkarea=0endif something bad happened while attempting to open the fileelselcnewwkarea=val(substr(pcricursors,lninusespot+len(tctable)+1,5)) pcricursors = strtran(pcricursors,upper(tctable)+"*"+str(lcnewwkarea,5),;upper(tctable)+"?"+str(lcnewwkarea,5))if not empty(tcorder)set order to (tcorder) in (lcnewwkarea)endif sent an orderif pnerror<>0lcnewwkarea=0endif something bad happened while setting orderendifreturn (lcnewwkarea)procedure riendparameters tlsuccesslocal lnxx,lnspot,lcworkareaif tlsuccessend transactionelseset deleted offrollbackset deleted onendifif empty(pcriolderror)on errorelseon error &pcriolderror.endiffor lnxx=1 to occurs("*",pcricursors)lnspot=atc("*",pcricursors,lnxx)+1use in (val(substr(pcricursors,lnspot,5)))endforif pcoldcompat = "on"set compatible onendifif pcolddele="off"set deleted offendifif pcoldexact="on"set exact onendifif pcoldtalk="on"set talk onendifdo casecase empty(pcolddbc)set data tocase pcolddbc<>dbc()set data to (pcolddbc)endcasereturn .t.procedure rireuse*parameters tctablename,tcwkareapcricursors = strtran(pcricursors,upper(tctablename)+"?"+str(tcwkarea,5),;upper(tctablename)+"*"+str(tcwkarea,5))return .t.************************************************************************** ******** "参照完整性删除触发器" 借书证信息表procedure __ri_delete_借书证信息表local llretvalllretval = .t.private pcparentdbf,pnparentrec,pcchilddbf,pnchildrec,pcparentid,pcchildidprivate pcparentexpr,pcchildexprstore "" to pcparentdbf,pcchilddbf,pcparentid,pcchildid,pcparentexpr,pcchildexprstore 0 to pnparentrec,pnchildrecif _triggerlevel=1begin transactionprivate pcricursors,pcriwkareas,pcriolderror,pnerror,;pcolddele,pcoldexact,pcoldtalk,pcoldcompat,pcolddbcpcoldtalk=set("talk")set talk offpcolddele=set("deleted")pcoldexact=set("exact")pcoldcompat=set("compatible")set compatible offset deleted onset exact offpcricursors=""pcriwkareas=""pcriolderror=on("error")pnerror=0on error pnerror=rierror(error(),message(),message(1),program()) if type('gaerrors(1)')<>"u"release gaerrorsendifpublic gaerrors(1,12)pcolddbc=dbc()set data to ("tsglxt")endif first triggerlocal lcparentid && parent's value to be sought in childlocal lcchildwkarea && child work area handle returned by riopen local lcparentwkarealocal lldelheaderarealcstartarea=select()llretval=.t.lcparentwkarea=select()select (lcparentwkarea)pcparentdbf=dbf()pnparentrec=recno()store 借书证号to lcparentid,pcparentidpcparentexpr="借书证号"lcchildwkarea=riopen("还书登记表","借书证号")if lcchildwkarea<=0if _triggerlevel=1do riend with .f.endif at the end of the highest trigger levelreturn .f.endif not able to open the child work areapcchilddbf=dbf(lcchildwkarea)llretval=!seek(lcparentid,lcchildwkarea)select (lcchildwkarea)pnchildrec=recno()pcchildid=借书证号pcchildexpr="借书证号"if !llretvaldo rierror with -1,"违反删除限制规则。