《网络数据库》课程综合性实验报告图书借阅系统数据库设计模板Word下载.docx
《《网络数据库》课程综合性实验报告图书借阅系统数据库设计模板Word下载.docx》由会员分享,可在线阅读,更多相关《《网络数据库》课程综合性实验报告图书借阅系统数据库设计模板Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
WindowsXP以上的操作系统、VisualBasic或其它可视化语言及SQLServer2008版本
三、实验内容及要求
1.数据库设计
要求数据库设计要合理,对数据库设计作必要的说明并抓图。
数据库名必须与自己真实姓名有关,所有同学不能同名。
图不要太大,看清即可。
2.数据表设计
要求数据表设计要合理,要符合数据库设计的理论范式,对数据表设计作必要的说明并抓图。
数据表名必须与自己真实姓名有关,所有同学不能同名。
3.视图设计
要求根据系统需求作必要的视图设计,如在一次查询中涉及到多个表,应该创建视图。
不可以只取一个表的几个字段就算创建视图。
4.索引设计
要求根据系统需求作必要的索引设计,本系统需要的聚集索引、非聚集索引、唯一索引、全文索引等。
5.数据完整性设计
根据系统需求作必要的数据完整性设计,本系统需要的实体完整性体现、域完整性体现、参照完整性体现等。
6.存储过程和触发器设计
根据系统需求作必要的存储过程和触发器设计,本系统需要的存储过程和触发器设计。
必要的存储过程和触发器设计都要写全说明,图可以是一个表的完整存储过程或触发器。
7.备份与恢复设计
根据系统需求作必要的备份与恢复设计,如需要对那些内容备份,备份策略、由谁来做备份、什么时间做备份等。
8.数据库安全设计
根据系统需求作必要的数据库安全设计,如本系统分几级用户、分别是什么角色成员具有什么操作权限等。
四、实验结果及分析
(一)设计思想
图书管理系统数据库的主要任务是对读者信息、管理员信息、图书资料信息、借阅归还图书信息、罚款信息的基本信息的操作及处理。
此系统功能分为面向读者和面向管理员两部分,其中读者可以进行借阅、续借、归还和查询书籍等操作,管理员可以完成书籍和读者信息的增加,删除和修改,对数据表维护。
根据以上功能分析,图书管理系统应该包含:
读者信息表、管理员信息表、图书信息表、借阅信息表。
针对图书管理系统目前的用户量(假设为15000人)和图书量(假设为10万册)考虑,系统主数据文件初始大小设置为:
110M(15000*512Byte(读者表一条记录大小)+100000*1024Byte(图书表一条记录大小)+其他表大小),自动增长设置为20M;
日志文件设置为:
5M,自动增长设置为5M。
考虑图书管理系统最经常的操作是查找,所以为了提高查找效率,应为图书表、读者表建立索引。
(二)具体实现
通过SQL语句来创建图书管理数据库,创建代码如下:
CREATEDATABASETSGL_133
ON
(
NAME='
TSGL'
FILENAME='
J:
\TSGL.MDF'
SIZE=110MB,
MAXSIZE=UNLIMITED,
FILEGROWTH=20MB
)
LOGON
TSGL_LOG'
\TSLG_LOG.LDF'
SIZE=5MB,
FILEGROWTH=5MB
);
根据以上对图书管理系统的功能分析,需要设计读者信息表、管理员信息表、图书信息表和借阅信息表。
(1)读者表(学号、姓名、性别、系部、专业班级、借阅数量、欠罚款、联系电话)
读者表主要记录读者信息,通过读者表可以查看读者的具体信息,如:
学号、姓名、性别、系部、专业班级、借阅数量、欠罚款等。
(2)管理员表(工号、姓名、性别、管理员身份、登陆口令、登陆密码、联系电话)
管理员表主要记录管理员信息,通过管理员表可以查询管理员信息以及用于验证管理员身份及其管理权限。
(3)图书表(图书编号、ISBN条码、书名、作者、出版社、出版日期、单价、分类、借阅状态、管藏位置)
图书表主要记录图书的各种信息,包括:
ISBN条码、书名、作者、出版社、出版日期、单价、分类、借阅状态、管藏位置。
读者可以通过查询此表得到需要的与图书相关的信息。
例如:
读者可以通过查询图书的ISBN号,查看该图书当前的借阅状态和馆藏位置等信息。
(4)借阅表(图书编号、学号、借阅日期、应还日期、归还日期、罚款金额、缴纳状态)
读者通过借阅表查询借书情况,例如:
借阅日期、应还日期、归还日期等信息。
通过SQL语句来创建图书管理数据表,创建代码如下:
USETSGL_133
GO
CREATETABLET_READER
(
学号char(12)NOTNULLPRIMARYKEY,
姓名nchar(4)NOTNULL,
性别bitNULLDEFAULT1,
系部nchar(10)NULL,
专业班级nchar(8)NULL,
借阅数量intNULLDEFAULT0,
欠罚款floatNULL,
联系电话char(11)NULL
)
CREATETABLET_ADMIN
工号char(12)NOTNULLPRIMARYKEY,
管理员身份nchar(10)NOTNULL,
登陆口令char(12)NOTNULL,
登陆密码char(16)NOTNULL,
联系电话char(11)NULL,
CREATETABLET_BOOK
图书编号intidentityPRIMARYKEY,
ISBN条码char(20)NOTNULL,
书名nchar(30)NOTNULL,
作者nchar(20)NULL,
出版社nchar(20)NULL,
出版日期dateNULL,
单价floatNULL,
分类nchar(10)NULL,
借阅状态bitNULL,
馆藏位置nchar(20)NULL,
CREATETABLET_LEND
图书编号intNOTNULL,
学号char(12)NOTNULL,
借阅日期dateNOTNULL,
应还日期dateNOTNULL,
归还日期dateNOTNULL,
罚款金额floatNULL,
缴纳状态bitNULL,
PRIMARYKEY(图书编号,学号)
(1)为了查询读者借阅情况时方便,建立读者借阅情况视图。
其字段信息包括:
学号、姓名、性别、系部、专业,班级、图书编号、借阅日期、应还日期、归还日期、罚款金额、缴纳状态
(2)建立图书借阅情况视图。
图书编号、ISBN、书名、借阅状态,借阅日期,应还日期。
(3)工作人员需要查看当前逾期未还的图书,所以需要建立逾期未还图书信息视图,其字段包括:
学号、姓名、系部、专业班级、书名、借阅日期、应还日期、罚款金额。
其中,罚款金额通过计算得出。
(4)读者需要查看图书信息,所以建立图书信息视图,其字段包括:
ISBN条码、书名、图书总量、可外借数量、馆藏位置。
其中图书总量和可外借数量通过计算得出。
(5)为数据库所有表创建单独的视图,如图书表视图、管理员表视图、借阅表视图和读者表视图。
(1)读者借阅情况视图实现代码:
CREATEVIEWREADER_LENDED_VIEW
AS
SELECTT_READER.学号,姓名,性别=(
CASEWHEN性别=1THEN'
男'
ELSE'
女'
END),系部,专业,班级,
图书编号,借阅日期,应还日期,归还日期,罚款金额,缴纳状态
FROMT_LEND,T_READER
WHERET_LEND.学号=T_READER.学号
(2)图书借阅情况视图实现代码:
CREATEVIEWBOOK_LENDED_VIEW
AS
SELECTT_BOOK.图书编号,ISBN条码,书名,借阅状态='
被借阅'
借阅日期,应还日期
FROMT_BOOK,T_LEND
WHERET_BOOK.图书编号=T_LEND.图书编号AND
借阅状态=1
(3)逾期未还图书信息视图使用getdate()函数获取系统时间;
使用借阅表中“应还日期”字段信息与系统当前日期对比判断读者借阅书籍是否超期未还;
使用datediff()函数计算读者借阅书籍的超期天数并求出相应的罚款金额。
(注:
罚款金额以超出一天罚款0.1元计算)
逾期未还图书信息视图具体实现代码如下:
CREATEVIEWNOT_RETURN_VIEW
SELECTT_LEND.学号,姓名,系部,专业班级,书名,借阅日期,应还日期,罚款金额=convert(float,datediff(day,[应还日期],CAST(LEFT(getdate(),10)ASDATE)))/10
FROMT_LEND,T_BOOK,T_READER
WHERET_LEND.学号=T_READER.学号and
T_LEND.图书编号=T_BOOK.图书编号and
归还日期ISNULLand
CAST(LEFT(getdate(),10)ASDATE)>
应还日期
上述代码运行结果如下图“图1超期未还读者”。
图1超期未还读者
(4)读者查阅图书信息视图实现代码如下:
CREATEVIEWBOOKINFO_READER_VIEW
AS
SELECTDISTINCTT_BOOK.ISBN条码,书名,图书总量,可借阅数量,馆藏位置
FROMT_BOOK,
(SELECTISBN条码,图书总量=COUNT(ISBN条码)
FROMT_BOOK
GROUPBYISBN条码)ASBOOK1,
(SELECTISBN条码,可借阅数量=COUNT(ISBN条码)
WHERE借阅状态=0
GROUPBYISBN条码)ASBOOK2
WHERET_BOOK.ISBN条码=BOOK1.ISBN条码and
T_BOOK.ISBN条码=BOOK2.ISBN条码
上述代码运行结果:
图2读者查阅图书信息视图
(5)读者表视图实现代码:
CREATEVIEWREADER_VIEW
SELECT*
FROMT_READER
管理员表视图、图书表视图和借阅表视图与上述代码类似,此处不重复列出。
4.索引的建立
为了提高搜索效率,应该为表建立相关索引。
(1)对读者表建立索引
在建立读者表时,已经对读者表的“学号”字段建立了主键索引,且其为聚集索引,为了提高对读者表的检索效率,还需要为经常查询的字段增加非聚集索引,例如为“姓名”字段建立非聚集索引。
(2)对图书表建立索引
在建立图书表时,已经对图书表的“图书编号”字段建立了主键索引,且其为聚集,为了提高对图书表的检索效率,还需要为该表添加“ISBN条码”字段和“书名”字段建立非聚集索引。
(1)为读者表建立“姓名”字段非聚集索引
图3新建读者表“姓名”字段索引
图书管理系统包括:
图书表、读者表、借阅表和管理员表。
下面分别就实体完整性、域完整性、参照完整性分析设计数据库完整性。
(1)实体完整性
图书表根据“图书编号”字段唯一表示一条记录,所以定义“图书编号”为主键来实现图书表的实体完整性。
读者表定义“学号”为主键实现实体完整性;
借阅表定义“学号”和“图书编号”两个组合字段为主键实现实体完整性;
管理员表定义“工号”实现实体完整性。
(2)域完整性
设定图书表“ISBN条码”、“书名”字段不为空,实现图书表域完整性;
设定读者表“姓名”字段设定不为空,实现读者表域完整性;
设置借阅表中“借阅日期”、“应还日期”不为空实现借阅表域完整性;
设置管理员信息表中“姓名”、“管理员身份”、“登陆口令”、“登陆密码”字段设置不为空实现管理员表域完整性。
(3)参照完整性
对读者表、借阅表和图书表建立表关系。
其中读者表与借阅表通过“学号”关联,借阅表“学号”字段参照读者表“学号”字段,是读者表的外键;
图书表与借阅表通过“图书编号”关联,借阅表的“图书编号”字段参照图书表“图书编号”字段,是图书表的外键。
图4管理员表完整性设计
图5借阅表完整性设计
图6图书表完整性设计
图7读者表完整性
图8数据表关系图
(1)存储过程设计
读者需要查询自己的借阅情况,需要建立根据学号查询该读者借阅情况;
读者需要检索图书信息,需要建立根据图书名查询图书信息。
(2)触发器设计
读者借书时,触发借阅表插入记录的触发器,执行操作包括:
填补借阅表“应还时间”字段信息,即将“应还时间”设置为“借阅时间”开始计算的后2个月的时间;
设置读者表“借阅数量字段”增加1;
设置图书表“借阅状态”字段为“true”。
读者还书时,设置读者表“借阅数量”减1;
设置该图书“借阅状态”为“false”;
判断读者“还书时间”与“应还时间”关系,如果“还书时间”超出了“应还时间”,计算罚款金额,更新到该条借阅记录的“罚款金额”字段,并将罚款金额累加到读者表该读者的“欠罚款”字段。
(1)存储过程实现
根据学号查询该读者借阅情况的存储过程实现代码:
CREATEPROCEDUREStuLendInfo_byXuehao@xuehaochar(12)
SELECTT_READER.学号,姓名,(CASEWHEN性别=1THEN'
END)AS性别,系部,
专业班级,图书编号,借阅日期,应还日期,归还日期,罚款金额,缴纳状态
FROMT_LENDINNERJOINT_READER
ONT_LEND.学号=T_READER.学号
WHERET_READER.学号=@xuehao
根据图书名查询图书信息的实现代码:
CREATEPROCEDUREBookInfo_byBoonName@booknamenchar(30)
SELECTDISTINCTT_BOOK.ISBN条码,书名,图书总量,可借阅数量,馆藏位置
FROMT_BOOK,
(SELECTISBN条码,图书总量=COUNT(ISBN条码)
T_BOOK.ISBN条码=BOOK2.ISBN条码and
书名LIKE@bookname
(2)触发器实现
借阅表插入记录的触发器实现代码:
CREATETRIGGERlend_insert
ONT_LENDAFTERINSERT
BEGIN
DECLARE@bookNumint,@readerNumnchar(12),@lendCountint,@lendDatedate
SELECT@bookNum=图书编号,@readerNum=学号,@lendDate=借阅日期
FROMinserted
SELECT@lendCount=借阅数量FROMT_READERWHERE学号=@readerNum
UPDATET_BOOKSET借阅状态=1WHERE图书编号=@bookNum
UPDATET_LENDSET应还日期=dateadd(m,2,借阅日期)
UPDATET_READERSET借阅数量=@lendCount+1WHERE学号=@readerNum
PRINT'
图书借阅状态已修改!
'
读者借阅数量已修改!
END
借阅表“归还日期”字段的触发器实现代码:
CREATETRIGGERlend_update
ONT_LENDAFTERUPDATE
IF(UPDATE(归还日期))
BEGIN
DECLARE@bookNumint,@readerNumnchar(12),
@lendCountint,@returnDatedate,@moneyfloat
SELECT@bookNum=图书编号,@readerNum=学号,@returnDate=应还日期
FROMdeleted
SELECT@lendCount=借阅数量,@money=欠罚款
FROMT_READERWHERE学号=@readerNum
UPDATET_BOOKSET借阅状态=0WHERE图书编号=@bookNum
UPDATET_READERSET借阅数量=@lendCount-1
WHERE学号=@readerNum
PRINT'
END
IF(CAST(LEFT(getdate(),10)ASDATE)>
@returnDate)
UPDATET_LENDSET罚款金额=convert(
float,datediff(day,@returnDate,CAST(LEFT(getdate(),10)ASDATE)))/10
WHERE图书编号=@bookNum
UPDATET_READERSET欠罚款=欠罚款+convert(
WHERE学号=@readerNum
设计思想:
本系统需要对管理员表、图书表、读者表和借阅表进行备份,以免因意外造成数据库丢失。
因为图书管理系统数据库数据量很大以及数据库频繁更新,所以可以考虑采取差异备份的方式。
备份每天执行一次,备份工作有系统管理员来执行。
(1)设计思想
根据图书馆里系统的使用人员,将本系统分成系统管理员、表管理员、用户三个级别。
系统管理员拥有最高权限,可以对数据库所有表进行增加、修改、删除、查询等数据库操作。
表管理员具有数据库表管理权限,可以对表进行添加记录、查询记录操作。
用户级别只有查询图书信息和借阅信息的权限。
(2)具体实现
以系统管理员身份登录数据库,打开“安全性→登录名”的“登录属性”窗口为数据库添加系统管理员权限,如下图所示,为该登录名赋予系统管理员(sysadmin)角色,其中public角色为系统默认角色。
图9添加服务器角色
五、体会
此次实验对图书管理系统的数据库设计、数据表设计、视图设计、数据完整性设计、存储过程与触发器设计、数据备份与恢复设计以及数据库安全性设计,使我对SQLserver数据库有了更深入的了解。
在使用过程中,遇到了不少困难。
例如在设计存储过程的时候,不知道如何计算读者的“罚款金额”字段数据,但是通过上网查找资料和同学的帮助解决了。
再如在设计存储过程是,对叫更新时,遗漏了WHERE条件句,结果把数据更新到了表的所以字段,结果只能对表数据从新逐条恢复。
相信这些教训对我都有很大的帮助。
为以后深入数据库学习打下良好的基础。
在今后的学习中,我会更加认真努力。
六、参考文献
郑阿奇.SQLServer实用教程(第三版)[M].北京.电子工业出版社.2009
教师评价
评定项目
A
B
C
D
数据库设计
数据完整性设计
数据表设计
存储过程和触发器设计
视图设计
备份与恢复设计
索引设计
数据库安全设计
报告规范
文字流畅
其他:
评价教师签名: