图书管理系统数据库设计一、系统概述1、系统简介图书管理是每个图书馆都需要进行的工作。
一个设计良好的图书管理系统数据库能够给图书管理带来很大的便利。
2、需求分析图书管理系统的需求定义为:1.学生可以直接通过借阅终端来查阅书籍信息,同时也可以查阅自己的借阅信息。
2.当学生需要借阅书籍时,通过账号密码登陆借阅系统,借阅系统处理学生的借阅,同时修改图书馆保存的图书信息,修改被借阅的书籍是否还有剩余,同时更新学生个人的借阅信息。
3.学生借阅图书之前需要将自己的个人信息注册,登陆时对照学生信息。
4.学生直接归还图书,根据图书编码修改借阅信息5.管理员登陆管理系统后,可以修改图书信息,增加或者删除图书信息6.管理员可以注销学生信息。
通过需求定义,画出图书管理系统的数据流图:数据流图二、系统功能设计画出系统功能模块图并用文字对各功能模块进行详细介绍。
系统功能模块图:三、数据库设计方案图表1 、系统 E-R 模型总体 E-R 图:精细化的局部 E-R 图:学生借阅 - 归还 E-R 图:管理员 E-R 图:2、设计表给出设计的表名、结构以及表上设计的完整性约束。
ticket: 存储学生的罚单信息给出在各表上建立的索引以及使用的语句。
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 affectedRecords: 0 Duplicates: 0 Warnings: 0mysql> alter table student add index index_name(stu_name desc);Query OK, 0 rows affectedRecords: 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 affectedRecords: 0 Duplicates: 0 Warnings: 0mysql> create index index_brecord on book(book_record);Query OK, 0 rows affectedRecords: 0 Duplicates: 0 Warnings: 0borrow:1.为 stu_id 和 book_id 创建多列索引: sql:create index index_sid_bid onborrow(stu_id asc, book_id asc); 插入索引的操作和结果如下所示:mysql> create index index_sid_bid on borrow(stu_id asc, book_id asc);Query OK, 0 rows affectedRecords: 0 Duplicates: 0 Warnings: 0return_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 affectedRecords: 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 affectedRecords: 0 Duplicates: 0 Warnings: 0manager:1.为 manager_id 创建索引:sql:create index index_mid on manager(manager_id); 插入索引的操作和结果如下所示:mysql> create index index_mid on manager(manager_id);Query OK, 0 rows affectedRecords: 0 Duplicates: 0 Warnings: 04、设计视图给出在各表上建立的视图以及使用的语句。
1.在表 student 上创建计算机专业 (cs)学生的视图 stu_cs : sql: create view stu_cs asselect *from student where pro = ‘ cs';操作和结果:mysql> create view stu_cs asselect *from studentwhere stu_pro = 'cs';Query OK, 0 rows affected2. 在表 student, borrow 和 book 上创建借书者的全面信息视图 stu_borrow sql: create view stu_borrow asselect , , , , borrow_date , adddate(borrow_date,30) expect_return_date from student, book, borrowwhere = and = ;操作和结果:mysql> create view stu_borrow asselect , , , , borrow_date , adddate(borrow_date,30) expect_return_date from student, book, borrowwhere = and = ;Query OK, 0 rows affected3.创建类别 1 的所有图书的视图 cs_book : sql: create view cs_book asselect *from bookwhere infrom book_sortwhere sort_id = 1); 操作和结果显示:mysql> create view cs_book asselect *from bookwhere in (select from book_sortwhere sort_id = 1);Query OK, 0 rows affected4.创建个人所有借书归还纪录视图 stu_borrow_return: sql:create view stu_borrow_return as select , , , ,,from student, book, return_tablewhere = and = ;5、设计触发器给出在各表上建立的触发器以及使用的语句。
1.设计触发器 borrow, 当某学生借书成功后,图书表相应的图书不在架上,变为0:sql:create trigger borrow after insert on borrow for each row beginupdate book set book_num = book_num – 1where book_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 = ;-> 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 + 1where book_id = ;end 还书时在 return_table 插入表项:此时图书归还架上:3.定义定时器(事件) eventJob ,每天自动触发一次,扫描视图stu_borrow ,若发现当前有预期归还时间小于当前时间,则判断为超期,生成处罚记录,这个定时器将每天定时触发存储过程 proc_gen_ticket : sql: create event if not exists eventJob on schedule every 1 DAY /* 每天触发 */on completion PRESERVEdo 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_creditafter insert on ticketfor each rowbeginif (select count(*) from ticket where stu_id=>30 then update student setstu_integrity = 0 where stu_id = ; end if;end 操作和结果显示,测试时选择插入 ticket 项大于 3,因为 30 太大了,不容易测试:学生 1 超过 3 次超期归还图书后,产生了 4 条罚单:此时触动触发器trigger_credit ,将学生 1 的诚信级设置为 0 :四、应用程序设计与编码实现 1、系统实现中存储函数和存储过程的设计要求给出功能描述和代码。