图书的管理系统数据库设计MYSQL实现docWord下载.docx
《图书的管理系统数据库设计MYSQL实现docWord下载.docx》由会员分享,可在线阅读,更多相关《图书的管理系统数据库设计MYSQL实现docWord下载.docx(24页珍藏版)》请在冰豆网上搜索。
![图书的管理系统数据库设计MYSQL实现docWord下载.docx](https://file1.bdocx.com/fileroot1/2022-12/10/53d1cb33-25eb-427d-8920-52509d92799f/53d1cb33-25eb-427d-8920-52509d92799f1.gif)
列名
数据类型
是否为空/性质
说明
stu_id
int
notnull/PK
标明学生唯一学号
stu_name
varchar
notnull
学生姓名
stu_sex
学生性别
stu_age
学生年龄
stu_pro
学生专业
stu_grade
学生年级
stu_integrity
notnull/default=1
学生诚信级
book:
book_id
notnull/PK
唯一书籍序号
book_name
书籍名称
book_author
书籍作者
book_pub
书籍出版社
book_num
int
notnull
书籍是否在架上
book_sort
书籍分类
book_record
datatime
null
书籍登记日期
book_sort:
sort_id
类型编号
sort_name
类型名称
borrow:
存储学生的借书信息
student_id
学生编号
varchar
书籍编号
borrow_date
借书时间
expect_return_date
datetime
预期归还时间
return_table:
存储学生的归还信息
return_date
实际还书时间
ticket:
存储学生的罚单信息
over_date
超期天数
ticket_fee
float
处罚金额
manager:
manager_id
管理员编号
manager_name
管理员姓名
manager_age
管理员年龄
manager_phone
管理员电话
3、设计索引
给出在各表上建立的索引以及使用的语句。
1.为stu_id创建索引,升序排序
sql:
createindexindex_idonstudent(stu_idasc);
2.为stu_name创建索引,并且降序排序
altertablestudentaddindexindex_name(stu_name,desc);
插入索引操作和结果如下所示:
mysql>
createindexindex_idonstudent(stu_idasc);
QueryOK,0rowsaffected
Records:
0Duplicates:
0Warnings:
0
altertablestudentaddindexindex_name(stu_namedesc);
1.为book_id创建索引,升序排列
createindexindex_bidonbook(book_id);
2.为book_record创建索引,以便方便查询图书的登记日期信息,升序:
createindexindex_brecordonbook(book_record);
插入索引的操作和结果如下所示:
createindexindex_bidonbook(book_id);
createindexindex_brecordonbook(book_record);
1.为stu_id和book_id创建多列索引:
createindexindex_sid_bidonborrow(stu_idasc,book_idasc);
createindexindex_sid_bidonborrow(stu_idasc,book_idasc);
createindexindex_sid_bidonreturn_table(stu_idasc,book_idasc);
createindexindex_sid_bid_ronreturn_table(stu_idasc,book_idasc);
1.为stu_id和book_id创建多列索引:
createindexindex_sid_bidonticket(stu_idasc,book_idasc);
createindexindex_sid_bidonticket(stu_idasc,book_idasc);
1.为manager_id创建索引:
createindexindex_midonmanager(manager_id);
createindexindex_midonmanager(manager_id);
4、设计视图
给出在各表上建立的视图以及使用的语句。
1.在表student上创建计算机专业(cs)学生的视图stu_cs:
createviewstu_csas
select*
fromstudent
wherepro=‘cs’;
操作和结果:
wherestu_pro='
cs'
;
2.在表student,borrow和book上创建借书者的全面信息视图stu_borrow:
createviewstu_borrowas
selectstudent.stu_id,book.book_id,student.stu_name,book.book_name,borrow_date,adddate(borrow_date,30)expect_return_date
fromstudent,book,borrow
wherestudent.stu_id=borrow.stu_idandbook.book_id=borrow.book_id;
3.创建类别1的所有图书的视图cs_book:
createviewcs_bookas
frombook
wherebook.book_sortin
(selectbook_sort.sort.name
frombook_sort
wheresort_id=1);
操作和结果显示:
(selectbook_sort.sort_name
4.创建个人所有借书归还纪录视图stu_borrow_return:
createviewstu_borrow_returnas
selectstudent.stu_id,student.stu_name,book.book_id,book.book_name,return_table.borrow_date,return_table.return_date
fromstudent,book,return_table
wherestudent.stu_id=return_table.stu_idandbook.book_id=return_table.book_id;
5、设计触发器
给出在各表上建立的触发器以及使用的语句。
1.设计触发器borrow,当某学生借书成功后,图书表相应的图书不在架上,变为0:
createtriggerborrow
afterinsertonborrow
foreachrow
begin
updatebooksetbook_num=book_num–1
wherebook_id=new.book_id;
end
操作与结果显示:
delimiter$$
createtriggertrigger_borrow
->
afterinsertonborrow
updatebooksetbook_num=book_num-1
wherebook_id=new.book_id;
$$
在插入表borrow之前,book_id=1的图书还在架上,为1:
学生1借了这本书后,在borrow中插入了一条记录:
在borrow中插入这条记录后,book_id=1的图书,不在架上,为0:
2.设计触发器trigger_return,还书成功后,对应的书籍book_num变为1:
createtriggertrigger_return
afterinsertonreturn_table
updatebooksetbook_num=book_num+1
还书时在return_table插入表项:
此时图书归还架上:
3.定义定时器(事件)eventJob,每天自动触发一次,扫描视图stu_borrow,若发现当前有预期归还时间小于当前时间,则判断为超期,生成处罚记录,这个定时器将每天定时触发存储过程proc_gen_ticket:
createeventifnotexistseventJob
onscheduleevery1DAY/*每天触发*/
oncompletionPRESERVE
docallproc_gen_ticket(getdate());
/*调用存储过程*/
setglobalevent_scheduler=1;
altereventeventJoboncompletionpreserveenable;
/*开启定时器*/
1).学生1借了图书1,生成借书记录stu_borrow视图,如下:
2).当他在1月27日前还书时,没有生成罚单:
3).当他在1月27日后还书时,生成罚单:
4.设计触发器trigger_credit,若处罚记录超过30条,则将这个学生的诚信级设置为0,下次不允许借书:
createtriggertrigger_credit
afterinsertonticket
foreachrow
if(selectcount(*)fromticketwherestu_id=new.stu_id)>
30then
updatestudentsetstu_integrity=0wherestu_id=new.stu_id;
endif;
操作和结果显示,测试时选择插入ticket项大于3,因为30太大了,不容易测试:
学生1超过3次超期归还图书后,产生了4条罚单:
此时触动触发器trigger_credit,将学生1的诚信级设置为0:
四、应用程序设计与编码实现
1、系统实现中存储函数和存储过程的设计
要求给出功能描述和代码。
1.设计存储过程,产生罚单proc_gen_ticket:
当日期超过预定归还日期时,产生罚单,并将记录写入表ticket中,这个存储过程在定时器eventJob中调用:
sql:
createprocedureproc_gen_ticket(incurrentdatedatetime)
BEGIN
declarecur_datedatetime;
setcur_date=currentdate;
replaceintoticket(stu_id,book_id,over_date,ticket_fee)
selectstu_id,book_id,datediff(cur_date,stu_borrow.expect_return_date),0.1*datediff(cur_date,stu_borrow.expect_return_date)
fromstu_borrow
wherecur_date>
stu_borrow.expect_return_date;
end
2.设计学生注册信息存储过程:
学生注册信息stu_register
createprocedurestu_register(instu_idint,instu_namevarchar(20),instu_sexvarchar(20),instu_ageint,instu_provarchar(20),instu_gradevarchar(20))
insertintostudent(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);
3.设计管理员注册信息存储过程:
ma_register
createprocedurema_register(inma_idint,inma_namevarchar(20),inma_ageint,inma_phoneint)
BEGIN
insertintomanager
values(ma_id,ma_name,ma_age,ma_phone);
END
4.借书过程的实现:
1)设计存储函数,func_get_credit,返回学生的诚信级:
createfunctionfunc_get_credit(stu_idint)returnsint
begin
return(selectstu_integrityfromstudentwherestudent.stu_id=stu_id);
2)设计存储函数,func_get_booknum,返回书籍是否在架上:
createfunctionfunc_get_booknum(book_idint)returnsint
return(selectbook_numfrombookwherebook.book_id=book_id);
3)设计存储过程proc_borrow,调用func_get_credit和func_get_booknum,判断这个学生诚信度和书籍是否在架上,若为真,则借书成功,在borrrow表中插入纪录;
否则提示失败:
createprocedureproc_borrow(instu_idint,inbook_idint,inborrow_datedatetime)
iffunc_get_credit(stu_id)=1andfunc_get_booknum(book_id)=1then
insertintoborrow
values(stu_id,book_id,borrow_date);
else
select'
failedtoborrow'
endif;
实验操作与结果显示:
borrow纪录为空:
执行函数,学生1借图书2:
callproc_borrow(1,2,now());
学生1的诚信级为0:
借书失败:
修改学生1诚信级为1:
此时借书成功:
5.还书存储过程proc_return:
当还书时,查看是否书是否超期,即查询ticket表项,当发现超期,提示交罚单后再次还书,如没有超期,则纪录归还项目到return_table中,并且删除借书纪录(以免还书后定时器仍然扫描这个纪录):
createprocedureproc_return(instu_idint,inbook_idint,inreturn_datedatetime)
DECLAREborrowdatedatetime;
if(selectpayofffromticketwhereticket.stu_id=stu_idandticket.book_id=book_id)=1then/*判断是否交了罚单,1表示没有交*/
select'
pleasepayofftheticket'
else/*纪录归还项目到return_table中,并且删除借书纪录*/
setborrowdate=(selectborrow_datefromborrowwhereborrow.stu_id=stu_idandborrow.book_id=book_id);
insertintoreturn_table
values(stu_id