第一章 设计背景与需求分析
1.1 设计需求
(1)可随时查询书库中现有书籍的品种、数量与存放位置。所有各类书籍均可由书号惟一标识。
(2)可随时查询书籍借还情况,包括借书人单位、姓名、借书证号、借书日期和还书日期。
我们约定:任何人可借多种书,任何一种书可为多个人所借,借书证号具有惟一性。
(3)当需要时,可通过数据库中保存的出版社的电报编号、电话、邮编及地址等信息向相应出版社增购有关书籍。我们约定,一个出版社可出版多种书籍,同一本书仅为一个出版社出版,出版社名具有惟一性。
1.2 设计背景
1.2.1 图书管理的现状
图书馆作为一种资源的集散地,图书和用户在借阅资料繁多,包含很多的信息管理,现在有很多的图书馆都是初步的开始使用,甚至尚未使用计算机进行资源管理,没有建立相对应的图书管理数据系统,而是使用人工计算,抄写进行,数据处理工作量大,容易出错和数据丢失。
1.2.2 选题的目的、意义
图书管理系统数据库有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好,成本低等等。这些优点能极大提高图书管理的效率,因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统是十分必要的。
1.3 系统开发环境
1、系统:Windows10
2、开发平台:Microsoft SQL Server 2019
第二章 数据库概念结构设计
2.1 实体型结构
2.1.1 实体确定与分析
我们对题目进行了一段时间的分析,并在讨论后得出,此系统应该具备以下实体及属性。
实体与其属性对应如下:
读者:借书证号、姓名、性别、年龄、借书人单位
书:书号、书名、标价(损坏或丢失书籍时的赔偿价格)、作者、借阅次数
出版社:电报编号、出版社名字、地址、邮编、电话
书库:书库号、书籍的品种(即书库的分类大区)
管理员:管理员编号、姓名、性别
2.1.2 实体属性图
2.2 实体间的联系
2.2.1 实际条件(题设条件已经省略)
我们假定:
一个管理员只管一个书库;每个书库位置分开,且读者借阅书籍时只能在书籍所属的书库登记;一个读者一次只能借阅一本书,即要归还前一本书才能借后一本书;一般入库书籍是5本,特殊情况更新存取表;
2.2.2 联系
1.一个出版社对应多本书,一个本书对应一个出版社,出版社和书是一对多联系。
2.读者、管理员和书三者之间是多对多的关系,即一个读者对应多本书,一个管理员对应不同书的读者,一本书对应多个读者。
3.一个书库对应多本书,一本书对应一个书库,书库和书之间是一对多联系。
4.一个管理员对应一个书库,一个书库对应一个管理员,管理员和书库之间是一对一联系。
2.3 E-R图
第三章 数据库逻辑结构设计
3.1 E-R图向关系模式转换的原则
- 一个实体型转换为一个关系模式。
关系的属性:实体型的属性
关系的码:实体型的码
2.一个1:1联系可以转换为一个独立的关系模式,也可以与任何一端对应的关系模式合并。
3.一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式 合并。
4.一个m:n联系转换为一个关系模式。
5.三个或三个以上实体间的一个多元联系可以转换为一个关系模式。
6.具有相同码的关系模式可合并。
目的:减少系统中关系个数
7.同一实体集的实体之间的联系即自联系,也可以按1:1,1:n和m:n三种情况分别处理。
3.2 E-R图向关系模型的转化与关系模型的优化
3.2.1 模型优化概念
数据库逻辑设计的结果不是唯一的。为了进一步提高数据库应用系统的性能,还应该根据应用需要适当地修改、调整数据模型的结构,这就是数据模型的优化。
3.2.2 优化方法
1.确定数据依赖。
2.对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。
3.按照数据依赖的理论对关系模式逐一进行分析,考察是否存在部分函数依赖、传递函数依赖、多值依赖等,确定各关系模式分别属于第几范式。
4.根据需求分析阶段得到的处理要求分析对于这样的应用环境这些模式是否合适,确定是否要对某些模式进行合并或分解。
5.对关系模式进行必要分解,提高数据操作效率和存储空间利用率。常用的两种分解方法是水平分解和垂直分解。
3.2.3 模型优化后的关系模式图
3.3 视图结构
3.3.1 设计需求(1)视图
3.3.2 设计需求(2)视图
3.3.3 设计需求(3)视图
3.3.4 借阅次数前五的书视图
3.3.5 管理员操作记录视图
第四章 数据库物理结构设计
4.1 索引的设计原则
(1)如果一个(或一组)属性经常在查询条件中出现,则考虑早这个(或这组)属性建立索引。
(2)如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑这个属性上建立索引。
(3)如果一个(或一组)属性经常在连接操作的连接条件中出现,则考虑在这个(或这组)属性上建立索引。
4.2 索引与视图的关系
视图是通过索引查询表而的出结果的,表建立了索引,查询速度会提高
索引:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
视图:数据库中的视图,是一个虚拟表,其内容由查询定义。
4.3 索引结构设计
第五章 数据库实施
5.1 建表语句
5.1.1 出版社表
--出版社表-1
create table 出版社(
电报编号 char(10) primary key,--主键
出版社名称 varchar(20) not null,
地址 varchar(20) not null,
电话 char(20) not null unique,
邮编 char(20) not null
)
go
--调试(记录会在正式测试时清除)
insert into 出版社(电报编号,出版社名称,地址,电话,邮编) values('000','测试','养根楼','173821068830','417000')
select * from 出版社
5.1.2 管理员表
--管理员表-2
create table 管理员(
--管理员离职更新名字、性别即可
管理员编号 int identity(1,1) check(len(管理员编号)<=2) primary key,
--主键;管理员编号初始值为1,递加也为1
姓名 char(10) not null,
性别 char(2) check (性别 in ('男','女'))
)
go
--调试(记录会在正式测试时清除)
insert into 管理员(姓名,性别) values('刘志强','男')
delete from 管理员 where 管理员编号=1
select * from 管理员
5.1.3 读者表
--读者表-3
create table 读者(
借书证号 int identity(220000,1) check(len(借书证号)<230000) primary key,--主键;借书证号初始值为220000,递加也为1
姓名 char(10) not null,--220000前两位为年份可自己修改
性别 char(2) check (性别 in ('男','女')),
年龄 int check (len(年龄)<=3),
借书人单位 varchar(20),
)
go
--调试(记录会在正式测试时清除)
insert into 读者(姓名,性别,年龄,借书人单位) values('刘志强','男',21,'湖南人文科技学院')
delete from 读者 where 借书证号=220001
select * from 读者
5.1.4 书库表
--书库表-4
create table 书库(
书库号 int check(len(书库号)<=2) primary key,--主键
书籍品种 char(20)unique not null,
管理员编号 int not null,--外键--保证一个管理员管一个书库
check(书库号=管理员编号),--保证一个管理员管一个书库
foreign key(管理员编号) references 管理员(管理员编号)
)
go
--调试(记录会在正式测试时清除)
insert into 书库(书库号,书籍品种,管理员编号) values(1,'sdd54ss',1)
delete from 书库 where 书库号=6
select * from 书库
5.1.5 书表
--书表-5
create table 书(
书号 int identity(1,1) primary key,
--主键;书号初始值为1,递加也为1
书名 char(20) not null,
标价 numeric(6,2) not null,
作者 varchar(10) not null,
电报编号 char(10) not null,--外键
管理员编号 int,--外键
借阅次数 int default 0,--初始值默认为0
foreign key(电报编号) references 出版社(电报编号),
foreign key(管理员编号) references 管理员(管理员编号)
)
go
--调试(记录会在正式测试时清除)
insert into 书(书名,标价,作者,电报编号,管理员编号) values('数据库',99.99,'xxx','000',1)
delete from 书 where 书号=1
select * from 书
5.1.6 借阅表
--借阅表-6
create table 借阅(
借书证号 int,--主属性、外键
书号 int,--主属性、外键
管理员编号 int,
借书日期 datetime default getdate(),
--主属性;借书日期为系统时间
还书日期 datetime default dateadd(day,7,getdate()),
--第一次借书还书日期为七天后,可提前还书
违规罚款 numeric(6,2) default 0,
--罚款金额长度为6,精度为2,默认数值为0
续借 int default 0 check (续借<=4),
--每次续借可多借7天,最多续借4次,默认0次
是否还款 char(2) default '是' check (是否还款 in ('是','否')),
--借书时默认为'是'
是否还书 char(2) default '否' check (是否还书 in ('是','否')),
--借书时默认填否,还书时改回来
check(还书日期>=借书日期),--保证还书日期小于借书日期
primary key(借书证号,书号,借书日期),
foreign key(借书证号) references 读者(借书证号)on delete cascade on update cascade,--级联删除、更新
foreign key(书号) references 书(书号)on delete cascade on update cascade,--级联删除、更新
foreign key(管理员编号) references 管理员(管理员编号)
)
go
--调试(记录会在正式测试时清除)
insert into 借阅(借书证号,书号,管理员编号) values(220000,6,1)
update 借阅
set 是否还款='是'
where 借书证号=220000
select * from 借阅
update 借阅
set 是否还书='是'
where 借书证号=220000 and 书号=6
update 借阅
set 续借=1
where 借书证号=220002 and 书号=4
5.1.7 存取表
5.2 建视图语句
5.2.1 视图1
5.2.2 视图2
5.2.3 视图3
5.2.4 借阅次数前五的书视图
5.2.5 管理员操作记录视图
5.3 索引
5.4 触发器
5.4.1 触发器——入库
5.4.2 触发器——借阅数据保护
5.4.3 触发器——借书
5.4.4 触发器——还款
5.4.5 触发器——还书
5.4.6 触发器——续借管理
第六章 测试数据
6.1 完整的测试数据
6.1.1 出版社
6.1.2 管理员
6.1.3 读者
6.1.4 书库
6.1.5 书
6.2 触发器测试
6.2.1 触发器——入库测试
6.2.2 触发器——借阅数据保护
6.2.3 触发器——借书测试
6.2.4 触发器——还款测试
6.2.5 触发器——还书测试
6.2.6 触发器——续借管理测试
6.3 测试视图
6.3.1 视图1测试
6.3.2 视图2测试
6.3.3 视图3测试
6.3.4 借阅次数前五的书测试
6.3.5 管理员操作记录测试
6.4 数据库操作管理
第七章 设计总结
7.1 遇到的主要问题和解决方法
7.2 进一步改进的设想
7.3 课程设计体会
7.4 学习数据库系统原理后的体会 ————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_52373338/article/details/125497446