图书管理系统数据库设计-MYSQL实现.doc
《图书管理系统数据库设计-MYSQL实现.doc》由会员分享,可在线阅读,更多相关《图书管理系统数据库设计-MYSQL实现.doc(21页珍藏版)》请在咨信网上搜索。
图书管理系统数据库设计 一、系统概述 1、系统简介 图书管理是每个图书馆都需要进行的工作。一个设计良好的图书管理系统数据库能够给图书管理带来很大的便利。 2、需求分析 图书管理系统的需求定义为: 1.学生可以直接通过借阅终端来查阅书籍信息,同时也可以查阅自己的借阅信息。 2.当学生需要借阅书籍时,通过账号密码登陆借阅系统,借阅系统处理学生的借阅,同时修改图书馆保存的图书信息,修改被借阅的书籍是否还有剩余,同时更新学生个人的借阅信息。 3.学生借阅图书之前需要将自己的个人信息注册,登陆时对照学生信息。 4.学生直接归还图书,根据图书编码修改借阅信息 5.管理员登陆管理系统后,可以修改图书信息,增加或者删除图书信息 6.管理员可以注销学生信息。 通过需求定义,画出图书管理系统的数据流图: 数据流图 二、系统功能设计 画出系统功能模块图并用文字对各功能模块进行详细介绍。 系统功能模块图: 三、数据库设计方案图表 1、系统E-R模型 总体E-R图: 精细化的局部E-R图: 学生借阅-归还E-R图: 管理员E-R图: 2、设计表 给出设计的表名、结构以及表上设计的完整性约束。 student: 列名 数据类型 是否为空/性质 说明 stu_id int not null /PK 标明学生唯一学号 stu_name varchar not null 学生姓名 stu_sex varchar not null 学生性别 stu_age int not null 学生年龄 stu_pro varchar not null 学生专业 stu_grade varchar not null 学生年级 stu_integrity int not null/default=1 学生诚信级 book: 列名 数据类型 是否为空/性质 说明 book_id int not null / PK 唯一书籍序号 book_name varchar not null 书籍名称 book_author varchar not null 书籍作者 book_pub varchar not null 书籍出版社 book_num int not null 书籍是否在架上 book_sort varchar not null 书籍分类 book_record datatime null 书籍登记日期 book_sort: 列名 数据类型 是否为空/性质 说明 sort_id varchar not null / PK 类型编号 sort_name varchar not null 类型名称 borrow:存储学生的借书信息 列名 数据类型 是否为空/性质 说明 student_id varchar not null / PK 学生编号 book_id varchar not null / PK 书籍编号 borrow_date datatime null 借书时间 expect_return_date datetime null 预期归还时间 return_table:存储学生的归还信息 列名 数据类型 是否为空/性质 说明 student_id varchar not null / PK 学生编号 book_id varchar not null / PK 书籍编号 borrow_date datetime null 借书时间 return_date datatime null 实际还书时间 ticket:存储学生的罚单信息 列名 数据类型 是否为空/性质 说明 student_id varchar not null / PK 学生编号 book_id varchar not null / PK 书籍编号 over_date int null 超期天数 ticket_fee float null 处罚金额 manager: 列名 数据类型 是否为空/性质 说明 manager_id varchar not null / PK 管理员编号 manager_name varchar not null 管理员姓名 manager_age varchar not null 管理员年龄 manager_phone varchar 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 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); 插入索引的操作和结果如下所示: 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 student.stu_id, book.book_id, student.stu_name, book.book_name, borrow_date,adddate(borrow_date,30) expect_return_date from student, book, borrow where student.stu_id = borrow.stu_id and book.book_id = borrow.book_id; 操作和结果: mysql> create view stu_borrow as select student.stu_id, book.book_id, student.stu_name, book.book_name, borrow_date,adddate(borrow_date,30) expect_return_date from student, book, borrow where student.stu_id = borrow.stu_id and book.book_id = borrow.book_id; Query OK, 0 rows affected 3.创建类别1的所有图书的视图cs_book: sql: create view cs_book as select * from book where book.book_sort in (select book_sort.sort.name from book_sort where sort_id = 1); 操作和结果显示: mysql> create view cs_book as select * from book where book.book_sort in (select book_sort.sort_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 student.stu_id, student.stu_name, book.book_id, book.book_name,return_table.borrow_date,return_table.return_date from student, book, return_table where student.stu_id = return_table.stu_id and book.book_id = return_table.book_id; 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 = new.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 = new.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 + 1 where book_id = new.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 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 begin if (select count(*) from ticket where stu_id=new.stu_id)>30 then update student set stu_integrity = 0 where stu_id = new.stu_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_borrow.expect_return_date),0.1*datediff(cur_date,stu_borrow.expect_return_date) from stu_borrow where cur_date>stu_borrow.expect_return_date; end 操作和结果显示: 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 student.stu_id = stu_id); end 2) 设计存储函数,func_get_booknum,返回书籍是否在架上: create function func_get_booknum(book_id int) returns int begin return(select book_num from book where book.book_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: 此时借书成功: 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 ticket.stu_id = stu_id and ticket.book_id=book_id) = 1 then /*判断是否交了罚单,1表示没有交*/ select 'please pay off the ticket'; else /*纪录归还项目到return_table中,并且删除借书纪录*/ set borrowdate = (select borrow_date from borrow where borrow.stu_id = stu_id and borrow.book_id = book_id); insert into return_table values(stu_id, book_id, borrowdate, return_date); delete from borrow where borrow.stu_id = stu_id and borrow.book_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; 此时再次调用还书过程: 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 ticket.stu_id = stuid and ticket.book_id = bookid; select ‘succeed’; end 交罚单,调用proc_payoff: call proc_payoff(1, 2); 交罚单成功,payoff = 0; 2、功能实现 按各功能模块进行描述。要求:画出流程图并给出实现代码。 l 创建学生统一账户,账户名: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'; l 创建管理员统一账户,账户名:manager_account, 并且授予全部权限: sql: create user 'manager_account'@'localhost' identified by '123'; grant all on library_management to 'manager_account'@'localhost'; l 查询图书信息 按书名查找: select * from book where book_name = ‘sql’; 按作者查找: select * from book where book_author = ‘author’; l 借书功能: 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: l 还书功能: proc_return(in stu_id int, in book_id int, in return_date datetime) call proc_return(1, 1, now()); 命令行操作: 表return_table: 表borrow: 表book: l 交罚单功能:proc_payoff(in stuid int, in bookid int) call proc_payoff(1,1); 实验操作和结果见上节:“6. 交罚单存储过程“ l 管理员添加图书: insert into book values(…); 操作与结果: l 管理员删除图书: delete from book where (condition); l 管理员注销学生信息: delete from student where (condition); l 管理员恢复学生的诚信级: update student set stu_integrity=1 where (condition); 学生借书-归还流程图: 管理员管理流程图: 数据库设计结果: 五、实习体会 自己写 21- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 管理 系统 数据库 设计 MYSQL 实现
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【精***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【精***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文