首页 > 数据库 >数据库设计

数据库设计

时间:2022-09-18 22:44:21浏览次数:82  
标签:varchar 数据库 book 设计 借阅 tb id 图书

任务一、业务描述

图书管理员功能:
(一)图书管理功能:
1.对图书库中的图书入库操作
2.删除图书库中的图书
3.查询图书库中的图书
4.修改图书编号或类别

(二)信息维护功能:
1.查看图书操作记录信息
2.查看或修改读者信息

读者功能:
1.录入及修改个人信息
2.借阅图书
3.归还图书
4.查看借阅状态

任务二、数据流图与数据字典

第0层

第1层

第2层


数据字典
数据流编号:DE001
数据流名称:图书信息
简述:图书基本信息
数据流来源:图书购买后,由图书管理员整理编码后录入计算机
数据流去向:存入数据库(图书信息表)
数据项组成:编号+书名+作者+出版社+类别+价格
处理框:
功能名称1.1:图书信息录入
功能描述:记录新增的图书名称、类别、编号等数据项
功能名称1.2:图书信息删除
功能描述:删除图书馆中不存在或丢失的图书编号、书名等信息
功能名称1.3:图书信息查询
功能描述:查询图书的编号、书名、作者等信息
功能名称1.4:图书信息修改
功能描述:修改图书馆中存在的图书编号、书名、作者等图书信息,更新未被归还或未被借阅的图书信息

数据流编号:DE002
数据流名称:读者信息
简述:读者信息
数据项组成:个人基本信息+借阅记录+违规记录+借书权限
数据项条目
数据项名称:个人基本信息
组成:卡号+姓名+个人已借图书量
数据项名称:借阅记录
组成:图书编号+书名+借阅时间+归还时间
数据项名称:违规记录
组成:违规原因(遗失书籍或超时)+应缴罚金
数据项名称:借书权限
组成:是否还能借书
处理框:
功能名称2.1:读者信息录入
功能描述:记录借阅者的个人基本信息,借阅记录、违规记录、借书权限等信息
功能名称2.2:是否借阅判断
功能描述:根据录入的借阅者信息判断是否应借于其阅读及应该归还的时间

数据流编号:DE003
数据流名称:借阅规则
简述:借阅规则
数据流来源:由图书管规定
数据项组成:单次借书时长+遗失赔偿+借书限额+续借时长
数据项条目
数据项名称:单次借书时长
取值范围:0—30天
数据项名称:遗失赔偿
简述:遗失的书3倍赔偿书价
数据项名称:借书限额
取值范围;1—3本
数据项名称:续借时长
简述:单次续借时长加15天
处理框:
功能名称3.1:图书管理员操作记录查询
功能描述:查询图书管理员对图书信息或读者信息的操作记录
功能名称3.2:读者信息及借阅权限查询
功能描述:查询读者信息及是否能借阅图书的权限
功能名称3.3:违约信息处理
功能描述:查询或修改借阅者的违约记录
功能名称3.4:借阅规则修改
功能描述:修改借阅图书的期限、方式等规则

数据流编号:D1
数据流名称:图书库
简述:图书库
数据项组成:图书余量+图书信息

数据流编号:D2
数据流名称:借阅信息
简述:借阅信息
数据项组成:借者+图书+期限

数据流编号:D3
数据流名称:图书操作记录
数据项组成:操作记录号+操作方式+操作时间+操作管理员ID

数据流编号:D4
数据流名称:读者信息
数据流来源:学生本人录入个人信息
数据项组成:个人信息+违规处理

三、E-R图

分E-R图:







总E-R图:

初步E-R图:

四、逻辑结构设计

图书管理员(管理员编号,管理员姓名,管理员账号,管理员密码)
主码为管理员编号。

管理(管理员编号,操作记录号,图书编号,操作方式,操作时间)
主码为管理员编号、操作记录号、书号,
其中,管理员编号为外码,参照图书管理员表中的管理员编号;操作记录号为外码,参照操作记录表中的操作记录号;图书编号为外码,参照图书表中的图书编号。

图书册(书册号,图书名称,图书现存量,图书总数)
主码为书册号、图书名称。
其中,图书名称为外码,参照图书表中的图书名称。

图书(图书编号,图书名称,图书价格,图书类别,图书作者,图书出版社)
主码为图书编号。

操作记录(操作记录号,操作对象)
主码为操作记录号。

读者(卡号,姓名,借书权限,个人已借书量,代缴罚款金额)
主码为卡号。

续借(读者卡号,图书编号,续借日期,续借时长)
主码为读者卡号、图书编号。
其中,读者卡号为外码,参照读者表中的卡号;图书编号为外码,参照图书表中的图书编号。

借阅(读者卡号,图书编号,借书时间,归还时间)
主码为读者卡号、图书编号。
其中,读者卡号为外码,参照读者表中的卡号;图书编号为外码,参照图书表中的图书编号。

归还(读者卡号,图书编号,借阅时间,归还时间)
主码为读者卡号、图书编号。
其中,读者卡号为外码,参照读者表中的卡号;图书编号为外码,参照图书表中的图书编号。

五、数据库实施阶段

1.sql语句:

/*创建图书馆数据库*/
create database Library;

/*创建管理员信息表*/
create table tb_administrator
(
	ad_id varchar(12) primary key,
	ad_pwd varchar(16),
	ad_name varchar(10),
	ad_account varchar(16),
)

/*读者信息表*/
create table tb_reader
(
	rd_id varchar(12) primary key,
	rd_name varchar(20),
	rd_borrow bit default 1,
	rd_booked int default 0,
	rd_fine float default 0
)

/*图书信息表*/
create table tb_book
(
	book_id varchar(10) primary key,
	book_name varchar(50),
	book_price float,
	book_type varchar(20),
	book_author varchar(20),
	book_press varchar(20)
)

/*操作记录表*/
create table tb_operate
(
	op_id int primary key identity(1,1),
	op_object varchar(10)
)

/*管理表*/
create table tb_manage
(
	mag_id int primary key identity(1001,1),
	ad_id varchar(12),
	book_id varchar(10),
	mag_way varchar(10),
	mag_date datetime,
	foreign key(ad_id) references tb_administrator(ad_id),
	foreign key(book_id) references tb_book(book_id)
)

/*图书册表*/
create table tb_booklet
(
	booklet_id varchar(10),
	book_name varchar(50),
	book_stock int,
	book_total int,
	primary key(booklet_id,book_name)
)

/*借阅表*/
create table tb_borrow
(
	br_id int primary key identity(1,1),
	rd_id varchar(12),
	book_id varchar(10),
	br_borrowdate datetime,
	br_backdate datetime,
	foreign key(rd_id) references tb_reader(rd_id),
	foreign key(book_id) references tb_book(book_id)
)


/*续借表*/
create table tb_renew
(
	rd_id varchar(12),
	book_id varchar(10),
	br_date datetime,
	br_time datetime,
	primary key(rd_id,book_id),
	foreign key(rd_id) references tb_reader(rd_id),
	foreign key(book_id) references tb_book(book_id)
)

/*索引*/
/*管理员编号索引*/
create index index_ad_id on tb_administrator(ad_id)

/*管理员姓名索引*/
create index index_ad_name on tb_administrator(ad_name)

/*管理员账号索引*/
create index index_ad_account on tb_administrator(ad_account)

/*操作方式索引*/
create index index_mag_way on tb_manage(mag_way)

/*书册号索引*/
create index index_booklet_id on tb_booklet(booklet_id)

/*图书编号索引*/
create index index_book_id on tb_book(book_id)

/*图书名称索引*/
create index index_book_name on tb_book(book_name)

/*图书类别索引*/
create index index_book_type on tb_book(book_type)

/*图书作者索引*/
create index index_book_author on tb_book(book_author)

/*图书出版社索引*/
create index index_book_press on tb_book(book_press)

/*读者卡号索引*/
create index index_rd_id on tb_reader(rd_id)

/*读者姓名索引*/
create index index_rd_name on tb_reader(rd_name)

/*存储过程*/
/*添加管理员信息*/
create procedure insert_administrator
(	
	@ad_id varchar(12),
	@ad_pwd varchar(16),
	@ad_name varchar(10),
	@ad_account varchar(16)
)
as
begin
	/*添加管理员*/
	insert 
	into tb_administrator
	values(@ad_id,@ad_pwd,@ad_name,@ad_account)
	/*查询该管理员*/
	select *
	from tb_administrator
	where ad_id=@ad_id
end;
/*执行存储过程*/
/*exec insert_administrator*/

/*添加读者信息*/
create procedure insert_reader
(
	@rd_id varchar(12),
	@rd_name varchar(20)
)
as
begin
	/*添加读者*/
	insert 
	into tb_reader
	values(@rd_id,@rd_name,1,0,0)
	/*查询该读者*/
	select *
	from tb_reader
	where rd_id=@rd_id
end;
/*执行存储过程*/
/*exec insert_reader*/

/*添加图书信息*/
create procedure insert_book
(
	@ad_id varchar(12),
	@book_id varchar(10),
	@book_name varchar(20),
	@book_price float,
	@book_type varchar(20),
	@book_author varchar(20),
	@book_press varchar(20),
	@booklet_id varchar(10),
	@book_total int
)
as
begin
	declare @mag_date datetime
	/*获取当前时间*/
	set @mag_date=getdate()
	/*添加图书*/
	insert 
	into tb_book
	values(@book_id,@book_name,@book_price,@book_type,@book_author,@book_press)
	/*将该图书添加到图书册*/
	insert
	into tb_booklet
	values(@booklet_id,@book_name,@book_total,@book_total)
	/*将该操作放入管理表*/
	insert
	into tb_manage
	values(@ad_id,@book_id,'添加图书',@mag_date)
	/*查询该图书*/
	select *
	from tb_book
	where book_id=@book_id
end;
/*执行存储过程*/
/*exec insert_book*/

/*借阅图书*/
create procedure borrow
(
	@rd_id varchar(12),
	@book_name varchar(20)
)
as
begin
	declare @br_borrowdate datetime
	declare @book_id varchar(10)
	/*获取图书编号*/
	set @book_id=(select book_id from tb_book where @book_name=book_name)
	/*获取当前时间*/
	set @br_borrowdate=getdate() 
	/*图书册现存图书量-1*/
	update tb_booklet
	set book_stock=book_stock-1
	where book_name=@book_name;
	/*在借阅表中写入借阅记录*/
	insert 
	into tb_borrow
	values(@rd_id,@book_id,@br_borrowdate,null)
	/*查看个人借阅记录*/
	select *
	from tb_borrow
	where rd_id=@rd_id and book_id=@book_id
	/*读者个人已借书量+1*/
	update tb_reader
	set rd_booked=rd_booked+1
	where rd_id=@rd_id
end;
/*执行存储过程*/
/*exec borrow*/

/*归还图书*/
create procedure recede
(
	@rd_id varchar(12),
	@book_name varchar(20)
)
as
begin
	declare @br_backdate datetime
	declare @book_id varchar(10)
	/*获取图书编号*/
	set @book_id=(select book_id from tb_book where @book_name=book_name)
	/*获取当前时间*/
	set @br_backdate=getdate() 
	/*图书册现存图书量+1*/
	update tb_booklet
	set book_stock=book_stock+1
	where book_name=@book_name;
	/*在借阅表中修改归还时间*/
	update tb_borrow
	set br_backdate=@br_backdate
	where rd_id=@rd_id and book_id=@book_id
	/*查看个人借阅记录*/
	select *
	from tb_borrow
	where rd_id=@rd_id and book_id=@book_id
end;
/*执行存储过程*/
/*exec recede*/

2.备份方案

采用自动(完整备份+差异备份+事务日志备份)的备份方式
详细备份模式:每周日凌晨一次完整备份,每日凌晨进行一次差异备份,每四个小时(按需求可缩小间隔)进行一次事务日志备份

应用模拟:
当数据库于星期三早上9:30 出现故障,如下图例

恢复方案将为:完整备份 + 差异备份3 + 日志备份1 + 日志备份2 + 日志备份3 + 结尾日志备份

总结

主码和外码自动有索引,不需要为其额外添加索引。
索引用在何处:用在经常需要查询的信息,例如经常需要用书名查询图书,所以为书名添加索引
很多数据并不需要额外在数据库存储,可以用视图的方式展现。
例如图书库里的存书量,不需要额外存,而是可以通过统计库里存在的书,然后通过视图给出。
例如统计读者已借书量,只需统计该读者存在的有借时间无还时间的借阅记录即可计算出该读者已借书量。
还有借阅记录,数据库里借阅记录只存【借阅者ID、图书ID、借阅时间、归还时间】,想要给读者呈现的是【借阅者ID、借阅者姓名、图书ID、书名、借阅时间、归还时间】,这时就可以通过视图给读者展现,而不需要对数据库中的借阅记录表进行额外的处理和储存,只需连接其他表再通过视图展现即可。
如果要用存储过程,那就得在存储过程中设置事务,要在中途失败时,能对整个存储过程进行事务回滚。

思考:
①服务器的拓扑结构是什么,有什么作用

标签:varchar,数据库,book,设计,借阅,tb,id,图书
From: https://www.cnblogs.com/Gege-1/p/16706101.html

相关文章