目录
- 摘要
该课程设计题目为教学管理系统设计,具体要求如下:
- 设计教学管理系统,要求有基本资料管理,比如:读者、图书管理员、阅览室、书籍、书架、书籍分类、出版社、罚款单、系统管理员,书商等基础信息
- 基本功能:
角色1:读者
选课
查询图书
借书还书
角色2:图书管理员
角色3:采购员
角色4:系统管理员
数据备份
系统优化
死锁排除
- 借还书要求考虑到学期、时间、图书管理员、读者等信息
随着社会信息量的与日俱增,职场竞争的日趋激烈,越来越多的人更关注知识的积累、能力的培养。作为信息存储的主要媒体之一图书,数量、规模比以往任何时候都大的多,不论个人还是图书管理部门都需要使用方便而有效的方式来管理自己的书籍。
在计算机日益普及的今天,对个人而言若采用一套行之有效的图书管理系统来管理自己的书籍,会方便许多。对图书管理部门而言,以前单一的手工检索已不能满足人们的要求,为了便于图书资料的管理需要有效的图书管理软件。对于日益扩大的图书馆,查找特定的书目总是借阅者或工作人员劳神费力,有时还没有结果。因此往往是投入了大量的人力和财力却得不到高效的管理效率。为了缩短借阅者的等待时间,减轻工作人员的工作量,方便工作人员对它的操作,提高管理的质量和水平,做到高效、智能化管理.从而达到提高图书借阅信息管理效率的目的.采用数据库技术生成的图书馆借阅管理系统将会极大地方便借阅者并简化图书馆管理人员和工作人员的劳动,使工作人员从繁忙、复杂的工作进入到一个简单、高效的工作中。
其基本功能包括:
- 读者信息管理 2、图书管理员信息管理 3、借阅信息管理 4、图书信息管理
5、采购员信息管理 6、罚款信息管理 7、系统管理(图书管理系统管理员的功能)
三、主体
3.1需求分析
3.1.1 功能需求分析
图书馆管理系统开发。系统开发的总的设计目标是实现图书管理的系统化、规范化和自动化,实现对图书资料的集中统一的管理。用户是系统的最终使用者,开发系统的目的是让用户很方便使用系统,最终为用户带来各种便利。本系统主要实现对图书馆信息的管理,主要功能为管理有关读者、图书、借阅、查询、删除和管理员的信息等。本系统主要解决的问题是利用关键字对数据库进行查询。本系统的宗旨是提高图书管理工作的效率,减少相关人员的工作量,使学校的图书管理工作真正做到科学、合理的规划,系统、高效的实施。本系统应当包括读者、图书管理员、采购员、系统管理员四类用户,这四类用户对系统的需求简要概括如下。
- 读者用户需求描述:
(1)有关读者种类标准的制定、种类信息的输入、包括种类编号、种类名称、借书数量、借书期限等。
(2)读者有关信息的修改、查询等。
(3)读者基本信息的输入,包括读者编号、读者姓名、班级、院系等。
(4)读者基本信息的查询、修改
- 图书管理员需求描述:
(1)书籍信息的输入,包括书籍编号、书籍名称、书籍所属类别、作者、出版社、出版日期、在库数、价格
(2)借书信息包括借书证号、书籍编号、借出日期、拖欠日期、罚款种额
(3)图书管理书籍号、管理员编号、销书数量、销书日期。
- 采购员需求描述:
采购员对系统的主要功能需求是:了解图书的一些基本信息,例如:数量,价格。利用本系统完成采购图书和退换图书的功能。
- 系统管理员需求描述:
系统管理员有系统的最高权限,负责系统所需所有数据的动态同步更新以及管理维 护,根据系统针对各用户的设计,基本功能需求如下:
①数据备份需求:备份教学管理信息系统数据库 ②系统优化需求 ③死锁排除需求
3.1.2 数据需求分析
根据功能需求分析的结果,图书管理系统的数据需求分析如下。
(1)读者信息:包括读者号,密码,姓名,学院、专业,年级,电话号码,性别等。
(2)图书信息:包括图书号,ISBN号,书名,作者,价格等。
(3)管理员信息:包括帐号,密码,姓名,性别,职称,类型等。
(4)借阅信息:包括读者号,图书号,借阅时间,应归还时间,归还时间,借出图书
管理员编号,还出的图书管理员编号等。
(5)续借信息包括读者号,图书号,续借时间等。
(6)图书卡挂失信息:包括读者号,挂失时间,取消挂失时间等。
(7)图书挂失信息:包括读者号,图书号,挂失时间,取消挂失时间等。
(8)预约信息:包括读者号,图书号,预约时间等。
(9)罚款信息:包括图书管理员,读者号,图书号,罚款时间,罚款金额,罚款原因等。
(10)采购员信息:包括采购员编号,采购图书,图书数量,花费金额,退换图书名称,退换图书数量等。
3.2 概念设计
3.2.1 数据字典
(1)读者实体集
属性名 | 含义 | 类别 | 域及约束 |
ReaderID | 读者号 | 主码 | Int,不允许取空值 |
Password | 密码 | Int,不允许取空值 | |
ReaderName | 读者姓名 | nvarchar(20),不允许取空值 | |
Dept | 学院 | nvarchar(20) | |
Major | 专业 | nvarchar(20) | |
Grade | 年级 | Int | |
Telephone number | 电话号码 | Int,不允许取空值 | |
Sex | 性别 | char(2),取值范围:{‘男’,’女’} |
(2)图书实体集
属性名 | 含义 | 类别 | 域及约束 | |
BookID | 图书号 | 主码 | Int,不允许取空值 | |
BookName | 书名 | nvarchar(20),不允许取空值 | ||
ISBN | ISBN号 | Int,不允许取空值 | ||
Author | 作者 | nvarchar(20),不允许取空值 | ||
Price | 价格 | Int,不允许取空值 | ||
Type | 类型 | nvarchar(20),不允许取空值 |
(3)管理员实体集
属性名 | 含义 | 类别 | 域及约束 | |
MID | 管理员号 | 主键 | Int,不允许取空值 | |
Password | 密码 | Int,不允许取空值 | ||
Mname | 姓名 | nvarchar(20),不允许取空值 | ||
Msex | 性别 | char(2),取值范围:{‘男’,’女’} | ||
Type | 类型 | nvarchar(20),不允许取空值 |
(4)借阅实体集
属性名 | 含义 | 类别 | 域及约束 | |
ReaderID | 读者号 | 外键 | Int,不允许取空值 | |
BookID | 图书号 | 外键 | Int,不允许取空值 | |
BorrowTime | 借阅时间 | Datatime,不允许取空值 | ||
ReturnTime | 应归还时间 | Datatime |
(5)续借实体集
属性名 | 含义 | 类别 | 域及约束 | |
ReaderID | 读者号 | 外键 | Int,不允许取空值 | |
BookID | 图书号 | 外键 | Int,不允许取空值 | |
Retime | 续借时间 | Datatime,不允许取空值 |
(6)图书卡挂失实体集
属性名 | 含义 | 类别 | 域及约束 | |
ReaderID | 读者号 | 外键 | Int,不允许取空值 | |
LossTime | 挂失时间 | Datatime,不允许取空值 | ||
CancelTime | 取消挂失时间 | Datatime |
(7)图书挂失实体集
属性名 | 含义 | 类别 | 域及约束 | |
BookID | 图书号 | 外键 | Int,不允许取空值 | |
ReaderID | 读者号 | 外键 | Int,不允许取空值 | |
LossTime | 挂失时间 | Datatime,不允许取空值 | ||
CancelTime | 取消挂失时间 | Datatime |
(8)预约实体集
属性名 | 含义 | 类别 | 域及约束 | |
ReaderID | 读者号 | 外键 | Int,不允许取空值 | |
BookID | 图书号 | 外键 | Int,不允许取空值 | |
PreTime | 预约时间 | Datatime,不允许取空值 |
(9)罚款实体集
属性名 | 含义 | 类别 | 域及约束 | |
MID | 图书管理员 | 外键 | Int,不允许取空值 | |
ReaderID | 读者号 | 外键 | Int,不允许取空值 | |
BookID | 图书号 | 外键 | Int,不允许取空值 | |
Penalty time | 罚款时间 | Datatime,不允许取空值 | ||
Cost | 罚款金额 | Int,不允许取空值 | ||
Cause | 罚款原因 | nvarchar(20) |
(10)采购员实体集
属性名 | 含义 | 类别 | 域及约束 | |
BuyerID | 采购员编号 | 主键 | Int,不允许取空值 | |
BuyBook | 采购图书名称 | nvarchar(20),不允许取空值 | ||
BuyNum | 图书数量 | Int,不允许取空值 | ||
AllCost | 花费金额 | Int,不允许取空值 | ||
ReturnBook | 退换图书名称 | nvarchar(20),不允许取空值 | ||
ReturnNum | 退换图书数量 | Int,不允许取空值 |
3.2.2 ERD(实体关系图)
3.2.3 use case图
3.2.4 图书管理系统数据流程图(数据流图)
顶层数据流图:
第2层数据流图:(读者借阅,读者还书,读者查询,管理员查询,管理员修改)
第3层数据流图:(读者借阅)
第3层数据流图:(读者还书)
第3层数据流图:(查询图书信息,查询读者信息,查询借阅历史,查询罚款信息)
第3层数据流图:(管理员添加、删除、修改读者信息)
第3层数据流图:(管理员添加、删除、修改系统用户信息)
3.3 逻辑设计
3.3.1 E-R模型向关系模型的转换规则:
(1)实体类型的转换
将每个实体类型转换成一个关系模式,实体的属性即为关系的属性,实体标识符即为关系的键。
(2)联系类型的转换
①如实体间的联系是1:1
可以在两个实体类型转换成两个关系模式中的任意一个关系模式的属性中加入另一个关系模式的键和联系类型的属性。
②如实体间的联系是1:n
则在n端实体类型转换成的关系模式中加入1端实体类型转换成的关系模式的键和联系类型的属性。
③如实体间的联系是m:n
则将联系类型也转换成关系模式,其属性为两端实体类型的键加上联系类型的属性,而键为两端实体键的组合。
3.3.2 E-R图转换为如图所示的数据库关系表:
(1)读者表(reader)
(2)图书表(book)
(3)管理员表(administrator)
(4)借阅表( borrow)
(5)续借表(renew)
(6)图书卡挂失表(cardloss)
(7)图书挂失表(bookloss)
(8)预约表(bespeakingbook)
(9)罚款表(penalty)
(10)采购员表(buyer)
3.4 物理设计
数据库物理设计的任务是为上一阶段得到的数据库逻辑模型,即数据库的逻辑结构选择合适的应用环境的物理结构,既确定有效地实现逻辑结构模式的数据库储存,确定在物理设备上所采用的存储结构和存取方法,然后对该存储式进行性能评价、修改设计、经过多次反复,最后得到一个性能较好的存储模式。数据库物理设计内容包括记录存储结构的设计和存储路径的设计。
3.4.1 DDL语言
①建数据库:
create database Librarymanagementsystem
②建表:
create table reader(
ReaderID int primary key NOT NULL,
Password int NOT NULL,
ReaderName nvarchar(20) NOT NULL,
Dept nvarchar(20),
major nvarchar(20),
Grade int,
TelephoneNumber int NOT NULL,
Sex char(2) check(sex='男' or sex='女') null
)
create table book(
BookID int primary key NOT NULL,
BookName nvarchar(20) NOT NULL,
ISBN int NOT NULL,
Author nvarchar(20) NOT NULL,
Price int NOT NULL,
Type nvarchar(20) NOT NULL
)
create table administrator(
MID int primary key NOT NULL,
password int NOT NULL,
Mname nvarchar(20) NOT NULL,
Msex char(2) check(Msex='男' or Msex='女') null,
Type nvarchar(20) NOT NULL
)
create table borrow(
ReaderID int NOT NULL,
BookID int NOT NULL,
BorrowTime datetime NOT NULL,
ReturnTime datetime NOT NULL,
foreign key (ReaderID) references reader(ReaderID),
foreign key (BookID) references book(BookID),
primary key(ReaderID,BookID)
)
create table cardloss(
ReaderID int NOT NULL,
LossTime datetime NOT NULL,
CancelTime datetime,
foreign key (ReaderID) references reader(ReaderID),
primary key(ReaderID)
)
create table bookloss(
ReaderID int NOT NULL,
BookID int NOT NULL,
LossTime datetime NOT NULL,
CancelTime datetime,
foreign key (ReaderID) references reader(ReaderID),
foreign key (BookID) references book(BookID),
primary key(ReaderID,BookID)
)
create table bespeakingbook(
ReaderID int NOT NULL,
BookID int NOT NULL,
PreTime datetime NOT NULL,
foreign key (ReaderID) references reader(ReaderID),
foreign key (BookID) references book(BookID),
primary key(ReaderID,BookID)
)
create table penalty(
MID int NOT NULL,
ReaderID int NOT NULL,
BookID int NOT NULL,
PenaltyTime datetime NOT NULL,
Cost int not null,
Cause nvarchar(100),
foreign key (ReaderID) references reader(ReaderID),
foreign key (BookID) references book(BookID),
foreign key (MID) references administrator(MID),
primary key(ReaderID,BookID,MID)
)
create table buyer(
BuyerID int NOT NULL primary key,
BuyBook nvarchar(20) NOT NULL,
BuyNum int NOT NULL,
Allcost int NOT NULL,
ReturnBook nvarchar(20) NOT NULL,
ReturnNum int NOT NUll
)
3.4.2 重要的存储过程
- 数据录入
- 录入读者信息
create proc spInsertreader
@RID int,@Rname nvarchar(20)
as
if NOT EXISTS(select * from reader where ReaderID=@RID)
begin
insert into reader(ReaderID,ReaderName)
values(@RID,@Rname)
End
insert into reader(ReaderID,Password,Dept,Grade,major,TelephoneNumber,ReaderName)
values(20006,129899,'计算机学院',1,'计算机',12333333,'周元')
(2)录入图书信息
create proc spInsertbook
@BID int,@Bname nvarchar(20)
as
if NOT EXISTS(select * from book where BookID=@BID)
begin
insert into book(BookID,BookName)
values(@BID,@Bname)
end
insert into book(BookID,BookName,ISBN,Author,Price,Type)
values(30009,'线性代数',1234322,'我在想',12,'课内')
(3)录入管理员信息
create proc spInsertadministrator
@adID int,@adName varchar(20)
as
if NOT EXISTS(select * from administrator where MID=@adID)
begin
insert into administrator(MID,Mname)
values(@adID,@adName)
End
insert into administrator(MID,password,Mname,Msex,Type)
values(10002,368488,'歌莉娅','女','系统')
- 录入借阅信息
create proc spInsertbrrow
@RID int,@BID int
as
if NOT EXISTS(select * from brrow where BookID=@BID)
begin
insert into brrow(BookID,ReaderID)
values(@BID,@RID)
end
insert into borrow(ReaderID,BookID,BorrowTime,ReturnTime)
values(20001,30002,2022/1/4,2022/3/1)
- 录入续借信息
create proc spInsertrenew
@RID int,@BID int
as
if NOT EXISTS(select * from renew where ReaderID=@RID)
begin
insert into renew(BookID,ReaderID)
values(@BID,@RID)
End
insert into renew(ReaderID,BookID,RenewTime)
values(20001,30002,2023/1/6)
(6)录入图书卡挂失信息
create proc spInsertcardloss
@RID int
as
if NOT EXISTS(select * from cardloss where ReaderID=@RID)
begin
insert into cardloss(ReaderID)
values(@RID)
end
insert into cardloss(ReaderID,LossTime)
values(20002,2022/9/5)
(7)录入图书挂失信息
create proc spInsertbookloss
@RID int,@BID int
as
if NOT EXISTS(select * from bookloss where ReaderID=@RID)
begin
insert into bookloss(ReaderID,BookID)
values(@RID,@BID)
end
insert into bookloss(ReaderID,BookID,LossTime)
values(20003,30004,2022/1/8)
- 录入预约信息
create proc spInsertbespeakingbook
@RID int,@BID int
as
if NOT EXISTS(select * from bespeakingbook where ReaderID=@RID)
begin
insert into bespeakingbook(ReaderID,BookID)
values(@RID,@BID)
End
insert into bespeakingbook(ReaderID,BookID,PreTime)
values(20002,30004,2022/6/24)
- 录入罚款信息
create proc spInsertpenalty
@RID int,@BID int
as
if NOT EXISTS(select * from penalty where ReaderID=@RID)
begin
insert into penalty(ReaderID,BookID)
values(@RID,@BID)
End
insert into penalty(MID,ReaderID,BookID,PenaltyTime,Cost,Cause)
values(10001,20003,30005,2022/9/16,10,'挂失')
(10)录入采购员信息
create proc spInsertbuyer
@BuID int,@Bname nvarchar(20)
as
if NOT EXISTS(select *from buyer where BuyerID=@BuID)
begin
insert into buyer(BuyerID,BuyBook)
values(@BuID,@Bname)
End
- 查询
(1)图书管理员查询读者信息
select *from reader
(2)读者查询信息
select *from reader
where ReaderID=20001;
(3)查询借阅信息
select *from borrow
(4)读者查询借阅信息
select *from borrow
where ReaderID=20001
(5)采购员查询信息
select * from buyer
(6)查询续借信息
select * from renew
(7)查询图书卡挂失信息
select *from cardloss
- 查询图书挂失信息
select *from bookloss
- 查询预约信息
select *from bespeakingbook
- 查询罚款信息
select *from penalty
四、结论及讨论
4.1结论
1.这次课程设计使我熟悉了系统设计的整体步骤。系统设计大体可分为需求分析、概念
设计、逻辑设计、物理设计、数据库的实施及调试测试六大步骤。其中,让我感触最深的是需求分析阶段,在这个阶段,必须对所要设计的系统有总体的构思和了解,知道自己要做什么,要实现什么,并且要实际的进行相关的调查,不能凭想象或自己的了解,这样会在后续的工作中遇到很多的问题。
2.这次课程设计加深了我对数据库系统概论相关知识和SQL SERVER相关功能的理解。例如对建立基本表、视图、索引、存储过程、触发器等,都比以前更加的熟练。并在解决遇到的各种问题的过程中,学到了很多新的知识。比如在导入\导出数据时,由于外键约束的存在,经常会出现错误,这就要注意各个表导入的顺序问题。一般是先导入主键表,后导入外键表,这样可以避免很多的错误。
3.我进一步掌握了相关的SQL语句方面的知识。不但纠正了以前的错误认识和理解,而且学会了建立存储过程和触发器。通过查阅资料,我还明白了存储过程是编译后放在服务器端的程序,它可以被别的模块调用,且不需要重新编译,这样就大大减轻了客户端的负担,且有效的提高了系统执行的效率。
4.2 讨论
- 问题1:同一本书,可不可以在同一个时间被借用使用?
答:不能。
- 问题2:同一个学生,可以在图书管理系统上借阅多本书么?
答:可以,但有数量限制,不能超过规定的数量。
- 问题3:学生如何查看自己的借阅信息?
答:登入图书管理系统,输入个人学号查看。
- 问题4:如何优化设计的表之间存在的数据冗余和数据冲突的问题?
答:检验并使表设计符合第一范式(①表的字段都是单一属性的,不可再分;②每一行的记录都是没有重复的;③存在主属性,而且所有的属性都是依赖于主属性;④所有的主属性都已经定义),第二范式(不存在非主键间的部分依赖)以及第三范式(不存在非主键间的传递依赖)等。
- 问题5:管理员如何进行死锁优化?
ps:死锁的四个必要条件:请求和保持、互斥、不可剥夺、循环等待。
答:常用的办法是进行按序申请资源。但是条件苛刻的情况下,为了更快的整体运行速度,可以允许一部分进程预先使用序号大的资源。这时的处理方式是:不可剥夺变为可剥夺。因为不可剥夺变成可剥夺,允许死锁出现,更多的进程可以无等待推进,直到出现死锁才由系统来解决。所以需要死锁检测,找到造成死锁的进程,然后对造成死锁的进程进行死锁状态回滚并暂停其运行,等预判其运行不会造成死锁时再重新申请执行。
这里一共要做四件事:
- 死锁检测:①使用操作系统API对应提供的工具
- 进程状态回滚并暂停其运行
- 预判死锁
- 重新执行
死锁检测之后,释放关键资源,暂停进程。直接调用suspend有关的api即可。等待一段时间之后,再次执行申请关键资源之后,再执行死锁检测。直到不会死锁可以运行该进程为止。