关于书籍管理系统数据库课程设计
系统概述
该系统用以收集、存储书籍信息、人员(读者、图书管理员)信息、图书借阅信息以及意外处理信息,并及时记录存储各个环节信息的变更,以便管理、查询、显示、输出,以节约大量的人力物力,有力保障图书馆日常事务的高效运作。
需求分析与概念结构设计
系统要求提出:图书馆是一家所有工作手工操作的图书管理,随着计算机的发展,更多的图书馆采用计算机图书管理系统来实现,这样可以得到更好的管理。设计一从采购编目一流通管理体化的图书馆系统。
主要表现:
-
采购,对新书的目录,要查存,判断图书馆是不是已经订过了,要人工查阅帐本完成,是很麻烦的事。
-
验证,要填写两个帐本和盖章,而且在帐本上面很多信息是重复的。
3.编书码,通过手工对书编码,对不同种类的书都要查找书是否已有,如果没有话对新的书进行查阅中图法宝典来要编码,并且在查询该图书时还需判断是否被借走等。
4.流通,在借书的时候通过注册填写学号和自设密码借书:在还书的时候工作人员先要花一定时间确认被借书的完好和完整性,如若损坏,需要求借书者采取相应的补偿措施。
5.统计书的阅读次数、当天的借还数目等很多统计信息。
系统总体需求:
通过调研了解到:
1)图书馆希望能够把刚购新的书籍编目并且不重复,且编码信息需反应书的一定信息,并可以快速查找书籍
- 图书馆希望能够用计算机进行各种快速查找。
- 图书馆希望使用条码枪来实现图书的借还书籍。
- 图书馆希望通过能统计大量的以前无法统计的数据,方便管理。
对系统的要求:
图书馆提出的要求,结合我们的技术建议再加以考虑,产生了该管理信息系统
的功能要求:
1)、收集、存储书籍信息
2)储存意外处理信息
3)、储存人员(读者、图书管理员)信息
4)、储存图书借阅信息
逻辑结构设计
E-R图及逻辑结构分析
借还书系统:
意外处理系统:
书籍系统:
图书管理员系统:
图书管理系统总体E-R图:
ER图分析
E-R图主要有书籍、图书管理员、读者三个实体。
其中书籍有书籍编号、书名、作者、类别、书架号(即该书籍所存放的地方)、出版社、在库状态这几个属性。书籍编号具有唯一性,我们可以根据书籍编号直接找到对应的书籍,以及该书籍的在库状态。图书管理员设有账号、密码、姓名以及联系方式这四个属性。每个账号有其相应的密码。图书管理员用账号密码登录后,拥有读取和修改书籍信息的权利。显然,书籍与图书管理员之间是多对多的联系,这点可从图中看出。
对于每一个读者,他们都有自己的学号与密码。用读者的账号密码登录,可以查看存书信息但不能修改书籍信息,这确保了数据库的安全性。除账号密码外,读者还有姓名、联系方式。
读者借书、还书、意外处理等操作需要再建立相应的表去储存借/还书和意外处理的信息。借书的时候需要明确记录读者所借书籍的编号、借书读者的编号、借书日期和应该还书的日期,实际归还的日期。还书时,同样要记录下读者所还书籍编号、还书读者的编号、还书日期。若是出现超过应该还书的日期还未归还图书,或者图书损坏、丢失等情况,意外处理机制就开始发挥作用了。
意外处理的记录中,应记录好借书读者的编号、发生意外的图书编号、意外类别和所对应的处理方法。以便图书管理员更好地管理图书。
设计表:
Book表:
Borrow表:
Accident表:
Manager表:
Reader表:
关系的码已用下划线标出。
1.书籍(书籍编号,书名,作者,类别,书架号,出版社,在库状态)
2.读者(学号,密码,姓名,联系方式)
3.图书管理员(账号,密码,姓名,联系方式)
4.借书管理(书籍编号,学号,借阅日期,应还日期,还书日期)
“学号” 是外码,被参照表是 “读者” 表
“书籍编号” 是外码,被参照表是 “书籍” 表
5.意外处理(书籍编号,学号,意外类别,处理方法)
“学号” 是外码,被参照表是 “读者” 表
“书籍编号” 是外码,被参照表是 “书籍” 表
物理结构设计
以下均是由MySQL数据库实现
插入数据:
Book表:
(1) 为书名设计索引(升序):
create index index_name on book(b_name asc);
(2) 为书架设计索引(升序)
create index index_brn on book(b_brn asc);
reader表:
(1)为读者姓名设计一个索引(降序):
alter table reader add index index_name(r_name desc);
borrow表:
(1) 为outday设计索引(升序)
create index index_outday on borrow(outday asc);
(2) 为r_inday设计索引(升序)
create index index_rinday on borrow(r_inday asc);
accident表:
(1) 为r_num创建索引(升序):
create index index_rnum on accident(r_num asc);
(2) 为b_no创建索引(升序):
create index index_bnum on accident(b_no asc);
索引说明:创建索引以便查找,为book表创建让书籍名字升序排列即可快速查看书籍的信息,同样的书籍编号也是如此;reader表中为读者姓名创建索引让寻找指定名字的学生更加快捷,同样的可以根据需求设计读者编号为索引;为borrow表设计索引,让outday降序排列,可以知道最近的借书情况,让r_inday降序排列可以知道最近的换书情况,以便图书管理员管理。
设计视图
(1) 在book,borrow,reader表创建全面信息视图reader_borrow
create view reader_borrow as
select reader.r_num, reader.r_name, book.book_no, book.book_name, book.book_name,borrow.outday
from student, book, borrow
where reader.r_num = borrow.r_num and book.b_no = borrow.b_no;
(2) 在book和accident表中创建视图,查询受过意外处理的书籍并显示读者
create view book_acc as
select book.b_no,book.b_name,accident.acc,accident.deal,reader.r_num,reader.r_name,reader.r_phone
from reader,book,accident
where reader.r_num = accident.r_num and book.b_no = accident.b_no;
(3) 在book和borrow表中创建视图,查询所有借书的人和对应借书的书号和名字
create view readerbo as
select reader.r_num,reader.r_name,borrow.b_no,book.b_name
from reader, book, borrow
where reader.r_num = borrow.r_num and book.b_no = borrow.b_no;
设计触发器
设计一个触发器,一旦borrow表中插入一组元素(即有读者借到了相应的书)就把book表(那本借到的书)中的书籍在库状态改为no
create trigger borrowjud
after insert on borrow
for each row
begin
update book set b_jud = 'no'
where book.b_no = new.b_no;
end
以下为功能显示:
未借书前书库水浒传的在库状态是yes:
当borrow表中新建一个元素后:
执行
insert into borrow VALUES('1103','20170205',"2020-11-19","2020-12-19",null)
borrow表变为
再看book表中属性改变:
触发器功能完成
(2)设计一个触发器,当borrow表中的实际归还日期被更新为非空时,那么就将book表中的b_jud字段给为yes(在库)
create trigger setyes
after UPDATE on borrow
for each row
begin
if new.r_inday is not null then
update book set b_jud ='yes'
where book.b_no = old.b_no;
end if;
end;
以下是setyes触发器的功能显示:
Borrow表中未更新前,被选择的1103书籍的实际归还日期为null(未归还)
Book表中的书籍显示不在库
当更新1103的数据r_inday为非空时
再看book表中的在库状态为yes
触发器功能完成
存在的问题和设想建议: 解决了数据的存储问题,对表的拆分,尽量的减少了冗余的数据,表级索引的设计,让查询更加方便。但是还存在问题;
(1) 统计同一作者的书或者同一出版社的书时,需要对book表进行全表检索,如果数据较多,需要耗费较长的时间,可以对表进行进一步的拆分或者新建一个表出来,统计同属性的书籍数量。
(2) 可以添加一个诚信管理表,对所有有借书记录的读者进行分类,然后划分等级,如果诚信等级太低,不提供借书服务,读者每次归还书籍时书籍发生损坏或者丢失会降低诚信等级,对逾期未还的读者也会降低诚信等级。
(3) 可以添加一个触发器,每一天完全检索borrow表,将当日的时间与应还的时间做比较,如果当日的时间在应还日期之后,则记录下这本书的编号和所借的读者编号,做逾期出处理,并提醒管理员与读者联系
对于第一个设想,个人觉得也可用视图来完成,对于第二个和第三个,个人觉得可以用触发器实现。首先在borrow中添加一个jud属性,用于判断单次借书记录是否逾期,逾期则输入yes,否则no,在reader表中添加一个hon属性,用于存储信誉值,每次新增初始值都是100,实现一个每24小时运行一次的触发器,检索borrow表中当日应还但是未还的日期,找到对应的借书者,扣除一定的信誉分,再实现一个触发器,每当accident表中新增一个值,就将对应的编号的读者信誉分扣除一定的值,具体的代码实现留给读者吧
以上是入坑数据库做的第一个设计,还有很多需要改进和完善,虽然只是一个课程设计,但是也是能力的锻炼,有什么需要改进的地方希望大家多多交流,仅供参考!