图书管理系统数据库设计-MYSQL实现

图书管理系统数据库设计-MYSQL实现

2023年7月27日发(作者:)

图书管理系统数据库设计

一、系统概述

1、系统简介

图书管理是每个图书馆都需要进行的工作。一个设计良好的图书管理系统数据库能够给图书管理带来很大的便利。

2、需求分析

图书管理系统的需求定义为:

1.学生可以直接通过借阅终端来查阅书籍信息,同时也可以查阅自己的借阅信息。

2.当学生需要借阅书籍时,通过账号密码登陆借阅系统,借阅系统处理学生的借阅,同时修改图书馆保存的图书信息,修改被借阅的书籍是否还有剩余,同时更新学生个人的借阅信息。

3.学生借阅图书之前需要将自己的个人信息注册,登陆时对照学生信息。

4.学生直接归还图书,根据图书编码修改借阅信息

5.管理员登陆管理系统后,可以修改图书信息,增加或者删除图书信息

6.管理员可以注销学生信息。

通过需求定义,画出图书管理系统的数据流图:

1

数据流图

学生信息注册图书信息学生学生信息借阅信息学生查询登陆借阅学生归还学生借阅信息管理员信息图书信息管理员登陆图书管理学生管理管理员学生信息

2

二、系统功能设计

画出系统功能模块图并用文字对各功能模块进行详细介绍。

系统功能模块图:

图书管理系统借阅者模块管理员模块查询图书归还图书借阅图书查询借阅信息注册个人信息查询图书修改图书信息增加/删除图书查询借阅信息删除学生信息

三、数据库设计方案图表

1、系统E-R模型

总体E-R图:

学生借阅图书管理管理员

精细化的局部E-R图:

3

访问模块借阅者登陆管理员登陆 学生借阅-归还E-R图:

学生ID年级年龄性别诚信级学生ID归还时间图书ID图书ID学生专业图书归还表归还借阅学生ID图书借阅表图书ID处罚表登记日期借阅时间学生ID处罚金额超期图书ID书名图书作者数量出版社分类

管理员E-R图:

姓名ID号年龄所属单位管理员联系电话管理管理类别编号类别名称学生

图书属于图书类别

4

2、设计表

给出设计的表名、结构以及表上设计的完整性约束。

student:

列名

stu_id

stu_name

stu_sex

stu_age

stu_pro

stu_grade

stu_integrity

book:

列名

book_id

book_name

book_author

book_pub

book_num

book_sort

book_record

book_sort:

列名

sort_id

sort_name

列名

student_id

book_id

borrow_date

expect_return_date

列名

student_id

book_id

borrow_date

return_date

列名

student_id

book_id

over_date

数据类型

int

varchar

varchar

int

varchar

varchar

int

数据类型

int

varchar

varchar

varchar

int

varchar

datatime

数据类型

varchar

varchar

数据类型

varchar

varchar

datatime

datetime

数据类型

varchar

varchar

datetime

datatime

数据类型

varchar

varchar

int

5

是否为空/性质

not null /PK

not null

not null

not null

not null

not null

not null/default=1

是否为空/性质

not null / PK

not null

not null

not null

not null

not null

null

是否为空/性质

not null / PK

not null

是否为空/性质

not null / PK

not null / PK

null

null

是否为空/性质

not null / PK

not null / PK

null

null

是否为空/性质

not null / PK

not null / PK

null

说明

标明学生唯一学号

学生姓名

学生性别

学生年龄

学生专业

学生年级

学生诚信级

说明

唯一书籍序号

书籍名称

书籍作者

书籍出版社

书籍是否在架上

书籍分类

书籍登记日期

说明

类型编号

类型名称

说明

学生编号

书籍编号

借书时间

预期归还时间

说明

学生编号

书籍编号

借书时间

实际还书时间

说明

学生编号

书籍编号

超期天数

borrow:存储学生的借书信息

return_table:存储学生的归还信息

ticket:存储学生的罚单信息 ticket_fee

manager:

列名

manager_id

manager_name

manager_age

manager_phone

float

数据类型

varchar

varchar

varchar

varchar

null

是否为空/性质

not null / PK

not null

not null

not null

处罚金额

说明

管理员编号

管理员姓名

管理员年龄

管理员电话

3、设计索引

给出在各表上建立的索引以及使用的语句。

student:

1.为stu_id创建索引,升序排序

sql:create index index_id on student(stu_id asc);

2.为stu_name创建索引,并且降序排序

sql:alter table student add index index_name(stu_name, desc);

插入索引操作和结果如下所示:

mysql> create index index_id on student(stu_id asc);

Query OK, 0 rows affected

Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table student add index index_name(stu_name desc);

Query OK, 0 rows affected

Records: 0 Duplicates: 0 Warnings: 0

mysql>

book:

1.为book_id创建索引,升序排列

sql:create index index_bid on book(book_id);

2.为book_record创建索引,以便方便查询图书的登记日期信息,升序:

sql:create index index_brecord on book(book_record);

插入索引的操作和结果如下所示:

mysql> create index index_bid on book(book_id);

Query OK, 0 rows affected

Records: 0 Duplicates: 0 Warnings: 0

mysql> create index index_brecord on book(book_record);

Query OK, 0 rows affected

6

Records: 0 Duplicates: 0 Warnings: 0

borrow:

1.为stu_id和book_id创建多列索引:

sql:create index index_sid_bid on borrow(stu_id asc, book_id asc);

插入索引的操作和结果如下所示:

mysql> create index index_sid_bid on borrow(stu_id asc, book_id asc);

Query OK, 0 rows affected

Records: 0 Duplicates: 0 Warnings: 0

return_table:

1.为stu_id和book_id创建多列索引:

sql:create index index_sid_bid on return_table(stu_id asc, book_id asc);

插入索引的操作和结果如下所示:

mysql> create index index_sid_bid_r on return_table(stu_id asc, book_id asc);

Query OK, 0 rows affected

Records: 0 Duplicates: 0 Warnings: 0

ticket:

1. 为stu_id和book_id创建多列索引:

sql:create index index_sid_bid on ticket(stu_id asc, book_id asc);

插入索引的操作和结果如下所示:

mysql> create index index_sid_bid on ticket(stu_id asc, book_id asc);

Query OK, 0 rows affected

Records: 0 Duplicates: 0 Warnings: 0

manager:

1.为manager_id创建索引:

sql:create index index_mid on manager(manager_id);

7

插入索引的操作和结果如下所示:

mysql> create index index_mid on manager(manager_id);

Query OK, 0 rows affected

Records: 0 Duplicates: 0 Warnings: 0

4、设计视图

给出在各表上建立的视图以及使用的语句。

1.在表student上创建计算机专业(cs)学生的视图stu_cs:

sql: create view stu_cs as

select *

from student

where pro = ‘cs’;

操作和结果:

mysql> create view stu_cs as

select *

from student

where stu_pro = 'cs';

Query OK, 0 rows affected

2. 在表student, borrow和book上创建借书者的全面信息视图stu_borrow:

sql: create view stu_borrow as

select _id, _id, _name, _name, borrow_date,adddate(borrow_date,30) expect_return_date

from student, book, borrow

where _id = _id and _id = _id;

操作和结果:

mysql> create view stu_borrow as

select _id, _id, _name, _name, borrow_date,adddate(borrow_date,30) expect_return_date

from student, book, borrow

where _id = _id and _id = _id;

8

Query OK, 0 rows affected

3.创建类别1的所有图书的视图cs_book:

sql: create view cs_book as

select *

from book

where _sort in

(select book_

from book_sort

where sort_id = 1);

操作和结果显示:

mysql> create view cs_book as

select *

from book

where _sort in

(select book__name

from book_sort

where sort_id = 1);

Query OK, 0 rows affected

4.创建个人所有借书归还纪录视图stu_borrow_return:

sql:

create view stu_borrow_return as

select _id, _name, _id,

_name,return__date,return__date

from student, book, return_table

where _id = return__id and _id = return__id;

9

5、设计触发器

给出在各表上建立的触发器以及使用的语句。

1.设计触发器borrow, 当某学生借书成功后,图书表相应的图书不在架上,变为0:

sql:

create trigger borrow

after insert on borrow

for each row

begin

update book set book_num = book_num – 1

where book_id = _id;

end

操作与结果显示:

mysql> delimiter $$

mysql> create trigger trigger_borrow

-> after insert on borrow

-> for each row

-> begin

-> update book set book_num = book_num - 1

-> where book_id = _id;

-> end

-> $$

Query OK, 0 rows affected

在插入表borrow之前,book_id = 1 的图书还在架上,为1:

学生1借了这本书后,在borrow中插入了一条记录:

在borrow中插入这条记录后,book_id =1的图书,不在架上,为0:

2.设计触发器trigger_return, 还书成功后,对应的书籍book_num变为1:

sql:

create trigger trigger_return

after insert on return_table

for each row

begin

update book set book_num = book_num + 1

where book_id = _id;

end

10

还书时在return_table插入表项:

此时图书归还架上:

3.定义定时器(事件)eventJob,每天自动触发一次,扫描视图stu_borrow,若发现当前有预期归还时间小于当前时间,则判断为超期,生成处罚记录,这个定时器将每天定时触发存储过程proc_gen_ticket:

sql:

create event if not exists eventJob

on schedule every 1 DAY /*每天触发*/

on completion PRESERVE

do call proc_gen_ticket(getdate()); /*调用存储过程*/

set global event_scheduler = 1;

alter event eventJob on completion preserve enable; /*开启定时器*/

操作和结果显示:

1). 学生1借了图书1,生成借书记录stu_borrow视图,如下:

2). 当他在1月27日前还书时,没有生成罚单:

3). 当他在1月27日后还书时,生成罚单:

4.设计触发器trigger_credit,若处罚记录超过30条,则将这个学生的诚信级设置为0,下次不允许借书:

sql:

create trigger trigger_credit

after insert on ticket

for each row

11

begin

if (select count(*) from ticket where stu_id=_id)>30 then

update student set stu_integrity = 0 where stu_id = _id;

end if;

end

操作和结果显示,测试时选择插入ticket项大于3,因为30太大了,不容易测试:

学生1超过3次超期归还图书后,产生了4条罚单:

此时触动触发器trigger_credit,将学生1的诚信级设置为0:

四、应用程序设计与编码实现

1、系统实现中存储函数和存储过程的设计

要求给出功能描述和代码。

1. 设计存储过程,产生罚单proc_gen_ticket:

当日期超过预定归还日期时,产生罚单,并将记录写入表ticket中,这个存储过程在定时器eventJob中调用:

sql:

create procedure proc_gen_ticket(in currentdate datetime)

BEGIN

declare cur_date datetime;

set cur_date = currentdate;

replace into ticket(stu_id, book_id, over_date, ticket_fee)

select stu_id, book_id,

datediff(cur_date,stu__return_date),0.1*datediff(cur_date,stu__return_date)

from stu_borrow

where cur_date>stu__return_date;

end

12

操作和结果显示:

1). 学生1借了图书1,生成借书记录stu_borrow视图,如下:

2). 当他在1月27日前还书时,没有生成罚单:

3). 当他在1月27日后还书时,生成罚单:

2.设计学生注册信息存储过程:学生注册信息stu_register

sql:

create procedure stu_register(in stu_id int, in stu_name varchar(20), in stu_sex varchar(20),

in stu_age int, in stu_pro varchar(20), in stu_grade varchar(20))

begin

insert into student(stu_id, stu_name, stu_sex, stu_age, stu_pro, stu_grade)

values(stu_id, stu_name, stu_sex, stu_age, stu_pro, stu_grade);

end

3. 设计管理员注册信息存储过程:ma_register

sql:

create procedure ma_register(in ma_id int, in ma_name varchar(20), in ma_age int, in

ma_phone int)

BEGIN

insert into manager

values(ma_id, ma_name, ma_age, ma_phone);

END

4. 借书过程的实现:

1) 设计存储函数,func_get_credit,返回学生的诚信级:

create function func_get_credit(stu_id int) returns int

begin

return(select stu_integrity from student where _id = stu_id);

end

13

2) 设计存储函数,func_get_booknum,返回书籍是否在架上:

create function func_get_booknum(book_id int) returns int

begin

return(select book_num from book where _id = book_id);

end

3) 设计存储过程proc_borrow,调用func_get_credit和func_get_booknum,判断这个学生诚信度和书籍是否在架上,若为真,则借书成功,在borrrow表中插入纪录;否则提示失败:

create procedure proc_borrow(in stu_id int, in book_id int, in borrow_date datetime)

begin

if func_get_credit(stu_id) = 1 and func_get_booknum(book_id) = 1 then

insert into borrow

values(stu_id, book_id, borrow_date);

else

select 'failed to borrow';

end if;

end

实验操作与结果显示:

borrow纪录为空:

执行函数,学生1借图书2:

call proc_borrow(1,2,now());

学生1的诚信级为0:

借书失败:

修改学生1诚信级为1:

此时借书成功:

14

5. 还书存储过程proc_return:

当还书时,查看是否书是否超期,即查询ticket表项,当发现超期,提示交罚单后再次还书,如没有超期,则纪录归还项目到return_table中,并且删除借书纪录(以免还书后定时器仍然扫描这个纪录):

sql:

create procedure proc_return(in stu_id int, in book_id int, in return_date datetime)

begin

DECLARE borrowdate datetime;

if (select payoff from ticket where _id = stu_id and _id=book_id)

= 1 then /*判断是否交了罚单,1表示没有交*/

select 'please pay off the ticket';

else /*纪录归还项目到return_table中,并且删除借书纪录*/

set borrowdate = (select borrow_date from borrow where _id =

stu_id and _id = book_id);

insert into return_table

values(stu_id, book_id, borrowdate, return_date);

delete from borrow

where _id = stu_id and _id = book_id;

end if;

end

实验操作与结果显示:

学生1借了图书2:

超期产生了罚单,没有交罚单,payoff=1:

此时调用还书过程:

call proc_return(1, 2, now());

提示交罚单:

交罚单,调用proc_payoff:

call proc_payoff(1, 2);

交罚单成功,payoff = 0;

15

此时再次调用还书过程:

call proc_return(1, 2, now());

还书成功,在return_table生成了还书纪录:

6. 交罚单存储过程:

修改罚单中payoff段为0,表明罚单已交:

create procedure proc_payoff(in stuid int, in bookid int)

begin

update ticket

set payoff = 0

where _id = stuid and _id = bookid;

select ‘succeed’;

end

交罚单,调用proc_payoff:

call proc_payoff(1, 2);

交罚单成功,payoff = 0;

2、功能实现

按各功能模块进行描述。要求:画出流程图并给出实现代码。

 创建学生统一账户,账户名:student_account,并且授予权限:

sql:

create user 'student_account'@'localhost';

grant insert,select on student to 'student_account'@'localhost';

grant select on book to 'student_account'@'localhost';

grant insert,select on borrow to 'student_account'@'localhost';

grant insert,select on return_table to 'student_account'@'localhost';

grant select on ticket to 'student_account'@'localhost';

 创建管理员统一账户,账户名:manager_account, 并且授予全部权限:

16

sql:

create user 'manager_account'@'localhost' identified by '123';

grant all on library_management to 'manager_account'@'localhost';

 查询图书信息

按书名查找:

select * from book where book_name = ‘sql’;

按作者查找:

select * from book where book_author = ‘author’;

 借书功能: proc_borrow(in stu_id int, in book_id int, in borrow_date datetime)

如果要接的书还在架上,并且学生的诚信级为1,那么可以借书

call proc_borrow(1, 1, now());

命令行操作:

表borrow:

视图stu_borrow:

表book:

 还书功能: proc_return(in stu_id int, in book_id int, in return_date datetime)

call proc_return(1, 1, now());

命令行操作:

表return_table:

17

表borrow:

表book:

 交罚单功能:proc_payoff(in stuid int, in bookid int)

call proc_payoff(1,1);

实验操作和结果见上节:“6. 交罚单存储过程“

 管理员添加图书:

insert into book

values(…);

操作与结果:

 管理员删除图书:

delete from book

where (condition);

 管理员注销学生信息:

delete from student

where (condition);

 管理员恢复学生的诚信级:

update student

set stu_integrity=1

where (condition);

学生借书-归还流程图:

18

开始注册学生信息Call stu_register登入数据库用户名:student_accont查询 or 归还归还Call proc_return查询查询表ticket按书名/按作者名...无纪录 or 交完罚单借书:call proc_borrow往表return_table插入纪录在borrow中删除借书纪录成功?触发器return,修改表book成功往表borrow插入纪录结束定时器enventJob触发器borrow,修改表book图书超期?YesCall proc_gen_ticket生成罚单19

管理员管理流程图:

开始注册管理员信息Call ma_register添加图书Insert into book事务中心修改学生信息Update student删除图书Delete from book数据库设计结果:

注销学生信息Delete from

student

20

五、实习体会

自己写

21

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690430719a348864.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信