资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
数据库设计与管理
课程设计报告
题目: 图书借阅管理系统
专 业:
班 级:
姓 名:
学 号:
指导教师:
学 期:
目录
一、 概述
1、 本课程设计的题目…………………………………………………………… 2
2、 小组成员……………………………………………………………………… 2
3、 个人分工……………………………………………………………………… 2
4、 本人贡献……………………………………………………………………… 2
( 1) 建表………………………………………………………………………… 2
( 2) 表的数据维护……………………………………………………………… 2
( 3) 数据完整性………………………………………………………………… 3
( 4) 数据查询…………………………………………………………………… 3
二、 需求分析
1、 数据需求……………………………………………………………………… 3
2、 事物需求……………………………………………………………………… 4
3、 系统需求分析结果…………………………………………………………… 4
三、 数据库概念结构设计
( 图书借阅管理系统E-R图) ………………………………………………… 5
四、 数据库逻辑结构设计
学生借阅图书表bookborrow………………………………………………… 6
学生归还图书表bookreturn………………………………………………… 6
五、 数据库物理实现
1、 学生借阅图书时各种异常情况下操作的结果…………………………… 7
2、 学生正常借阅图书时操作………………………………………………… 7
3、 学生续借图书……………………………………………………………… 9
4、 学生还书……………………………………………………………………… 10
5、 查询一段时间之内各类未归还图书的在借次数…………………………… 12
六、 心得体会
一、 概述
1、 本课程设计的题目是: 《图书借阅管理系统》。
2、 小组成员有: 于菲菲、 吴维、 王菲菲。
3、 个人分工: 于菲菲负责student表, 吴维负责bookborrow和
bookreturn表, 王菲菲负责bookinfo表和bookclass表。
4、 本人贡献:
( 1) 建立学生借阅图书信息表( bookborrow) 和学生归还图书信息表(bookreturn):
根据图书借阅管理信息的需要, 除了需要保存学生信息的学生信息表, 保存图书信息的图书信息表、 类别表之外, 在学生借阅图书时, 为了准确记录借阅、 归还的学生号、 图书编号、 时间, 还必须创立一个借阅表, 为了简化借阅信息的查询, 直接显示未归还和已归还的图书借阅, 我分别创立了学生借阅图书信息表( bookborrow) 和学生归还图书信息表(bookreturn), 学生借阅图书信息表用来存储借书学生的学号、 所借图书的图书编号、 借书时间、 应归还日期、 续借次数, 学生归还图书信息表用来存储还书学生的学号、 所还图书的图书编号、 还书时间、 超期罚款金额。
( 2) 表的数据维护:
a. bookborrow表数据插入: bookborrow表中借书学生的学号、 所借图书的图书编号、 借书时间、 应归还日期都是由借书存储过程insert_bookborrow_1来插入的, 借书学生的学号、 所借图书的图书编号由存储过程的参数设定, 借书时间则是利用系统函数getdate()获取当天时间来赋值, 规定学生一次性借书时间不能超过一个月, 因此应归还日期在借书日期的基础上加一个月。
b. bookborrow表数据更新: 续借次数则涉及到续借存储过程, 续借时首先根据续借当天日期和bookborrow表中的应归还日期判断是否超过一次性借书时间限制, 超过应归还日期则不能续借, 在没有超过续借日期的前提下, 还对学生可续借次数进行了限制, 超过次数限制的话, 依然无法续借, 若满足以上两个续借条件, 此次续借可正常进行, 而且更新bookborrow表中的结束日期为此次续借日期, 续借次数自加1。
c. bookreturn表数据插入、 bookborrow表数据删除: 在学生归还图书时, 先根据bookborrow表的记录判断还书输入参数信息是否存在, 若不存在则表明没有对应的借书行为, 不能进行还书的操作。bookreturn表中还书学生的学号、 所还图书的图书编号、 还书时间、 超期罚款金额都是由还书存储过程returnbook来插入的, 还书书学生的学号、 所借图书的图书编号由存储过程的参数设定, 还书时间利用系统函数getdate()获取当天时间来赋值。根据bookborrow中的应归还日期来判断归还图书时是否超过还书期限, 若超期, 则按超期天数内每天0.1元来计算超期罚款金额, 并将其插入bookreturn表中对应的超期罚款金额列。还书成功的同时删除bookborrow表中对应的借书记录。
(3)数据完整性:
a.使用默认约束实施数据完整性, 为了实现续借次数的自加, 为bookborrow表的续借次数列定义了一个默认约束, 在学生借书时, 没有指定该列的值, 使用默认值”0”。
b.使用外键约束实施数据完整性: 因为bookborrow表中的学生学号必须是学生信息表中已经注册过的学生号, 图书编号也必须是图书信息表中存在的图书号。因此为bookborrow表的学生学号和图书编号两列分别定义外键约束来实施数据完整性。从而限定了bookborrow表中这两列的取值范围, 并设置打开级联更新, 关闭级联删除。设置级联更新的作用是, 在图书信息表和学生信息表相应的信息改变, 不需要再对bookborrow表的对应列一一修改, 学生学号和图书编号自动修改为新值。关闭级联删除的作用是, 若某学生成功借出了某本书后, 要想删除这个学生或者本书的信息, 在bookborrow表中还存在相应记录的情况下( 即学生还未还书, 还没有删除bookborrow中的借书记录) , 则无法操作成功, SQL Server将报错, 并回滚该删除操作。
( 4) 数据查询: 将学生借阅图书信息和学生归还图书信息分开存储, 这样的设计思想能够简化很多查询操作。对图书管理最重要的部分莫过于管理未归还图书, 还书同学的相应借书记录都直接从bookborrow表中删除, 这样的话, bookborrow表就能直接显示为归还的学生、 图书信息。查询一段时间之内各类未归还图书的在借次数时, 输入两个时间点, 对图书类别表、 图书信息表、 bookborrow表进行内连接查询, 统计借书时间在两个时间点之内的查询结果行数, 即可轻松查阅一段时间之内各类未归还图书的在借次数。
经过以上表和功能的各种设计, 最终形成的学生借阅图书信息表( bookborrow) 和学生归还图书信息表(bookreturn)不但能系统的记录记录每次发生的借阅事件, 还书事件, 轻松实现借书、 续借、 还书的操作, 而且对于各种限制约束也全面考虑, 维护数据完整性, 并给出各种提示信息, 从而实现人性化的操作界面。
二、 需求分析
1、 数据需求
图书馆图书管理系统需要完成功能主要有:
( 1) 学生基本信息的输入, 包括学生学号、 学生姓名、 学生性别等。
( 2) 学生基本信息的查询、 修改, 包括学生学号、 学生姓名、 学生性别等。
( 3) 图书类别标准的制定、 类别信息的输入, 包括图书分类号、 类别名称。
( 4) 图书类别信息的查询、 修改, 包括图书分类号、 类别名称。
( 5) 图书信息的输入, 包括图书编号、 图书名称、 作者姓名、 出版社名称、 出版日期、 定价、 图书总量、 图书余量。
( 6) 图书信息的查询、 修改, 包括图书编号、 图书名称、 作者姓名、 出版社名称、 出版日期、 定价、 图书总量、 图书余量。
( 7) 学生借书信息的输入, 包括学生学号、 学生姓名、 图书名称、 借书日期。
( 8) 学生借书信息的查询、 修改, 包括学生学号、 学生姓名、 图书编号、 图书名称、 借书日期、 应归还日期等。
( 9) 学生续借信息的输入, 包括学生学号、 图书编号、 借书日期。
( 10) 学生续借信息的查询、 修改, 包括学生学号、 图书编号、 借书日期。( 11) 学生还书信息的输入, 包括学生学号、 图书编号、 还书日期。
( 12) 学生还书信息的查询、 修改, 包括还书学生学号、 学生姓名、 图书编号、 图书名称、 借书日期、 还书日期等。
( 13) 超期还书罚款输入, 还书超出期限包括超出期限还书的学生学号、 图书编号、 罚款金额、 还书日期。
( 14) 超期还书罚款查询、 修改、 删除, 包括学生学号、 学生姓名、 图书编号、 图书名称、 罚款金额等。
2、 事物需求
( 1) 在学生信息管理部分,要求:
a.能够查询学生信息。
b.能够对学生信息进行添加及删除的操作。
( 2) 在图书信息管理部分,要求:
a.能够浏览图书信息。
b.能够对图书信息进行维护,包括添加及删除的操作。
( 3) 在借阅信息管理部分,要求:
a.能够浏览借阅信息。
b.能够对借阅信息进行维护操作。
( 4) 在续借信息管理部分, 要求:
a.能够记录续借信息。
b.能够对借阅信息进行维护操作。
( 5) 在归还信息管理部分, 要求:
a.能够浏览归还信息。
b.对归还信息可修改维护操作。
( 6) 在罚款信息管理部分,要求:
a.能够浏览罚款信息。
b.对罚款信息能够更新。
3、 系统需求分析结果
学生从图书馆频繁借书、 还书是一种经常性的行为, 基于以上对问题的分析, 利用计算机代替传统人工给我们提供信息, 及时地调整学校图书馆图书结构, 而且对学生们的借阅过程形成一整套动态的管理就十分必要了。
学校图书馆规模相对于商业图书馆小, 但要有着完善的图书信息, 对每一册书要有详细的记录信息, 功能上对系统的需求是全面的。因此对用户的需求可分为四个方面: 一方面是图书馆工作人员经过计算机来管理各类图书, 分类编号, 调整图书结构, 增加图书库存, 适应学生的需求; 二方面是学生们能经过计算机来查询浏览图书馆中的图书, 来确定自己需要的书籍, 为借阅做好准备; 三方面是工作人员对学生们的借书证发放; 四方面也是图书馆的核心工作, 对图书的借阅管理。这四个方面形成了学校图书馆一个工作整体, 采用计算机自动化信息处理, 可方便快捷地共享信息、 交流信息, 高效地协同工作。
三、 数据库概念结构设计
本图书馆管理系统根据实际需求创立如下五个数据表: bookinf( 图书信息表) , bookclass( 图书类别表) , student( 学生信息表) , bookborrow( 学生借阅图书信息表) , bookreturn( 学生还书信息表) 。这些数据表能够单独存储学生、 图书的信息, 再结合它们之间的相互关系, 相互操作即实现了普通图书馆的三大基本功能: 即学生借阅图书、 学生续借图书、 学生归还图书。
图书借阅管理系统E-R图:
图书编号
出版日期
定价
书名
作者
图书总量
图书
m
图书余量
出版社
罚金
归还日期
学生借阅
借阅日期
续借次数
n
年龄
电话
性别
姓名
学号
学生
E-mail
学院
专业
班级
四、 数据库逻辑结构设计
由于概念设计的结果是E-R图, DBMS一般采用关系模型, 因此数据库的逻辑设计过程就是把ER图转化为关系模式的过程。由于关系模型所具有的优点, 逻辑设计能够充分运用关系数据库规范化理论, 使设计过程形式化地进行。设计结果是一组关系模式的定义。将E-R图转化成关系模型, 转化的关系模式进行优化, 最终达到第三范式。
将E-R图转化为关系模式:
(1)bookinfo
( book_id,book_name,book_author,book_press,pressdate,price,booktotal,bookremain)
(2)student( student_id,name,sex,age,department,major,class,birth_date,tel ephone,E-mail)
(3)bookclass
( book_id,bookclass_id,bookcategory)
(4)bookborrow
( book_id,student_id,borrownum,borrowdate,rreturndate,
newdate ,reborrowdate)
(5)bookreturn
( book_id,student_id,returndate,fine)
学生借阅图书表bookborrow
字段名称 数据类型 长度 约束 属性
book_id char 10 外键
student_id char 10 外键
borrowdate datetime 8 非主属性
rreturndate datetime 8 非主属性
reborrowtimes int 4 非主属性
学生归还图书表bookreturn
字段名称 数据类型 长度 约束 属性
book_id char 10 外键
student_id char 10 外键
returndate datetime 8 非主属性
fine money 8 非主属性
五、 数据库物理实现
1、 学生借阅图书时各种异常情况下操作的结果
( 1) 创立插入学生借阅图书信息触发器, 能够实现对学生信息和图书信息的限制, 借书时输入的学生学号和图书编号必须是学生信息表、 图书信息表中已经存在的, 否则给出相应提示'该图书号不存在'或'该学生号不存在'。
create trigger tr_insert on bookborrow
for insert as
declare @book_id char(10),@student_id char(10)
select @book_id=inserted.book_id,@student_id=inserted.student_id
from inserted
if @book_id not in (select book_id from bookinfo)
begin print ('该图书号不存在')
rollback transaction end
else if @student_id not in (select student_id from student)
begin print ('该学生号不存在')
rollback transaction end
( 2) 执行插入学生借阅图书信息存储过程, 输入一个学生信息表中不存在的学生学号, 执行结果如下图所示:
exec insert_bookborrow_1 'B003',' 1046'
( 3) 执行插入学生借阅图书信息存储过程, 输入一个图书信息表中不存在的图书编号, 执行结果如下图所示:
exec insert_bookborrow_1 'a003',' 1043'
2、 学生正常借阅图书时操作
( 1) 创立学生借阅图书存储过程, 先查询图书借阅信息表bookborrow是否存在相同的学号和图书号, 判断该学生是否已经借阅此书或是有没有归还。若是存在相同学号和图书编号的记录, 表明此学生已经借阅同一本书, 则无法进行此次借阅操作, 并给出提示信息。若学生没有借阅此书或是已经归还, 将把此次操作的信息存入学生借阅图书信息表, 并提示学生成功借书信息。
CREATE PROCEDURE [insert_bookborrow_1]
@book_id [char](10),
@student_id [char](10)
AS
if exists(select * from bookborrow
where student_id=@student_id and book_id=@book_id)
begin
print'对不起, 此同学已经借阅了同一本图书, 故而无法进行此次借书操作, 请核实! '
end
else
begin
INSERT INTO [book].[dbo].[bookborrow]
( [book_id],
[student_id],
[borrowdate],
[rreturndate])
VALUES
( @book_id,
@student_id,
getdate() ,
dateadd(mm,1,getdate()))
declare @name varchar(8),@book_name varchar(20),
@学生借书成功信息 varchar(200)
select @name=name from student where student_id =@student_id
select @book_name= book_name from bookinfo where book_id=@book_id
select @学生借书成功信息='学号为 '+@student_id+', 姓名为 '+@name+'的学生, 于 '+datename(year,GETDATE())+' 年 '+datename(month,GETDATE())+' 月 '+datename(day,GETDATE())+' 日
'+datename(hour,GETDATE())+' 时 '+datename(minute,GETDATE())+' 分 '+datename(second,GETDATE())+' 秒, 成功地从图书馆借出《'+@book_name+'》一书! '
select @学生借书成功信息 as 学生借书成功信息
end
GO
( 2) 执行插入学生借阅图书信息存储过程, 输入学生借阅图书信息已经存在的图书编号和学生号, 执行结果如下图所示:
exec insert_bookborrow_1 'TP001',' 1066'
( 3) 执行插入学生借阅图书信息存储过程, 输入学生借阅图书信息不存在的图书编号或学生号, 执行结果如下图所示:
exec insert_bookborrow_1 'I007',' 1077'
学生借阅图书信息bookborrow表借书之前:
学生借阅图书信息bookborrow表成功借书之后:
3、 学生续借图书
( 1) 创立续借存储过程, 续借时先找到bookborrow表相应的记录, 根据借书应归还时间判断续借的书是否已经超期, 若已经超过还书日期, 则不能续借。若没有超过一次借书应归还时间, 还要根据bookborrow表中续借次数来判断续借是否已经超过续借次数3次, 若已经超过3次, 则无法再续借。若以上条件都满足, 则更新bookborrow表, 使借阅时间更新为当前续借时间, 续借次数自加1, 并给出续借成功提示信息。
create procedure reborrow @student_id char(10),@book_id char(10)
as
declare @reborrowdate datetime,@rreturndate datetime
set @reborrowdate=getdate()
set @rreturndate=(select rreturndate from bookborrow
where student_id=@student_id and book_id=@book_id)
if @reborrowdate>@rreturndate
print '已经超过还书日期, 不能续借! '
else
if (select reborrowtimes from bookborrow
where student_id=@student_id and book_id=@book_id)>3
print '已经超过续借限制次数, 不能续借! '
else
begin
update bookborrow
set borrowdate=@reborrowdate,reborrowtimes=reborrowtimes+1
where student_id=@student_id and book_id=@book_id
print '续借成功'
end
( 2) 执行续借, 输入满足条件的续借信息, 即续借当天时间未超过应归还日期, 续借次数也未超过续借次数限制, 执行结果如下:
exec reborrow ' 1066','TP001'
学生借阅图书信息bookborrow表续借之前相应记录:
学生借阅图书信息bookborrow表续借之后相应记录:
( 3) 将以上续借连续操作多次, 即借阅已经超过续借次数的图书, 执行结果如下:
4、 学生还书
( 1) 创立学生还书存储过程, 先查询图书借阅信息表bookborrow是否存在相同的学号和图书号, 判断该学生是否借阅过此书。若是不存在相同学号和图书编号的记录, 表明此学生没有借阅这本书, 则无法进行此次还书操作, 并给出提示信息。若学生借阅过此书, 还要根据借书应归还时间判断续借的书是否已经超期, 若已经超过还书日期, 则按超期天数内每天0.1元来计算超期罚款金额, 并将其插入bookreturn表中对应的超期罚款金额列。若没有超过一次借书应归还时间, 则不必插入超期罚款金额列。还书成功, 将此次操作的还书信息插入学生还书信息表bookreturn, 同时删除bookborrow表中对应的借书记录, 并提示学生成功还书信息。
create procedure returnbook
@student_id char(10),@book_id char(10)
as
declare @book_name char(20),@rreturndate datetime
begin
if not exists(select * from bookborrow
where student_id=@student_id and book_id=@book_id)
begin
print'对不起, 你没有借阅此书, 故而无法进行此次还书操作, 请核实! ’
end
else
select @rreturndate=rreturndate from bookborrow
where book_id=@book_id and student_id=@student_id
if
datediff(dd,@rreturndate,getdate())>0
begin
insert into [book].[dbo].[bookreturn]
( [book_id],
[student_id],
[returndate],
[fine])
VALUES
( @book_id,
@student_id,
getdate(),
datediff(dd, @rreturndate,getdate())*0.1 )
end
else
begin
INSERT INTO [book].[dbo].[bookreturn]
( [book_id],
[student_id],
[returndate])
VALUES
( @book_id,
@student_id,
getdate() )
declare @name char(8),@学生还书成功信息 varchar(200)
select @name=[name] from student
where student_id=@student_id
select @book_name=book_name from bookinfo
where book_id=@book_id
select @学生还书成功信息='学号为 '+@student_id+', 姓名为 '+@name+'的学生于 '+datename(year,GETDATE())+' 年 '+datename(month,GETDATE())+' 月 '+datename(day,GETDATE())+' 日
'+datename(hour,GETDATE())+' 时 '+datename(minute,GETDATE())+' 分 '+datename(second,GETDATE())+' 秒, 成功地向图书馆归还《'+@book_name+'》一书! '
select @学生还书成功信息 as 学生还书成功信息
end
delete from bookborrow
where student_id=@student_id and book_id=@book_id
end
go
( 2) 执行还书存储过程, 输入满足条件的还书信息, 即输入已经借阅的书, 执行结果如下:
exec returnbook ' 1066','TP001'
学生借阅图书信息bookborrow表还书之前相应记录:
bookborrow
学生还书信息bookreturn表还书之前相应记录:
学生借阅图书信息bookborrow表还书之后相应记录:
学生还书信息bookreturn表还书之后相应记录:
5、 查询一段时间之内各类未归还图书的在借次数
( 1) 创立一段时间内各类图书的在借次数的存储过程, 输入两个时间点, 对图书类别表、 图书信息表、 bookborrow表进行内连接查询, 统计借书时间在两个时间点之内的查询结果行数, 即可轻松查阅一段时间之内各类未归还图书的在借次数。
create procedure class_cj @cssj datetime,@jssj datetime
as
select bookclass.bookcategory,count(*) as 次数from student
inner join bookborrow on student.student_id=bookborrow.student_id
inner join bookinfo on bookinfo.book_id=bookborrow.book_id
inner join bookclass on bookclass.book_id=bookinfo.book_id
where bookborrow.borrowdate>=@cssj and @jssj>=bookborrow.borrowdate
group by bookclass.bookcategory,bookinfo.book_id
( 2) 查询一段时间各类图书的在借次数。
exec class_cj ' -12-29',' -12-30'
六、 心得体会
从开始的课程设计选题, 系统设计, 物理实现, 到最终的写课程设计报告, 都融入了我和同伴的不懈努力。命题时间很仓促, 鉴于所学知识的有限, 实际操作技术的不成熟, 我们小组选择了”图书借阅管理系统”, 因为能够参考老师平时所举的例子。我们三个分别建表时, 出现了很多的不统一( 字段命名习惯不一样, 字段名含义模糊, 类型长度不一致) , 但开始并没有引起足够重视, 随着代码的编写和执行, 发现很多地方都不符合代码设计的要求, 我们不得不对数据库的表结构不断修改, 这严重阻碍了我们的进度。因此就像老师说的分开建表一方面能够加快进度, 可是如果没有详细准确的逻辑结构设计, 造成表结构混乱, 表关系不明确, 反而会带来很多长远的影响, 使系统没法顺利进行下去。在物理实现过程中, 我们综合运用平时课上学习的表数据维护, 数据完整性约束, 存储过程, 触发器等知识不断对”图书借阅管理系统”的功能进行优化、 完善。使数据插入、 更新、 删除、 查询时人的工作量尽量降低, 也就是使人机合理分工, 并使这些数据能够具有相关性、 完整性, 提高数据输入、 存储的速度和准确度。在运行程序结果的处理上, 我们尽量显示出人性化的提示信息, 以提示操作人员操作成功与否, 不成功的原因又是什么, 也就是实现人机界面的人性化。
经过本次课程设计我学会了信息管理系统从分析、 设计到物理实现一系列过程中的各种步骤: 先思考自己做的这个系统要达到一个什么样的效果, 为人们解决什么问题。进而根据分析结果考虑要为系统设置一些什么功能, 然后由这些功能来确定需要支持实现功能的各个表, 每个表存储哪些内容, 表之间又有那些联系, 这些初步的准备工作和系统构造完成后就能够开始进入编写代码阶段了, 代码编过程中要不断的根据具体情况及时对自己的代码功能进行改进和完善。与此同时数据库系统设计过程中难免会遇到各种各样的困难, 经过与老师同学不断的探讨, 让我能够综合更加灵活熟练的将所学的关系数据库原理知识运用到实际的信息管理系统实现中。只有这样在实际操作过程中不被所面临的困难打击信心, 在平时的积累和锻炼下最终熟练掌握数据管理各类知识, 才能够在计算机这个领域走的更远。短暂而紧促的课程设计接近尾声, 经过这次的锻炼, 我增加了数据库学习的信心, 对程序设计更充满期待。
展开阅读全文