1、目 录1 前言12 需求分析12。1 课程设计目的12。2 课程设计任务12.3 设计环境22.4 开发语言23 分析和设计23。1 系统ER模型53。2 表空间及表的设计63.3 视图设计143。4 存储过程、函数、包的设计153。5 触发器设计223。6 角色、用户、权限设计243。7 备份方案设计264 课程设计总结27参考文献28致谢281 前言一个简单的图书管理系统包括图书馆内书籍的信息、学校在校师生的信息以及师生的借阅信息.此系统功能面向图书馆管理员,可以完成书籍和读者的增加、删除和修改,制定借阅规则,以及对读者借阅、续借、归还、预约的确认。2 需求分析2.1课程设计目的通过专业课
2、程设计,即大型数据库系统课程设计,有助于培养学生综合运用数据库相关知识解决实际问题的能力.本设计要求对实际问题进行需求分析,提炼实际问题中的数据,建立关系模型,并在大型数据库中得以实现.同时要求对数据库的运营、管理及使用上进行必要的规划和实现。2。2 课程设计任务(1)图书信息:包括图书编号、图书名称、所属类别等;(2)读者信息:包括读者编码、姓名、性别、专业等;(3)借还书信息:包括图书当前状态、被借还次数、借阅时间等。基本要求:(1)根据需求,补充必要的数据库实体,建立ER模型,通过ER图表示。(2)在Oracle中创建该系统的数据库,并在数据库中实现各表,写入一定的数据.(3)从实际查询
3、应用出发,为一些主要的应用模块设计至少3个参数化视图。(4)从数据检验的角度出发,为相关的表建立至少1个触发器。(5)从数据更新或修改的角度出发,设计至少1个存储过程。(6)从安全的角度出发,规划系统的角色、用户、权限,并通过相关的SQL实现。(7)预计每个表的大致容量和增长速度,指定备份的方案,写出相关的备份命令.2。3 设计环境(1)WINDOWS2000/2003/XP系统(2)Oracle数据库管理系统2。4 开发语言PL/SQL语言3 分析和设计(1)功能简介借阅功能:图书出借时考虑三个问题:1读者是否因为超期、罚款等情况被关闭了借阅权限;读者是否已经借满其限额。如果不存在以上情况,
4、则可以出借。预约功能:读者想借的书如果不在库中(已经被出借),读者可以预约该图书,当该图书被归还时系统给读者发送邮件,提醒他来借阅,此时其他读者也可以借阅该书。续借功能:读者还书的时候可以续借该图书,续借的过程包括先执行还书操作,再执行借阅操作.(2)发送催还邮件管理员可以发送邮件提醒读者到期还书.1读者管理功能:对读者信息进行查看、添加、修改、删除.将读者分为不同类别,赋以不同权限。2系统管理功能:对管理员的登录账号、密码进行添加、修改、删除。3规则管理功能:对图书借阅规则进行查看、添加、修改、删除。(3)需求描述针对一般图书管理信息系统的需求,通过对图书管理工作过程的内容和数据流程分析,设
5、计如下面所示的数据项:1)读者信息属性:读者编号,读者姓名,联系电话,邮箱地址,所在系,权限状况,读者类型,备注主键:读者编号2)书籍信息属性:图书编号,ISBN,书名,作者,出版社,出版日期,简介,封面图片,价格,学科类型,藏书类型主键:图书编号3)管理员信息属性:编号,账号 ,密码主键:编号4)读者类型属性:编号,类型,说明主键:编号5)藏书类型属性:编号,类型,说明主键:编号6)学科类型属性:编号,类型,说明主键:编号7)借阅信息属性:图书编号,读者编号,借阅日期,应还日期主键:图书编号,读者编号8)预约信息属性:图书编号,读者编号,预约日期主键:图书编号,读者编号9)借阅规则属性:图书
6、类型,读者类型,期限,册数,续借次数,逾期罚款主键:图书类型,读者类型本系统共设计9个表、6个序列、4个存储过程、3个函数、4个触发器其中存储过程有:1)检查借阅是否超期的存储过程;2)判断读者可否进行借阅的存储过程;3)计算超期罚款的存储过程;4)发送邮件的存储过程;其中函数有:1)计算图书应归还日期的函数;2)计算读者可借阅图书册书的函数;3)计算读者已经借阅某类型图书的册数的函数;其中触发器有:1)删除藏书类型的触发器;2)删除读者类型的触发器;3)删除图书的触发器;4)删除读者的触发器。本系统的功能可以在以下几个方面进行拓展和完善练习添加和使用以下命名块:1)修改读者类型的触发器;2)
7、修改藏书类型的触发器;3)将图片存储为Blog类型的存储过程;4)将超期未还的读者借阅权限关闭的存储过程;5)计算读者应交欠费的存储函数。练习添加以下系统功能:1)管理员添加、修改、删除系统公告的功能;2)管理员权限开通/关闭的功能;3)上传图片的功能(本系统中只实现了保存图片地址);4)批量删除图书或读者的功能.3。1 系统E-R模型数据库需要表述的信息有以下几种:(1)读者信息(2)书籍信息(3)管理员信息(4)藏书分类信息(5)图书学科分类信息(6)读者分类信息(7)读者与书籍之间的关系(借阅关系E-R图)(8) 读者类型与书籍类型之间的关系(规则关系E-R图)3。2 表空间及表的设计表
8、1 管理员用户表(admin)列名类型长度约束备注Idnumber11主键管理员编号usernamevarchar210非空管理员帐号passwordvarchar211非空帐号密码表2 读者类型(reader_type)列名类型长度约束备注typeidnumber11主键类型编号typenamevarchar220非空类型名称demovarchar2100说明表3 读者表(reader)列名类型长度约束备注readeridnumber11主键读者编号namevarchar210非空读者姓名telephonevarchar215联系电话emailvarchar230邮箱地址deptvarcha
9、r220所在院系rightnumber1取值为0或1借阅权限readertypenumber11外键读者类型demovarchar21000说明表4 藏书类型表(book_type)列名类型长度约束备注typeidnumber11主键类型编号typenamevarchar220非空类型名称demo varchar2100说明表5 学科类型表(book_class)列名类型长度约束备注classidnumber11主键类型编号classnamevarchar220非空类型名称demo varchar2100说明表6 图书表(book)列名类型长度约束备注bookidnumber11主键书籍编号b
10、ooknamevarchar220非空书籍名称author1varchar220非空书籍作者author2varchar220书籍作者author3varchar220书籍作者pubdatedate出版日期publishvarchar230出版社photovarchar2100图片地址abstractvarchar24000内容简介Pricenumber7,2非空价格ISBNvarchar217非空书籍ISBN码bookclassnumber11外键学科类型booktypenumber11外键藏书类型表7 借阅表(borrow)列名类型长度约束备注readeridnumber11联合主键,外键
11、读者编号bookidnumber11联合主键,外键图书编号borrowdatedate出借日期duedate应还日期表8 预约表(preconcert)列名类型长度约束备注readeridnumber11联合主键,外键读者编号bookidnumber11联合主键,外键图书编号predatedate预约日期表9 规则表(rule)列名类型长度约束备注booktypenumber11联合主键,外键藏书类型号readertypenumber11联合主键,外键读者类型号daysnumber5非空期限(天)numnumber5非空册数(本)renewnumber5非空续借次数(次)overtimenum
12、ber5,2非空逾期处罚(元/册/天)(1)创建数据表语句create table admin(id number(11) primary key,username varchar2(10) not null,password varchar2(11) not null);在SQL Developer中创建数据表截图31所示:图31 admin数据表create table reader_type(typeid number(11) primary key,typename varchar2(20) not null,demo varchar2(100));在SQL Developer中创建数
13、据表截图32所示:图3-2 reader_type数据表create table reader(readerid number(11) primary key,name varchar2(10) not null,telephone varchar2(15),email varchar2(30),dept varchar2(20),right number(1) check(right=0 or right=1),readertype number(11) references reader_type(typeid),demo varchar2(1000);在SQL Developer中创建数
14、据表截图33所示:图33数据表create table book_type(typeid number(11) primary key,typename varchar2(20) not null,demo varchar2(100));在SQL Developer中创建数据表截图34所示:图3-4数据表create table book_class(classid number(11) primary key,classname varchar2(20) not null,demo varchar2(100));在SQL Developer中创建数据表截图35所示:图35数据表create
15、table book(bookid number(11) primary key,bookname varchar2(20) not null,author1 varchar2(20) not null,author2 varchar2(20),author3 varchar2(20),pubdate date,publish varchar2(30),photo varchar2(100),abstract varchar2(4000),price number(7,2) not null,isbn varchar2(17) not null,bookclass number(11) ref
16、erences book_class(classid),booktype number(11) references book_type(typeid));在SQL Developer中创建数据表截图36所示:图3-6数据表create table borrow(readerid number(11),bookid number(11),borrowdate date,due date,primary key(readerid,bookid),foreign key (readerid) references reader(readerid),foreign key (bookid) refe
17、rences book(bookid);在SQL Developer中创建数据表截图3-7所示:图3-7数据表create table preconcert(readerid number(11),bookid number(11),predate date,primary key(readerid,bookid),foreign key (readerid) references reader(readerid),foreign key (bookid) references book(bookid);在SQL Developer中创建数据表截图38所示:图38数据表create table
18、 rule(booktype number(11),readertype number(11),days number(5) not null,num number(5) not null,renew number(5) not null,overtime number(5,2) not null,primary key(booktype,readertype),foreign key (booktype) references book_type(typeid),foreign key (readertype) references reader_type(typeid));在SQL Dev
19、eloper中创建数据表截图3-9所示:图3-9数据表(2)创建序列语句为了方便产生读者编号、图书编号,在数据库中分别用下列序列产生相应编号.1sql_reader:产生读者编号,起始值为1。sql_book:产生图书编号,起始值为1。create sequence seq_reader start with 1 increment by 1;create sequence seq_book start with 1 increment by 1;create sequence seq_reader_type start with 1 increment by 1;create sequenc
20、e seq_book_type start with 1 increment by 1;create sequence seq_book_class start with 1 increment by 1;create sequence seq_admin start with 1 increment by 1;在SQL Developer中创建序列截图如3-10所示:图3-10(3)插入数据语句insert into reader_type values(seq_reader_type。nextval,学生,null);insert into reader_type values(seq_r
21、eader_type。nextval,教工,null);insert into book_type values(seq_book_type。nextval,普通图书,null);insert into book_type values(seq_book_type.nextval,样本图书,null);insert into book_type values(seq_book_type。nextval,过刊,null);insert into book_type values(seq_book_type。nextval,开架书刊,null);insert into book_class val
22、ues(seq_book_class。nextval,计算机类,null);insert into book_class values(seq_book_class。nextval,管理类,null);insert into book_class values(seq_book_class。nextval,外语类,null);insert into book_class values(seq_book_class。nextval,文学类,null);insert into rule(booktype,readertype,days,num,renew,overtime) values(2,1,
23、1,3,0,1);insert into rule(booktype,readertype,days,num,renew,overtime) values(1,1,30,3,1,0。1);insert into admin values(seq_admin.nextval,admin,11);insert into admin values(seq_admin。nextval,test,22);insert into reader (readerid,name,telephone,email,right,readertype)values(seq_reader.nextval,张大为,1345
24、487676,zdwdk,0,1);insert into reader (readerid,name,telephone,email,right,readertype)values(seq_reader.nextval,王小二,1345482324,wxrdk,0,1);insert into book(bookid,bookname,author1,publish,price,booktype,bookclass,isbn) values(seq_book.nextval,计算机程序设计,writer,neusoft,35。5,1,1,445-445);insert into book(b
25、ookid,bookname,author1,publish,price,booktype,bookclass,isbn) values(seq_book。nextval,数据结构,smith,neusoft,45。5,1,1,45445445);insert into borrow(readerid,bookid,borrowdate,due)values(1,1,sysdate,sysdate+30);insert into borrow(readerid,bookid,borrowdate,due)values(2,2,sysdate,sysdate+30);insert into pr
26、econcert(readerid,bookid,predate)values(1,2,sysdate);insert into preconcert(readerid,bookid,predate)values(2,1,sysdate);commit;在SQL Developer中插入数据截图3-11所示:图3-113。3 视图设计为了方便查询读者借阅图书的情况以及图书的借阅统计,创建下列视图. | UTL_TCP。CRLF To: p_recipient | p_recipient | UTL_TCP。CRLF Subject: | p_subject | UTL_TCP.CRLF | U
27、TL_TCP.CRLF - 这前面是报头信息 | p_message; - 这个是邮件正文UTL_SMTP。open_data(v_conn); 打开流 UTL_SMTP。write_raw_data(v_conn, UTL_RAW.cast_to_raw(v_msg)); -这样写标题和内容都能用中文 UTL_SMTP。close_data(v_conn); 关闭流 UTL_SMTP。quit(v_conn); 关闭连接EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT。put_line(DBMS_UTILITY。format_error_stack); DBMS_
28、OUTPUT。put_line(DBMS_UTILITY。format_call_stack);END send_mail;在SQL Developer发送邮件的存储过程3-19所示:图3193.5 触发器设计(1)删除藏书类型的触发器。Create or replace trigger tr_delete_booktypeBefore delete on book_type for each rowbeginDelete from book where booktype=:old。typeid;Delete from rule where booktype=:old。typeid;End;在SQL Developer删除藏书类型的触发器运行3-20所示:图320(2)删除读者类型的触发器.Create or replace trigger tr_delete_readerypeBefore delete on reader_type for each rowbeginDelete from reader where readertype=:old.typeid;Delete from rule where readertype=:old。typeid;End;在SQL Developer删除读者