1、 长沙理工大学程序设计实践课程设计汇报邹松林学 院 计通学院 专 业 计算机科学和技术 班 级 计算机03-05 学 号 27 学生姓名 邹松林 指导老师 卢曼莎 课程成绩 完成日期 9月20号图书馆管理系统数据库分析和设计学生姓名:邹松林 指导老师:卢曼莎摘要: 图书信息管理系统关键由读者信息管理模块,图书信息管理模块,借阅信息管理模块,系统信息管理模块等组成。其中又各自分成读者注册,证件修改,用户注销,图书查询,操作统计等子模块。在设计本系统过程中,我们第一步由自顶而下需求分析概括设计出系统总模块数据流图,再设计个子模块对应数据流图,列出数据流信息及数据字典;第二步概念设计在需求分析基础上
2、用E-R图表示出数据及相互间联络,采取先作子图,再合并成初步E-R图,进行修改和重构后得到基础E-R图;第三步逻辑设计,在SQL Server设计环境下把图书馆管理系统E-R图转化为成逻辑数据模型表示逻辑模式,同时实现数据模型优化和数据模式规范化;第四步进行物理设计设计数据内模式,确定数据存放结构,存取路径,存放空间分配等等,具体形式为表,视图,索引建立。关键字:数据库,SQL语言,MS SQL Server,图书管理1 需求分析用户需求具体表现在多种信息提供、保留、更新和查询,这就要求数据库结构能充足满足多种信息输入和输出。搜集基础数据,数据结构和数据处理步骤,为后面具体设计打下基础。在仔细
3、分析调查相关图书馆管理信息需求基础上,我们关键考虑以下多个方面需求:1) 用户需求:图书用户要求计算机系统和SQL Server所工作范围;2) 应用资源:数据库应用平台包含物理平台和图书等;3) 应用质量和可靠性要求:包含操作人员素质和系统纠错能力等1.1 项目名称: 图书馆信息管理系统1.2 项目背景和内容概要对图书馆管理信息系统进行具体地分析后,我们将系统分为以下多个模块:借阅管理模块、借书证信息管理模块、图书信息管理模块、系统管理模块。其关键功效以下:l 借阅管理模块关键功效以下:1).能够为读者办理,修改,注销借书证,输入读者借书证基础信息等,定制读者借阅权限。2).能够经过借书证查
4、询图书信息、借出图书信息,借阅图书。3).经过借书证还书,管理员能够经过对借阅信息管理对到期还未还书,经过查询读者借书证信息查询读者联络方法发出催还通知。l 借书证信息管理模块关键功效以下:1).读者基础信息输入,如:读者姓名、性别、单位等。2).读者信息修改、注销等功效。3).添加新读者及其信息等。l 图书信息管理模块关键功效以下:1).定制书籍多种信息管理,如:书名、作者、出版信息等。2).书籍信息修改,新图书入库管理和图书注销等。l 系统管理模块关键功效以下:1).用户登录。2).修改密码。3).添加用户。l 系统备份和数据传输模块关键功效以下:1).备份数据库数据2).恢复数据库数据3
5、).网络数据传输13 数据流图l 数据流总体图示图1-1 数据流总体图l 办理借书证图1-2 输借书证流图l 借书证修改图1-3 借书证修改流图l 借书证注销图1-4借书证注销流图l 借书系统不能借书原因图1-5借书系统流图l 检索系统图1-6 检索系统流图l 还书系统图1-7 还书系统流图l 图书档案管理系统图1-8 档案管理流图1.4 数据字典 参数名类型长度取值范围别名意义图书书名字符型11SM图书编号字符型11B-BSH作者字符型10YZ出版社字符型20CBS单价数值型8DJ借出日期日期型yy-mm-ddJS还书日期日期型yy-mm-ddHS借书证号字符型10-JSZ姓名字符型20NA
6、ME是否归还字符型20YN性别字符型2SEX单位字符型20DW发证日期日期型yy-mm-ddFZ已借书册数字符型2YNC是否许可借书字符型2YNS是或否类别字符型20LB进册数数值型10JC库存量数值型10CZ操作员编号数值型10CB操作员姓名字符型10CNAME操作员密码 字符型15MM表1数据字典2 概念结构设计这一阶段我们将用户应用需求抽象为信息世界结构,即对系统人、物、事和概念进行人为处理,抽取大家所关心共同特征,同时把这些特征用概念正确描述。我们首先依据需求分析结果(数据流图、数据字典等)对现实世界数据进行抽象,设计各个局部E-R图,然后合并成初步E-R图,再进行修改和重构。2.1局
7、部E-R图图书信息管理系统关键分为以下多个局部E-R图:1).借书证处理系统ER图:管理员办证改证销证读者档案借书证身份验证身份验证身份验证1PPNMNMP1P图2-1 借书证处理系统ER图图中各实体属性以下:读者档案:学号,读者姓名,性别,出生日期,借书证号,职业,单位,通讯地址,邮政编码,联络电话借书证:借书证号,姓名,性别,办证日期,借阅范围,最大借书量,照片,身份证号管理员:管理员编号,管理员姓名,登陆密码2).借书系统ER图:读者借书证库存表借出信息验证查询借书检验库存索书条111N1NN图2-2借书系统ER图图中各实体属性以下:读者:身份证号,读者姓名,借书证号借书证:借书证号,姓
8、名,性别,办证日期(借阅范围,最大借书量,照片,身份证号)库存信息:书号,图书编号借出信息:图书编号,借书证号,借书日期,归还日期3).索书系统ER图:读者图书档案索书要求索书MN索书条图2-3索书系统ER图图中各实体属性以下:读者:读者姓名,借书证号图书档案:图书编号,书号,书名,作者,出版单位,出版日期,单价,藏书册书,类别,入库日期4).还书系统ER图:验证还书催还完整检验读者借书证库存表借出信息管理员是否归还1N1MMN1M1P图2-4 还书系统ER图图中各实体属性以下:读者:学号,读者姓名,借书证号借书证:借书证号,姓名,性别,办证日期库存信息:书号,图书编号借出信息:图书编号,借书
9、证号,借书日期,归还日期管理员:操作员编号,管理员姓名,登陆密码5)图书档案管理系统ER图:管理员修改输入注销图书档案库存身份验证身份验证身份验证1N1NN1NNNN入库清单图2-5 档案管理系统ER图图中各实体属性以下:管理员:操作员编号,管理员姓名,登陆密码库存信息:书号,图书编号图书档案:图书编号,书号,书名,作者,出版单位,出版日期,单价,类别,入库日期入库清单:入库日期,图书编号,管理员编号,书名6). 整体E-R图读者图书档案借出书库库存表管理员借书证图书管理证件处理催还借书还书查询已借索书PPM1MN11MNPPMNNPMNN1N图2-6 整体ER图图中各实体属性以下:读者档案:
10、学号,读者姓名,性别,借书证号,单位借书证:借书证号,姓名,性别,办证日期管理员:操作员编号,管理员姓名,登陆密码库存信息:书号,图书编号借出信息:图书编号,借书证号,借书日期,归还日期图书档案:书号,书名,作者,出版单位,出版日期,单价,类别,藏书册书,图书编号入库日期2.2 实体描述说明:1、因为读者信息能够在借书证办理档案中查到所以合并为借书证办理档案 2. 将借出书库和入库清单分别合并到了借书记录表和图书信息表中实体名称借书证数据库表借书证信息表实体说明读者和借书证信息实体属性列表借书证号,姓名,性别,办证日期,最大借书量,学号实体名称管理员数据库表tz_passwd实体说明管理员信息
11、实体属性列表管理员编号,管理员姓名,登陆密码实体名称读者数据库表借书记录表实体说明图书馆未被借出图书信息实体属性列表书号,图书编号实体名称读者数据库表还书记录表实体说明图书馆未被借出图书信息实体属性列表书号,图书编号实体名称图书档案数据库表图书信息表实体说明馆藏图书信息实体属性列表书号,书名,作者,出版单位,出版日期,版次,单价,类别,图书编号,入库日期表2 实体描述2.3 关系描述 (已包含在E-R图中)2.4 实体-关系调整 (实体描述表中已消除冗余实体和关系)2.5 数据项定义1)图书库数据项定义:名称别名类型长度其它图书书名SM字符型20一般索引书号SH数值型20主索引译者YZ字符型1
12、0出版社CBS字符型20单价DJ数值型8出版时间CBSJ日期型8表3 图书库数据项定义2)借、还书库数据项定义:名称别名类型长度其它姓名XSXM字符型10一般索引借书证号JSZH数值型8主索引图书书名SM字符型20图书编号SH字符型20借书日期JSRQ日期型8还书日期HSRQ日期型8表4借、还书库数据项定义3)借书证库数据项定义:名称别名类型长度其它姓名JSXM字符型10一般索引借书证号JSGH字符型6主索引性别XB字符型4单位DW字符型8表5借书证库数据项定义4)操作员库数据项定义:名称别名类型长度其它操作员编号CZYYHH字符型10操作员用户名CZYYHM字符型10口令KL字符型10表6操
13、作员库数据项定义2.6数据表(库)描述图书数据库=图书书名+图书编号+著者+出版社+单价+书号+出版时间借书库=姓名+借书证号+老师姓名+图书名称+借书日期+还书日期老师数据库=姓名+借书证号+单位操作员库=操作员用户名+口令2.7 系统功效模块图软件功效结构图:工商学院图书信息管理系统系统管理基础情况录入借、还书管理查询、统计初始化数据备份操作员管理通常见户登陆新图书登记新期发表记借书登记还书登记图书库藏查询借书证库查询图书查询借书查询还书查询图2-7 软件功效结构2.8 系统步骤图:图书管理系统读者查询系统图书(期刊)库查询图2-8 系统步骤图3 逻辑结构设计为了能够用计算机和SQL Se
14、rver实现用户需求,可将概念结构转化为对应数据模型,即是设计逻辑结构。即由ER图建立了合适表,并按不一样范式定义,对表进行规范化。对规范化表,更据用户需求建立数据库结构。3.1 确定数据依靠关系名主 要 函 数 依 赖管理员 BCNF管理员编号(管理员姓名,登陆密码)库存信息BCNF 图书编号书名等借出信息BCNF(图书编号)(借书日期,借书证号,归还日期)借书证2NF借书证号(借书证号,姓名,性别,单位,发证日期,已借书册书,是否许可借书)以后扩展:身份证号(姓名,性别,照片)图书档案2NF图书编号(书号,书名,作者,出版单位,出版日期,版次,单价,内容提要,分类号,索书号,所在书库,入库
15、日期)入库清单BCNF图书编号(管理员编号,书名,入库日期)还书信息BCNF借书证号(姓名,图书编号,书名,借出日期,还书日期)3.2 数据依靠优化和调整3.2.1关系模式优化 (1) 借书证信息:借书证 (借书证号,姓名,性别,单位,发证日期,已借书册书,是否许可借书) 满足 BCNF范式(2) 管理员信息:管理员信息(管理员编号,管理员姓名,登陆密码)满足 BCNF 范式(3) 库存信息:库存信息(图书编号,书号) 满足BCNF 范式(4) 借书信息:借书信息(图书编号,借书证号,姓名,书名,借书日期,是否归还)满足 BCNF 范式(5) 还书信息:还书信息(姓名,图书编号,书名,借出日期
16、,还书日期)满足 BCNF 范式(6) 图书信息:图书档案(图书编号,书名,作者,图书类别,单价,出版社,进册书,库存量)均满足 BCNF范式(7) 入库清单:入库清单(图书编号,管理员编号,书名,入库日期)满足 BCNF范式3.2.2关系模式调整即使在关系模式优化中将多种关系满足了BCNF范式要求,不过对一些数据库操作却并没有简化,相反造成了数据库查询等数据库操作效率低下。于是对借书证信息,和图书信息作出了以下调整。(1) 借书证信息:借书证(借书证号,姓名,性别,办证日期,单位,已借书册数,借书许可,)(3NF) (2) 图书信息: 图书档案(图书编号,书名,作者,出版单位,单价,图书类别
17、,进册数,入库量) (2NF)4 代码设计图书管理系统部分源代码图书外借情况查询代码tempstr=allt(thisform.container1.text1.value)tempstr=%+tempstr+%if bo1.text=借书证号select * from 借书记录表 where 借书记录表.借书证号 like tempstr into cursor tempcursorthisform.grid1.recordsource=tempcursorthisform.refreshendif if bo1.text=姓名select * from 借书记录表 where 借书记录表.
18、姓名 like tempstr into cursor tempcursorthisform.grid1.recordsource=tempcursorthisform.refreshendif if bo1.text=图书编号select * from 借书记录表 where 借书记录表.图书编号 like tempstr into cursor tempcursorthisform.grid1.recordsource=tempcursorthisform.refreshendif if bo1.text=书名select * from 借书记录表 where 借书记录表.书名 like
19、tempstr into cursor tempcursorthisform.grid1.recordsource=tempcursorthisform.refreshendif if bo1.text=是否归还select * from 借书记录表 where 借书记录表.是否归还 like tempstr into cursor tempcursorthisform.grid1.recordsource=tempcursorthisform.refreshendif thisform.container1.text1.value=图书外借和归还情况查询代码tempstr=allt(this
20、form.container1.text1.value)tempstr=%+tempstr+%if bo1.text=借书证号select * from 还书记录表 where 还书记录表.借书证号 like tempstr into cursor tempcursorthisform.grid1.recordsource=tempcursorthisform.refreshendif if bo1.text=姓名select * from 还书记录表 where 还书记录表.姓名 like tempstr into cursor tempcursorthisform.grid1.record
21、source=tempcursorthisform.refreshendif if bo1.text=图书编号select * from 还书记录表 where 还书记录表.图书编号 like tempstr into cursor tempcursorthisform.grid1.recordsource=tempcursorthisform.refreshendif if bo1.text=书名select * from 还书记录表 where 还书记录表.书名 like tempstr into cursor tempcursorthisform.grid1.recordsource=t
22、empcursorthisform.refreshendif thisform.container1.text1.value=存放过程代码procedure rideletelocal llretvalllretval=.t. if (isrlocked() and !deleted() or !rlock() llretval=.f. else if !deleted() delete if cursorgetprop(buffering) 1 =tableupdate() endif llretval=pnerror=0 endif not already deleted endif un
23、lock record (recno()return llretvalprocedure riupdatelparameters tcfieldname,tcnewvalue,tccascadeparentlocal llretvalllretval=.t. if isrlocked() or !rlock() llretval=.f. else if eval(tcfieldname)tcnewvalue private pccascadeparent pccascadeparent=upper(iif(type(tccascadeparent)c,tccascadeparent) repl
24、ace (tcfieldname) with tcnewvalue if cursorgetprop(buffering) 1 =tableupdate() endif llretval=pnerror=0 endif values dont already match endif its locked already, or i was able to lock it unlock record (recno()return llretvalprocedure rierrorparameters tnerrno,tcmessage,tccode,tcprogramlocal lnerrorr
25、ows,lnxxlnerrorrows=alen(gaerrors,1)if type(gaerrorslnerrorrows,1)l dimension gaerrorslnerrorrows+1,alen(gaerrors,2) lnerrorrows=lnerrorrows+1endifgaerrorslnerrorrows,1=tnerrnogaerrorslnerrorrows,2=tcmessagegaerrorslnerrorrows,3=tccodegaerrorslnerrorrows,4=lnxx=1do while !empty(program(lnxx) gaerror
26、slnerrorrows,4=gaerrorslnerrorrows,4+,+; program(lnxx) lnxx=lnxx+1enddogaerrorslnerrorrows,5=pcparentdbfgaerrorslnerrorrows,6=pnparentrecgaerrorslnerrorrows,7=pcparentidgaerrorslnerrorrows,8=pcparentexprgaerrorslnerrorrows,9=pcchilddbfgaerrorslnerrorrows,10=pnchildrecgaerrorslnerrorrows,11=pcchildid
27、gaerrorslnerrorrows,12=pcchildexprreturn tnerrnoprocedure riopenparameters tctable,tcorderlocal lccurwkarea,lcnewwkarea,lninusespotlninusespot=atc(tctable+*,pcricursors)if lninusespot=0 lccurwkarea=select() select 0 lcnewwkarea=select() if not empty(tcorder) use (tctable) again order (tcorder) ; ali
28、as (_ri+ltrim(str(select() share else use (tctable) again alias (_ri+ltrim(str(select() share endif if pnerror=0 pcricursors=pcricursors+upper(tctable)+?+str(select(),5) else lcnewwkarea=0 endif something bad happened while attempting to open the fileelse lcnewwkarea=val(substr(pcricursors,lninusesp
29、ot+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 order if pnerror0 lcnewwkarea=0 endif something bad happened while setting orderendifreturn (lc
30、newwkarea)procedure riendparameters tlsuccesslocal lnxx,lnspot,lcworkareaif tlsuccess end transactionelse set deleted off rollback set deleted onendifif empty(pcriolderror) on errorelse on error &pcriolderror.endiffor lnxx=1 to occurs(*,pcricursors) lnspot=atc(*,pcricursors,lnxx)+1 use in (val(subst
31、r(pcricursors,lnspot,5)endforif pcoldcompat = onset compatible onendifif pcolddele=off set deleted offendifif pcoldexact=on set exact onendifif pcoldtalk=on set talk onendifdo case case empty(pcolddbc) set data to case pcolddbcdbc() set data to (pcolddbc)endcasereturn .t.procedure rireuse* rireuse.p
32、rgparameters 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,pcchildid
33、private pcparentexpr,pcchildexprstore to pcparentdbf,pcchilddbf,pcparentid,pcchildid,pcparentexpr,pcchildexprstore 0 to pnparentrec,pnchildrecif _triggerlevel=1 begin transaction private pcricursors,pcriwkareas,pcriolderror,pnerror,; pcolddele,pcoldexact,pcoldtalk,pcoldcompat,pcolddbc pcoldtalk=set(
34、talk) set talk off pcolddele=set(deleted) pcoldexact=set(exact) pcoldcompat=set(compatible) set compatible off set deleted on set exact off pcricursors= pcriwkareas= pcriolderror=on(error) pnerror=0 on error pnerror=rierror(error(),message(),message(1),program() if type(gaerrors(1)u release gaerrors
35、 endif public gaerrors(1,12) pcolddbc=dbc() set data to (tsglxt)endif first triggerlocal lcparentid & parents value to be sought in childlocal lcchildwkarea & child work area handle returned by riopenlocal lcparentwkarealocal lldelheaderarealcstartarea=select()llretval=.t.lcparentwkarea=select()sele
36、ct (lcparentwkarea)pcparentdbf=dbf()pnparentrec=recno()store 借书证号 to lcparentid,pcparentidpcparentexpr=借书证号lcchildwkarea=riopen(还书记录表,借书证号)if lcchildwkarea=0 if _triggerlevel=1 do riend with .f. endif at the end of the highest trigger level return .f.endif not able to open the child work areapcchild
37、dbf=dbf(lcchildwkarea)llretval=!seek(lcparentid,lcchildwkarea)select (lcchildwkarea)pnchildrec=recno()pcchildid=借书证号pcchildexpr=借书证号if !llretval do rierror with -1,违反删除限制规则。,endif=rireuse(还书记录表,lcchildwkarea)if not llretval if _triggerlevel=1 do riend with llretval endif at the end of the highest tr
38、igger level select (lcstartarea) return llretvalendifif _triggerlevel=1 do riend with llretvalendif at the end of the highest trigger levelselect (lcstartarea)return llretval* 结束参考完整性删除触发器 借书证信息表*procedure _ri_update_借书证信息表* 参考完整性更新触发器 借书证信息表local llretvalllretval = .t.private pcparentdbf,pnparentre
39、c,pcchilddbf,pnchildrec,pcparentid,pcchildidprivate pcparentexpr,pcchildexprstore to pcparentdbf,pcchilddbf,pcparentid,pcchildid,pcparentexpr,pcchildexprstore 0 to pnparentrec,pnchildrecif _triggerlevel=1 begin transaction private pcricursors,pcriwkareas,pcriolderror,pnerror,; pcolddele,pcoldexact,p
40、coldtalk,pcoldcompat,pcolddbc pcoldtalk=set(talk) set talk off pcolddele=set(deleted) pcoldexact=set(exact) pcoldcompat=set(compatible) set compatible off set deleted on set exact off pcricursors= pcriwkareas= pcriolderror=on(error) pnerror=0 on error pnerror=rierror(error(),message(),message(1),program() if type(gaerrors(1)u release gaerrors endif public gaerrors(1,12)