图书管理系统的分析与设计
1. 设计内容
设计开发一个图书管理系统,主要包括如下要求:
1) 对读者基本信息的管理,包括读者信息的录入、修改、删除及查询;
2) 对图书信息的管理,进行新书入库、现有图书信息修改、删除以及查询
3) 图书借阅的管理;
4) 图书归还的管理。
2. 设计目的
数据库课程设计是为数据库原理及应用课程而独立开设的实践性课程,对于巩固数据库知识,加强学生的实际动手能力和提高学生综合素质十分必要。通过本实验达到以下目的:
1) 培养具有C/SB/S模式的数据库应用软件系统的设计和开发能力。
2) 熟练掌握一种数据库系统(SQL SERVER)的使用。
3) 熟练掌握一种数据库应用软件开发工具(如ASPVBVC)的使用。
4) 通过设计实际的数据库系统应用课题,进一步熟悉数据库管理系统的操作技术,提高动手能力,提高分析问题和解决问题的能力。
要求:
要求掌握数据库的设计的每个步骤;掌握数据库设计各阶段的设计内容、设计方法和工具
3. 设计过程
3.1 需求分析
3.1.1 用户需求
图书馆在正常运营中总是面对大量的读者信息、书籍信息以及两者相互作用产生的借书信息、还书信息。需要对读者资源、书籍资源、借书信息、还书信息进行管理,及时了解各个环节中信息的变更,有利于提高管理效率。
1)对用户信息的管理
能够对一定数量的读者信息进行存储与管理,这其中包括:读者信息的登记、删除及修改;读者基本信息的查询。
2)对图书信息的管理
能够存储一定数量的图书信息,并方便有效地进行书籍数据的操作和管理,这主要包括:图书信息的录入、删除及修改;图书信息的查询,即可根据不同的条件(条形码、书名、类别、作者、书架、出版社等信息)查询读者需要的图书,而读者可根据不同的条件(条形码、图书名称、读者编号、读者姓名、到期时间等信息)查询自己借阅图书的信息。
3)对图书借阅的管理
借书管理:读者从书架上选取所需图书后,将图书和借阅卡交管理人员,管理人员利用条形码扫描仪及读卡器将图书和借阅卡上的信息读入系统。系统根据借阅卡信息从借阅者的借阅文件中到相应记录;根据图书信息从图书文件中到相应记录,读者如果有如下列情况之一将不予办理借书手续。 
  ① 读者所借阅图书已超过该读者允许的最多借书数目。 
  ② 该读者还有已超过归还日期而仍未归还的图书。 
若读者符合所有借书条件时,予以借出。系统在借阅文件中增加一条记录,记入读者编号(学生学号或教师编号)、图书编号(可以使用ISBN号)、借阅日期等内容。 
4)对图书归还的管理
还书管理:还书时,读者将图书交给管理人员,管理员通过条形码扫描仪将图书上的图书条码读入系统,系统从借阅文件上到相应记录,填上还书日期,同时系统根据借书、还书日期进行计算,判断是否超过归还日期,若未超期则结束过程,若超期则计算出超期天数、数。通知读者交纳。 
3.1.2数据流图
依据用户需求,绘制系统的顶层数据流图,如图3-1所示。第一层数据流图(如图3-2所示),借书处理的数据流图(图3-3),还书处理的数据流图(图3-4)以及入库处理的数据流图(图3-5)。
3-1 顶层数据流图
将顶层数据流图分层细化,下面是第一层数据流图(如图3-2所示)。
3-2第一层数据流图
3-3是借书处理的数据流图。
3-3 借书处理的数据流图
3-4是还书处理的数据流图。
3-4 还书处理的数据流图
3.1.3 数据字典
1. 数据结构字典
----------------------------------------------------------------------
数据结构名:借阅者
含义说明:借阅者信息
组成:借阅者姓名,借阅证号,班级,专业,院系,借书数量
----------------------------------------------------------------------
数据结构名: 管理员
含义说明: 管理员信息
组成: 管理员编号,管理员姓名,职称,负责书库
----------------------------------------------------------------------
数据结构名: 图书
含义说明: 图书信息
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
----------------------------------------------------------------------
2.数据流字典
----------------------------------------------------------------------
数据流名:借阅证
说明:借阅者信息
数据流来源:借阅者
数据流去向:借书处理
组成:借阅者姓名,借阅证号,班级,院系
----------------------------------------------------------------------
数据流名:图书
说明:借阅图书信息
数据流来源:借书处理
数据流去向:借阅者
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
----------------------------------------------------------------------
数据流名:还书
说明:借阅者还书
数据流来源:借阅者
数据流去向:还书处理
组成:借阅者姓名,借阅证号,班级,院系
----------------------------------------------------------------------
数据流名:不合格的借阅证
说明:借阅证无法使用
数据流来源:借书处理
数据流去向:借阅者
组成:借阅者姓名,借阅证号,班级,院系
----------------------------------------------------------------------
数据流名:借书清单
说明:借出书目信息
数据流来源:借书处理
数据流去向:图书库存情况存档
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
----------------------------------------------------------------------
数据流名:还书清单
说明:归还书目信息
数据流来源:还书处理
数据流去向:图书库存情况存档
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期----------------------------------------------------------------------
数据流名:入库新书清单
说明:入库新书信息
数据流来源:管理员
数据流去向:新书入库处理
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
----------------------------------------------------------------------
数据流名:库存清单
说明:库存图书信息
数据流来源:新书入库处理
数据流去向:图书库存情况存档
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
----------------------------------------------------------------------
数据流名:销书计划
说明:销毁图书信息
数据流来源:管理员
数据流去向:销书处理
组成:图书编号,图书名称,日期,数量
----------------------------------------------------------------------
数据流名:销书清单
说明:销毁图书目录
数据流来源:销书处理
数据流去向:图书库存情况存档
组成:图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期
----------------------------------------------------------------------
数据流名: 清单
数据流来源:处理
数据流去向:借阅者
组成:管理员编号,借阅证号,借书编号,数目
----------------------------------------------------------------------
3. 处理逻辑字典
----------------------------------------------------------------------
处理逻辑名: 借书处理
含义说明:完成读者对图书的借阅处理
输入数据流:借阅证  来源:借阅者
输出数据流:
(1) 不合格的借阅证    去向:借阅者
(2) 图书              去向:借阅者
(3) 借书清单          去向:图书库存情况存档,借阅者信息,借阅情况存档
    处理:检索“借阅情况存档”,“借阅者信息”,根据借阅者的借阅卡信息,审核借阅者的借阅条件,若不符合条件,则退回借阅卡;若符合条件,则检索“图书在库情况存档”,有在库图书,则完成审核,形成合格的借书单,据此完成图书借阅,并将借书信息加入到“借阅情况存档”,根据借书清单修改“图书库存情况存档”,“借阅者信息”文件。
----------------------------------------------------------------------
处理逻辑名: 还书处理
含义说明:完成读者对图书的归还处理
输入数据流:还书        来源:借阅者
输出数据流:还书清单    去向:图书库存情况存档,借阅者信息,借阅情况存档
    处理:检索“借阅情况存档”,通过计算图书借阅的时间,审核借阅者所借阅的图书是否过期,若过期则通知借阅者缴纳,并归还图书,若未过期则完成图书入库处理,并根据形成的还书清单,修改“借阅情况存档”、“图书库存情况存档”、借阅者信息”文件。
----------------------------------------------------------------------
处理逻辑名: 入库处理
含义说明:完成新书入库处理
输入数据流:入库新书清单        来源:管理员
输出数据流:库存清单            去向:图书库存情况存档
    处理:根据管理员提交的入库新书清单完成图书入库处理,并根据形成的库存清单,修改 “图书库存情况存档”文件。
----------------------------------------------------------------------
处理逻辑名: 销书处理
含义说明:完成图书的出库销书处理
输入数据流:销书计划      来源:管理员
输出数据流:销书清单      去向:图书库存情况存档
    处理:根据管理员提交的销书计划完成图书出库处理,并根据形成的销书清单,修改 “图书库存情况存档”文件。
----------------------------------------------------------------------
4. 数据存储字典
----------------------------------------------------------------------
数据存储名:图书库存情况存档
含义说明:每类图书库存情况
输入数据流:借书清单、还书清单、库存清单、销书清单
输出数据流:图书库存情况
数据存储的组成:图书
----------------------------------------------------------------------
数据存储名:借阅情况存档
含义说明:借阅者借阅情况
输入数据流:借书清单、还书清单
输出数据流:借阅情况
数据存储的组成:借阅证号,图书编号,管理员编号,借出日期,归还日期,到期日期,拖欠日期,数目
----------------------------------------------------------------------
数据存储名:借阅者信息
含义说明:借阅者信息
输入数据流:借书清单、还书清单
输出数据流:借阅者信息
数据存储的组成:借阅者
----------------------------------------------------------------------
3.1.4 功能模块分析
根据用户需求,以及数据流图分析,提取出系统应该实现的功能,如图3-5所示。
3-5 系统功能结构图
主要包括:
(1)实现对图书信息的修改,包括定义、查询、更新、删除等操作
图书信息包括图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期等。
(2)实现对借阅者信息的修改,包括定义、查询、更新、删除等操作
借阅者信息包括借阅证号,姓名,班级,院系、借书数量等。
(3)实现借书功能
借书信息的输入,包括借阅证号,图书编号,借出日期,到期日期,归还日期,拖欠日期,数目等。
借书信息的查询,修改,包括图书编号,借阅证号,借阅者姓名,图书名称,借出日期等。
(4)实现还书功能
还书信息的查询和修改,包括还书信息编号,借阅者编号,姓名,图书编号,图书名称,借书日期,还书日期等。
5)实现销书功能
对不符合要求的图书进行出库处理,包括图书编号,书名,作者姓名,出版社,出版日期,在库数,所在书库,入库日期,出库日期等。
3.2 概念结构设计
分析了数据流图及数据字典,列出图书管理系统中涉及到的实体以及基本的E-R图。
1)实体属性图
该系统中涉及到的实体有:图书实体、借阅者实体、 管理员实体、书库实体,上述实体对应的属性图见图3-6、图3-7、图3-8以及图3-9所示。
3-6 图书实体属性图
3-7 借阅者实体属性图
3-8 管理员实体属性图
3-9 书库实体属性图
(2)基本E-R
3-10 基本E-R
3.3 逻辑结构设计
3.3.1 关系模型
将上述E-R图转换为逻辑模型,其中实体转换为独立的关系模式,多对多联系也转换为独立的关系模式,而一对多联系与n端实体的关系模式进行合并,可得到如下关系模式。
图书(图书编号,书名,作者姓名,出版社,出版日期,在库数,入库日期,出库日期,书库编号),其中“图书编号”为主码,“书库编号”为外码。
借阅者(借阅证号,姓名,学号,专业,年级,院系,借书数量),其中“借阅证号”是主码。
管理员(管理员编号,姓名,职称,书库编号),其中“管理员编号”是主码,“书库编号”为外码。
书库(书库编号,书库名称,地点),其中“书库编号”是主码。
借阅借阅证号,图书编号,管理员编号,借出日期,归还日期,到期日期,拖欠日期,数目),其中“借阅证号”、“图书编号”及“管理员编号”共同构成主码。
管理管理员编号,借阅证号),其中“管理员编号”及“借阅证号”共同构成主码。
处理管理员编号,图书编号),其中“管理员编号”及“图书编号”共同构成主码。
3.3.2 数据模型优化
在“图书”、“借阅者”、“管理员”、“书库”、“借阅”“管理”及“处理”关系模式中,不存在非主属性对码的部分函数依赖以传递函数依赖,因此这些关系模式属于第三范式。
3.3.3 视图设计
视图是从一个特定的角度来查看数据库中的数据,从数据库系统内部看,一个视图是由SELECT语句组成的查询定义的虚表,它是由一张或多张表中的数据组成的;从数据库系统外部来看,视图就如同一张表,对视图的操作最终转换为对基本表的操作。可以在上述基本表上建立如下视图。
3-1 视图定义
编号
视图(View)
作用(共性:提供数据保密和安全保护机制)
V1
BookView1
便于查询和更新图书的基本信息
V2
BookView2
便于查询和更新图书的入库、出库日期
V3
BorrowView
用于查询当前的借阅信息
V4
FineView
便于查询信息
BookView1(图书编号,书名,作者姓名,出版社,出版日期,在库数,书库编号);
BookView2(图书编号,书名,入库日期,出库日期);
BorrowView借阅证号,图书编号,管理员编号,借出日期,到期日期);
FineView借阅证号,图书编号,到期日期,拖欠日期,数目)。
3.4 物理结构设计
根据上述分析,数据库中应包含7张基本表,下面列出了每张表中数据项的定义,见表3-2、表3-3、表3-4、表3-5、表3-6、表3-7以及表3-8所示。
3-2 图书表(Book)
列名
数据类型
约束条件
说明
BookNo
Char
Primary key
图书的编号
BookName
Char
Not Null
图书的书名
BookWriter
Char
Not Null
图书作者
BookPulish
Char
Not Null
图书出版社
BookPDate
Date
图书的出版日期
BookQuantity
Int
Not Null
图书的在库数量
BookIn
Date
Not Null
图书入库时间
BookOut
Date
Not Null
图书出库时间
BookRNo
Char
Foreign Key
图书所在书库编号
3-3 借阅者表(Reader)
列名
数据类型
约束条件
说明
ReaderNo
Char
Primary Key
借阅证号
ReaderName
图书管理系统数据库设计说明书
Char
Not Null
借阅者姓名
ReaderID
Char
Not Null
借阅者学号
ReaderPref
Char
Not Null
借阅者所属专业
ReaderGrade
Char
Not null
借阅者的年级
ReaderDep
Char
Not null
借阅者所在院系
BorrowQuantity
Int
Not null and <=10
借书数量
3-4 管理员表(Manager)
列名
数据类型
约束条件
说明
ManagerNo
Char
Primary Key
管理员编号
ManagerName
Char
Not Null
管理员姓名
ManagerTitle
Char
Not Null
管理员职称
BookRNo
Char
Foreign Key
管理员所负责的书库编号
3-5 书库表(Stackroom)
列名
数据类型
约束条件
说明
StackroomNo
Char
Primary Key
书库编号
StackroomName
Char
Not Null
书库名称
StackroomLoc
Char
Not Null
地点
3-6 借阅信息表(Borrow)
列名
数据类型
约束条件
说明
ReaderNo
Char
Primary key
借阅证号
BookNo
Char
Primary key
图书的编号
ManagerNo
Char
Primary Key
管理员编号
OutDate
Date
Not Null
借出日期
BackDate
Date
归还日期
InDate
Date
Not Null
到期日期
ArrearsDate
Date
Not Null
拖欠日期
Fine
Int
Not Null
数目
3-7 管理表(Manage)
列名
数据类型
约束条件
说明
ManagerNo
Char
Primary Key
管理员编号
BookNo
Char
Primary key
图书的编号
3-8 处理表(Handle)
列名
数据类型
约束条件
说明
ManagerNo
Char
Primary Key
管理员编号
ReaderNo
Char
Primary key
借阅证号
根据上述视图的定义,下面列出了每个视图中数据项的定义,见表3-9、表3-10、表3-11以及表3-12所示。
3-9 图书基本信息视图
列名
数据类型
可否为空
说明
BookNo
Char
Not Null
图书的编号
BookName
Char
Not Null
图书的书名
BookWriter
Char
Not Null
图书作者
BookPulish
Char
Not Null
图书出版社
BookPDate
Date
图书的出版日期
BookQuantity
Int
Not Null
图书的在库数量
BookRNo
Char
Not Null
图书所在书库编号
表3-10 图书的出入库信息视图
列名
数据类型
可否为空
说明
BookNo
Char
Not null
图书的编号
BookName
Char
Not Null
图书的书名
BookIn
Date
Not Null
图书入库时间
BookOut
Date
Not Null
图书出库时间
表3-11 读者当前借阅信息视图
列名
数据类型
可否为空
说明
ReaderNo
Char
Not null
借阅证号
BookNo
Char
Not null
图书编号
ManagerNo
Char
Not null
管理员编号
OutDate
Date
Not Null
借出日期
InDate
Date
Not Null
到期日期
表3-12 信息视图
列名
数据类型
可否为空
说明
ReaderNo
Char
Not null
借阅证号
BookNo
Char
Not null
图书编号
InDate
Date
Not Null
到期日期
ArrearsDate
Date
Not Null
拖欠日期
Fine
Int
Not Null
数目
数据库的物理设计就是为逻辑数据模型选取一个最合适应用要求的物理结构的过程,在这个阶段中要完成的主要任务为确定数据库的物理结构,在关系数据库中主要是存取方法和存储结构。
为数据库中各基本表建立索引,如下所示。
由于基本表Reader,Book的主码ReaderNo,BookNo经常在查询条件和连接操作的连接条件中出现,且它们的值唯一,在两个属性上建立唯一性索引;
由于基本表Reader的属性ReaderDep,Book的属性BookPublish经常在查询条件中出现,在两个属性上建立聚簇索引;
借阅信息基本表Borrow的属性ReaderNo, BookNo,经常在查询条件中出现,考虑在其之上建立聚簇索引。
4. 系统的实现
利用VBAccesss实现了图书管理系统中,图书信息录入、图书信息查询功能,代码如下:
Private Sub Command1_Click()  ‘首页 “进入系统”按钮的事件过程,进入登录窗口
首页.Hide
登录窗口.Show
End Sub
如图4-1所示:
图4-1  系统首页
Private Sub Command1_Click()  ‘登录界面中的“登录”按钮对应的事件过程
If Text1 = "admin" And Text2 = "12345" Then  ‘需要输入账号admin,密码12345,才能进入系统
    登录窗口.Hide      ‘登录界面隐藏
    主界面.Show        ‘系统主界面出现
End If
End Sub
Private Sub Command2_Click()  ‘“退出”按钮的事件过程,退出系统
End
End Sub
如图4-2所示:
图4-2 登录界面
系统主界面如图4-3所示:
主界面中根据系统结构,设置了四个菜单,每个菜单下有对应的菜单选项,这里只实现了图书录入、图书查询功能。选择图书录入则进入到图4-4所示界面,选择图书查询则进入图4-5所示界面。
Private Sub 图书查询_Click()  ‘选择图书查询菜单项进入图书信息查询界面
图书信息查询.Show
End Sub
Private Sub 图书录入_Click()  ‘选择图书录入菜单项进入图书信息录入界面
图书信息录入.Show
End Sub
图4-3 系统主界面
图4-4 图书信息录入界面
Private Sub Command1_Click()  ‘图书录入界面中“增加信息”按钮的事件过程
Dim sql As String    ‘定义变量sql为字符串类型,下同
Dim bookno1 As String 
Dim bookname1 As String
Dim bookwriter1 As String
Dim bookpublish1 As String
Dim bookin1 As Date
Dim bookout1 As Date
Dim bookpdate1 As Date
Dim bookquantity1 As Integer
Dim bookrno1 As String
Dim conn As New ADODB.Connection  ‘定义数据库链接
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=;Persist Security Info=False;Data Source=" & App.Path + "\dbbook.mdb " & ""  ‘链接数据库
bookno1 = Trim(Text1(0).Text)  ‘从录入界面的文本框中获取用户输入的数据,即图书信息,下同
bookname1 = Trim(Text2.Text)  ‘Trim函数是去掉字符串两边的空格
bookwriter1 = Trim(Text3.Text)
bookpublish1 = Trim(Text4.Text)
bookpdate1 = Trim(Text5.Text)
bookin1 = Trim(Text6.Text)
bookout1 = Trim(Text7.Text)
bookquantity1 = Trim(Text8.Text)
bookrno1 = Trim(Text9.Text)
sql = "insert into 图书表
(bookno ,bookname,bookwriter,bookpublish,bookpdate,bookin,bookout,bookquantity,bookrno) values('" & bookno1 & " ' , '" & bookname1 & " ','" & bookwriter1 & " ','" & bookpublish1 & " ','" & bookpdate1 & " ','" & bookin1 & " ','" & bookout1 & " ','" & bookquantity1 & " ','" & bookrno1 & " ') " 
conn.Execute (sql)  ‘向数据库中插入用户输入的数据
End Sub
Private Sub Command2_Click() ‘退出按钮的事件过程,点击该按钮则退出图书录入界面。
图书信息录入.Hide
End Sub
图4-5 图书信息查询界面
Private Sub Command1_Click(Index As Integer)  ‘图书查询界面中“查询”按钮对应的事件过程
Dim sql As String  ‘定义字符串变量
  If Check1.Value = 1 Then  ‘如果选择书名前的选项,则按书名进行查询
    sql = "bookname='" & Trim(Text1.Text & " ") & "'"
  End If
 
  If Check3.Value = 1 Then 
    If Trim(sql) = "" Then  ‘如果没有选择书名前的选项,则按作者名进行查询
      sql = "bookwriter='" & Trim(Text2.Text & " ") & "'"
    Else  ‘如果选择书名前的选项,也选择作者名前的选项则查询条件有两个,即书名、作者名,
      sql = sql & " and bookwriter='" & Trim(Text2.Text & " ") & "'"  ‘按书名、作者查询
    End If
  End If
 
  If Trim(sql) = "" Then
    MsgBox "请选择查询方式!", vbOKOnly + vbExclamation 
‘如果既没有按书名也没按作者名查询,则给出提示对话框
    Exit Sub
  End If
Adodc1.RecordSource = "select * from 图书表 where " & sql 
‘根据上面形成的查询条件,在数据库中执行SELECT语句,查询满足条件的记录
  Adodc1.Refresh 
  Set DataGrid1.DataSource = Adodc1  ‘将查询结果显示在DataGrid1控件中。
  DataGrid1.Refresh
  DataGrid1.AllowAddNew = False  ‘不允许直接在DataGrid1控件中添加、删除、修改记录
  DataGrid1.AllowDelete = False
  DataGrid1.AllowUpdate = False
End Sub
Private Sub Command2_Click()  ‘“取消”按钮的事件过程,退出
Unload Me
End Sub