《数据库原理及应用》课程设计报告.doc
《《数据库原理及应用》课程设计报告.doc》由会员分享,可在线阅读,更多相关《《数据库原理及应用》课程设计报告.doc(17页珍藏版)》请在冰点文库上搜索。
信息技术学院
《数据库原理及应用》课程设计报告
专业:
计算机科学与技术
班级:
姓名:
学号:
设计题目:
图书管理系统
2012年12月28日至2013年1月3日
一、系统需求分析
1.1从读者角度考虑的数据流程图
图2.1业务流程图
1.2图书管理系统数据流程图
图2.2顶层数据流
顶层数据流图:
第2层数据流图:
(读者借阅,读者还书,读者查询,管理员查询,管理员修改)
第3层数据流图:
(读者借阅)
第3层数据流图:
(读者还书)
第3层数据流图:
(查询图书信息,查询读者信息,查询借阅历史,查询罚款信息)
第3层数据流图:
(管理员添加、删除、修改图书信息)
第3层数据流图:
(管理员添加、删除、修改读者信息)
1.3图书管理系统数据字典
表1-1 Book书籍信息表
表中列名
数据类型
可否为空
说明
BookID
varchar
notnull(主键)
图书编号
ISBN
varchar
notnull
索书号
SPlace
varchar
notnull
存放位置
State
varchar
Notnull
当前状态
表1-2 Reader读者信息表格
表中列名
数据类型
可否为空
说明
RID
varchar
notnull(主键)
读者借书证号
Name
varchar
notnull
读者姓名
Tel
varchar
notnull
读者电话
Email
varchar
notnull
读者邮箱
BNumber
Int
notnull
可借书数
表1-3Manager管理员信息表格
表中列名
数据类型
可否为空
说明
MID
varchar
notnull(主键)
工号
Name
varchar
notnull
姓名
RoomID
varchar
馆室号
表1-4 CIP书目信息表
表中列名
数据类型
可否为空
说明
ISBN
Varchar
Notnull(主键)
索书号
bookname
Varchar
Notnull
书籍名称
Author
Varchar
Null
书籍作者
Pyear
Char
Null
出版年月
Publisher
Varchar
Null
出版者
Number
Int
Null
册数
表1-5 Borrow借阅记录信息表
表中列名
数据类型
可否为空
说明
RID
Varchar
Notnull(外主键)
读者借阅证编号
BookID
Varchar
Notnull(外主键)
书籍编号
BDate
Datetime
Notnull
读者借书时间
SRDate
Datetime
Notnull
应还日期
ISBN
Varcher
Notnull(外键)
索书号
表1-6 History借阅历史信息表
表中列名
数据类型
可否为空
说明
BookID
Varchar
Notnull(外主键)
读者借阅证编号
RID
Varchar
Notnull(外主键)
书籍编号
RDate
datetime
Notnull
读者还书时间
BDate
Datetime
Notnull
读者借书日期
表1-7 fine罚款记录信息表
RID
varchar
Notnull(外主键)
读者借书证编号
ClState
Datetime
null
是否缴纳罚金
BookID
varchar
Notnull(外主键)
书籍编号
SRDate
Datetime
Notnull
书籍名称
Fine
varchar
Null
罚款金额
BDate
datetime
NotNull
借阅时间
MID
Varcher
Notnull(外键)
工号
RDate
Datetime
Notnull
还书日期
表1-8 room馆室信息表
表中列名
数据类型
可否为空
说明
RoomID
Varchar
Notnull(主键)
馆室编号
RoomName
Varchar
Notnull
馆室名
表1-9 Appiontmnet预约信息表
表中列名
数据类型
可否为空
说明
ISBN
Varchar
Notnull(外主键)
索书号
RID
Varchar
Notnull(外主键)
读者编号
BDate
Datetime
Null
借阅日期
MID
Datetime
Notnull(外键)
工号
Applimit
Varchar
Null
预约时间限制
RDate
Datetime
Null
归还日期
二、概念结构设计
可以用E/R模型表述该模型的设计,E/R图如图所示。
读者
姓名
电话
ID
Email
罚款
借阅历史
管理员
工号
姓名
属于
借阅
预约
可借书数
图书
ID
ISBN
存放位置
State
属于
对应
管理
归还
读者
CIP
册数
ISBN
书名
作者
出版商
出版年月
资料室
拥有
RoomID
RoomName
m
n
n
1
1
n
m
m
n
n
n
m
n
1
1
n
1
n
三、逻辑结构设计
通过E/R模型到关系模型的转化,可以得到如下关系模式:
(一)各E-R图各实体的属性如下所示
1、图书:
Book(BookID,ISBN,SPlace,State)
2、读者:
Reader(RID,Name,Tel,Email,BNumeber)
3、管理员:
Manager(MID,Name,RoomID)
4、书目:
CIP(ISBN,BookName,Author,Publisher,Pyear,Number)
5、馆室:
Room(RoomID,RoomName)
(二)各E-R图中联系的属性如下所示:
6、借阅信息:
Borrow(BookID,RID,BDate,SRDate)
7、借阅历史:
History(BookID,RID,BDate,RDate)
8、罚款信息:
Fine(RID,BookID,BDate,RDate,Fine,CLState,MID)
9、预约信息:
Appiontmnet(RID,ISBN,RDate,AppLimit,MID)
3.1.1将E-R图转换为关系模型
实体型转换为关系模式。
实体的属性就是关系的属性,实体的码就是关系的码。
对于实体间的联系则有以下不同的情况:
一个m:
n联系转换为一个关系模式。
与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为各实体码的组合。
一个1:
n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
一个1:
1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
三个或三个以上实体间的一个多元联系可以转换为一个关系模式。
与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为各实体码的组合
具有相同码的关系模式可合并。
由于图书与CIP、资料室与图书的联系方式是1:
n(一对多),可以将其之间的联系与n端实体CIP、图书合并,管理员与图书之间的维护联系也是1:
n(一对多),同样也将其之间的联系与n端实体合并,而读者与图书之间的借阅和归还联系方式则是n:
m(多对多),这样要把它们之间的联系转化为独立的关系模式,读者与管理员之间的罚款联系是m:
n(多对多),将其联系也转化成独立的关系模式,具体的基本E-R图向关系模型的转化如下:
图书:
Book(BookID,ISBN,SPlace,State)
读者:
Reader(RID,Name,Tel,Email,BNumeber)
管理员:
Manager(MID,Name,RoomID)
书目:
CIP(ISBN,BookName,Author,Publisher,Pyear,Number)
馆室:
Room(RoomID,RoomName,)
借阅信息:
Borrow(BookID,RID,BDate,SRDate)
借阅历史:
History(BookID,RID,BDate,RDate)
罚款信息:
Fine(RID,BookID,BDate,SRDate,RDate,Fine,CLState,MID)
预约信息:
Appiontmnet(RID,ISBN,RDate,AppLimit,MID)
(注:
标有直线下划线的为主属性,标有波浪线下划线的是外键属性,主属性与外键属性一起构成主码)
3.2.1模型优化
关系模式Book,Reader,Room,Maneger,CIP,Room不存在非主属性对主属性的部分函数依赖,也不存在传递函数依赖,已经达到了3NF,但是借阅关系模式、借阅历史关系模式、罚款关系模式及预约信息模式(Borrow,History,Fine,Appontment)中存在着一些数据冗余,现将四个关系模型进行合并,消除冗余,优化为:
借阅信息:
Borrow(BookID,RID,ISBN,BDate,RDate,SRDate,Fine,AppLimitCLStaete,MID)
四、系统实现(SQL编程)
4.1.1建立视图
1、建立Book表
CREATETABLEBook
(
BookIDvarchar(20)PRIMARYKEY,
ISBNvarchar(50)NOTNULL,
SPlacevarchar(50)NOTNULL,
Statechar
(2)
);
2、建立Reader表
CREATETABLEReader
(
RIDvarchar(10)PRIMARYKEY,
Namevarchar(18)NOTNULL,
Telvarchar(18)NOTNULL,
Emailvarchar(18)NOTNULL,
BNumberintcheck(BNumber<=10andBNumber>=0)default10,--可借书的数量
);
3、建立CIP表
CREATETABLECIP
(
ISBNvarchar(10)PRIMARYKEY,
BookNamevarchar(20)NOTNULL
Authorvarchar(20)
Publishervarchar(50),
Pyearchar(8)
Numberintcheck(Number>=0)
);
4、建立Manager表
CREATETABLEManager
(
MIDvarchar(8)PRIMARYKEY,
Namevarchar(18)NOTNULL,
RoomIDvarchar(18)
CONSTRAINTFK_Manager_RoomID
FOREIGNKEY(RoomID)REFERENCESRoomID(RoomID),
);
5、建立Room表
CREATETABLERoom
(
RoomIDvarchar(8)PRIMARYKEY,
RoomNamevarchar(18)NOTNULL,
);
6、建立Borrow表
CREATETABLEBorrow
(
BookIDvarchar(20)NOTNULL,
RIDvarchar(10)NOTNULL,
ISBNvarchar(50)NOTNULL,
BDatedatetimeNOTNULL,
SRDatedatetimeNOTNULL,
primarykey(BookID,RID),
CONSTRAINTFK_Borrow_BookID
FOREIGNKEY(BookID)REFERENCESBook(BookID),
CONSTRAINTFK_Borrow_ISBN
FOREIGNKEY(ISBN)REFERENCESCIP(ISBN),
CONSTRAINTFK_Borrow_RID
FOREIGNKEY(RID)REFERENCESReader(RID)
);
7、建立History表
CREATETABLEHistory
(
BookIDvarchar(20)NOTNULL,
RIDvarchar(10)NOTNULL,
BDatedatetimeNOTNULL,
RDatedatetimeNOTNULL,
primarykey(BookID,RID),
CONSTRAINTFK_History_BookID
FOREIGNKEY(BookID)REFERENCESBook(BookID),
CONSTRAINTFK_History_RID
FOREIGNKEY(RID)REFERENCESReader(RID)
);
8、建立Fine表
CREATETABLEFine
(
RIDvarchar(20)NOTNULL,
MIDvarchar(8)NOTNULL,
BookIDvarchar(20)NOTNULL,
BDatedatetimeNOTNULL,
SRDatedatetimeNOTNULL,
RDatedatetimeNOTNULL,
Finevarchar(20)
CLStatechar(8),
primarykey(BookID,RID),
CONSTRAINTFK_Fine_RID
FOREIGNKEY(RID)REFERENCESReader(RID),
CONSTRAINTFK_Fine_MID
FOREIGNKEY(MID)REFERENCESManager(ID),
CONSTRAINTFK_Fine_BookID
FOREIGNKEY(BookID)REFERENCESBook(BookID)
);
9、建立Appiontmnet表
CREATETABLEAppiontmnet
(
RIDvarchar(8)NOTNULL,
MIDvarchar(6)NOTNULL,
ISBNvarchar(20)NOTNULL,
RDatedatetime
BDatedatetime
AppLimitvarchar(20)default‘10’
primarykey(ISBN,RID),
CONSTRAINTFK_Appiontment_RID
FOREIGNKEY(RID)REFERENCESReader(ID),
CONSTRAINTFK_Appiontment_MID
FOREIGNKEY(MID)REFERENCESManager(ID),
CONSTRAINTFK_RETURN_ISBN
FOREIGNKEY(ISBN)REFERENCESCIP(ISBN)
);
4.1.2建立视图
(1)用于查询图书基本信息的视图定义如下:
createviewBookview(索书号,书号,书名,出版社,册数,存放位置,当前状态)
as
selectCIP.ISBN,BookID,BookName,Publisher,Number,Splace,State
fromCIP,Book
whereCIP.ISBN=Book.ISBN
(2)用于读者基本信息查询的视图定义如下:
createviewReaderview(读者姓名,编号,电话,邮箱)
as
selectName,RID,Tel,Email
fromReader
(3)用于显示当前借阅基本信息的视图定义如下:
createviewBorrowview(读者编号,书名,作者,借阅日期,到期日期)
as
selectRID,BookName,Author,BDate,SRDate
fromBorrow,CIP
whereBorrow.ISBN=CIP.ISBN
(4)用于借阅历史信息查询的视图定义如下:
createviewHistoryview(读者编号,书名,借阅日期,应还日期)
as
selectBorrow.RID,BookName,BDate,SRDate
fromBorrow,CIP,Reader
whereBorrow.RID=Reader.RID
(5)用于查询罚款信息的视图定义如下:
createviewFineview(读者编号,书名,借阅日期,归还日期,罚款,处理状态)
as
selectBorrow.RID,BookName,Borrow.BDate,RDate,Fine,CLState
fromBorrow,CIP,Fine
whereBorrow.ISBN=CIP.ISBNandFineisnotnull
(6)用于预定信息的视图如下:
CreateviewAppiontmentview(读者编号,索书号,预约时间,预约期限天)
As
SelectAppiontment.RID,Appiontment.ISBN,BDate,Applimit
FromAppiontment,CIP
WhereAppiontment.ISBN=CIP.ISBNand
CIP.Numberisnull/*当某书目可借书数量为零时*/
4.1.3建立触发器
本系统创建了三个触发器,它们分别实现删除图书、统计图书可借数量、借阅图书信息的功能。
其代码如下。
1创建删除图书的触发器
createtriggerdeletebook
onBookinsteadofdelete
as
deletefromBorrowwhereRIDin(selectRIDfromdeleted)
deletefromBookwhereidin(selectBookIDfromdeleted)
2创建统计图书可借数量的触发器
createtriggerReadercountable
onBorrowafterinsert
as
updateReadersetBNumber=BNumber-1whereRIDin(selectRIDfrominserted)
--借书后用户的可借数量减1—
3创建借阅图书信息功能的触发器
/*借书管理,当在中增加一条借阅记录时,使该图书的状态由“未借”变为“已借出*/
createtriggerBorrow_insert1
onBorrow
forinsert
as
declare@BookIDchar(9)
select@BookID=BookID
frominserted
updateBook
setState='已'/*已借出*/
whereBookID=@BookID
/*验证*/
insertintoBorrowvalues('07','04','806','2012-2-4','2012-4-4')
4还书管理
/*还书管理(举实例论证,预约功能在上一触发器中实现)*/
BEGINTRANSACTION
INSERTINTOHistory(BookID,RID,BDate,RDate)
VALUES('11','02','2012-4-6','2012-4-8')
UPDATEBOOKSETState='0'WHEREBookID='11'
COMMIT;
5自动计算罚金公式
/*若超过时间限制,计算罚金公式*/
/*1.把没归还日期的归还日期改为系统时间*/
UPDATEHistorySETRDate=getdate()whereRDateisnulll
/*2.假设有个可借天数字段天*/
updateFinesetfine=(datediff(day,'2012-3-1','2012-6-3')-60)*0.2
/*没有可借天数的话把-可借天数以及外面的一对括号删除*/
4.1.4管理员操作
1)入库管理:
/*入库管理,新书入库*/
insertintoCIP(ISBN,BookName,Number,Author,Publisher,Pyear)
values(813,'中外通史',5,'方严','高教','2007.5')
/*旧书入库*/
updateCIP
setNumber=Number+1
whereISBN='805'
2)增加读者:
INSERTINTOReader(RID,Name,Tel,Email,BNumber)VALUES(#RID,#Name,#Tel,#BNumber);
3)删除读者:
DELETEFROMReaderWHERE(RID=#RID);
4)修改读者信息:
UPDATEReaderSETName=#Name,Tel=#TelWHERE(RID=#RID);
5)增加书籍:
INSERTINTOCIP(ISBN,BookName,Author,Publisher,Pyear,Number)VALUES(#ISBN,#BookName,#Author,#Publisher,#Pyear,#Number);
6)删除书籍:
DELETEFROMBookWHERE(BookID