学生宿舍管理数据库设计(下)

一、系统开发概述 3

1.1 系统开发背景 3

1.2 系统功能需求分析 3

1.3 系统性能需求分析 4

1.4 系统数据流程分析 5

二、数据库概念结构设计 5

2.1 数据库局部E-R图 5

2.2 数据库全局E-R图 6

三、数据库逻辑结构设计 7

3.1关系模式的转换 7

3.2 数据模型的优化 8

四、数据库物理结构设计 9

4.1数据库及数据表的创建 9

4.1.1 数据库创建 9

4.1.2 数据表的创建 10

4.2数据完整性设计 13

4.2.1 主键约束的创建 13

4.2.2 DEFAULT约束的创建 14

4.2.3外键约束的创建 15

4.2.4 UNIQUE约束的创建 16

4.2.5 CHECK约束的创建 17

4.3 索引的创建 18

4.4 视图的创建 18

4.5 存储过程的创建 19

4.6 触发器的创建 20

五、数据库的操作 22

5.1数据操纵 22

5.1.1表结构的修改 22

5.1.2 数据插入 23

5.1.3数据更新 24

5.1.4数据删除 25

5.2 数据查询 26

5.2.1 单表查询 26

5.2.2多表查询 27

六、总结 29

七、参考文献 29


四、数据库物理结构设计

本系统设计选择SQL Server 2008数据库管理系统为开发工具,实现数据库的创建,表的设计及索引、视图、存储过程和触发器的创建。

4.1数据库及数据表的创建

4.1.1 数据库创建

(1)创建学生宿舍管理系统数据库

createdatabase学生宿舍管理系统

图4-1-1 创建数据库

(2)数据库信息说明

创建数据库,将数据库命名为学生宿舍管理系统,初始大小为3MB,数据库按照1MB比例自动增长;日志文件的初始大小为1MB,最大增长到50MB,按照10%增长,数据库的逻辑文件名为“学生宿舍管理系统”,物理文件名为“学生宿舍管理系统.mdf”。日志文件逻辑名“学生宿舍管理系统_log”,物理名称“学生宿舍管理系统_log.LDF”,数据库存放路径为“C:\Program Files\Microsoft SQLServer\MSSQL10_50.MSSQLSERVER\MSSQL\DATA”。日志文件存放路径为“C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA”

图4-1-2 查看数据库

4.1.2 数据表的创建

(1)使用SQLserver 2008图形工具创建学生表,属性如下:

图4-1-3 创建学生表

(2)使用SQLserver 2008图形工具创建管理员表,属性如下:

图4-1-1 创建管理员表

(3)使用SQL语句创建表宿舍楼:

createtable宿舍楼

( 宿舍楼varchar(15)primarykey,

管理员varchar(15),

介绍 varchar(30));

(4)使用SQL语句创建表宿舍:

createtable宿舍

( 宿舍号varchar(15)primarykey,

宿舍楼varchar(15),

几人间varchar(15),

空余床位int,

电话int,

foreignkey(宿舍楼)references宿舍楼(宿舍楼));

(5)使用SQL语句创建表学生缺寝记录:

createtable学生缺寝记录

(snointprimarykey,

宿舍楼varchar(15),

宿舍号varchar(15),

snamevarchar(15),

原因varchar(30),

管理员varchar(15),

constrainta1foreignkey(宿舍楼)references宿舍楼(宿舍楼),

constrainta2foreignkey(宿舍号)references宿舍(宿舍号));

(6)使用SQL语句创建表学生迁出记录:

createtable学生迁出记录

(snointprimarykey,

宿舍号varchar(15),

宿舍楼varchar(15),

snamevarchar(15),

迁出原因varchar(30),

迁出时间date,

constrainta3foreignkey(宿舍楼)references宿舍楼(宿舍楼),

constrainta4foreignkey(宿舍号)references宿舍(宿舍号));

(7)使用SQL语句创建表学生迁入记录:

createtable学生迁入记录

( 学号intprimarykey,

宿舍号varchar(15),

宿舍楼varchar(15),

姓名 varchar(15),

性别 varchar(5),

状态 varchar(10),

constrainta5foreignkey(宿舍楼)references宿舍楼(宿舍楼),

constrainta6foreignkey(宿舍号)references宿舍(宿舍号));

(8)使用SQL语句创建表宿舍评分管理:

createtable宿舍评分管理

( 宿舍号varchar(15),

宿舍楼varchar(15),

工号int,

管理员姓名varchar(15),

评分 float

constraintb1primarykey(宿舍号,宿舍楼),

constrainta7foreignkey(宿舍楼)references宿舍楼(宿舍楼),

constrainta8foreignkey(宿舍号)references宿舍(宿舍号),

constrainta9foreignkey(工号)references管理员(工号));

4.2数据完整性设计

4.2.1主键约束的创建

创建表时已经添加列级primary key约束,或者表级完整性约束,若未添加,则SQL语句如下:

(1)添加列级完整性约束,使用SQL语句

alter table 学生

add constraint a1primary key(学号);

(2)添加学生表主键约束使用图形界面,第一步右击学生表,点击设计,第二步选择码右键设置为主键。

图4-2-1设置主键约束

(3)添加表级完整性约束

alter table 宿舍评分管理

add constraint a2primary key(宿舍号,宿舍楼);

4.2.2DEFAULT约束的创建

(1)使用SQL语句创建约束,default约束用于向列中插入默认值,如果没有规定其他的值,那么会将默认值添加到所以的新记录。将学生迁入表状态属性默认为‘入住’。

altertable 学生迁入记录

addconstraint b2 default '入住' for 状态;

图4-2-2创建默认值约束

(2)使用图形工具创建约束,第一步点右键击表的设计,第二步选择属性列,第三步右侧输入默认值。

图4-2-3设置默认值约束

4.2.3外键约束的创建

(1)使用SQL语句创建外键约束

altertable student

addforeign key(宿舍号) references 宿舍(宿舍号);

图4-2-4创建外键约束

(2)使用图形界面创建外键约束,第一步点击设计表,第二部选择属性右键点击关系,第三步添加外键关系,第四步点击表和列的管理,设置主键表外键表。

图4-2-5设置外键约束

4.2.4UNIQUE约束的创建

(1)unique约束是唯一性约束,主要用来确保不受 primary key约束的列上数据的唯一性。前面已经假设管理员姓名不重复,取工号为码,设置姓名唯一。

alter table 管理员

add constraint b4unique(姓名);

图4-2-6唯一性约束

4.2.5CHECK约束的创建

(1)管理员表用户定义年龄在(age>35 and age<50),使用SQL语句如下:

altertable 管理员

addconstraint b5 check(年龄>35 and 年龄<50);

图4-2-7 创建检查约束

(2)宿舍评分管理表中,管理员对每个学生卫生和缺寝综合评分,输入一个宿舍学生平均成绩,用户定义评分(score>=60 and score<=100),SQL语句如下:

alter table 宿舍评分管理

add constraint b6 check(评分>=60 and 评分<=100);

图4-2-8 创建检查约束

(3)定义宿舍表空余床位,六人间人数小于等于六,四人间人数小于等于四,也就是(空余床位<=几人间 and 空余床位>=0),SQL语句如下:

图4-2-9创建check约束

alter table 宿舍

add constraint aa check(空余床位<=几人间 and 空余床位>=0);

4.3 索引的创建

在使用关系数据库系统时,用户所可能到和操作的数据就好像是在简单的二维表中,而实际上数据在磁盘上是如何存储的用户并不清楚,但是,数据的物理存储却是决定数据库性能的主要因素。索引是最常见的改善数据库性能的技术。以下依此对八个表建立索引。

(1)createuniqueindexid1onstudent(学号);

(2)createuniqueindexid2on管理员(工号);

(3)createuniqueindexid3on宿舍(宿舍号);

(4)createuniqueindexid4on宿舍楼(宿舍楼);

对宿舍评分管理表经行数据查询对宿舍楼和宿舍创建升序,按照工号降序建立唯一索引,其他表按照宿舍号升序,学号降序建立索引。

(5)createuniqueindexid5on宿舍评分管理(宿舍楼,宿舍号ASC,工号DESC);

(6)createuniqueindexid6on学生迁入记录(宿舍号ASC,学号DESC);

(7)createuniqueindexid7on学生迁出记录(宿舍号ASC,snoDESC);

(8)createuniqueindexid8on学生缺寝记录(宿舍号ASC,snoDESC);

图4-3-1 建立索引

4.4 视图的创建

(1)将学生表中所有大数据专业的学生定义为一个视图,虽然语句显示create view只能在批处理中创建,但仍然可以执行,SQL语句如下:

createviewT_D

as

select*

fromstudent

where 专业='大数据';

图4-4-1 建立视图

(2)将学生缺寝表中,按照宿舍号分组,对每个分组(每个宿舍)统计缺寝的人数定义为一个视图,SQL语句如下:

createviewT_D1(宿舍号,数量)

as

select 宿舍号,COUNT(sno)

from 学生缺寝记录

groupby宿舍号;

图4-4-2建立视图

4.5 存储过程的创建

(1)创建能返回大数据专业学生的学号,姓名,宿舍楼的存储过程p_pree,SQL语句如下:

createprocp_presswithrecompile,encryption

as

select 学号,姓名,宿舍楼

fromstudent

where 专业='大数据';

图4-5-1创建存储过程1

(2)利用存储过程实现:向学生迁出记录中插入一条记录,并且查询迁出时间大于2020-9-1的所有学生人数。SQL语句如下:

createprocinsert_stu@a1int,@a2varchar(15),@a3varchar(15),

@a4varchar(15),@a5varchar(30),@a6date,@a7intoutput

as

insertinto学生迁出记录(sno,宿舍号,宿舍楼,sname,迁出原因,迁出时间)

values(@a1,@a2,@a3,@a4,@a5,@a6)

select@a7=COUNT(distinctsno)

from 学生迁出记录

where 迁出时间>'2020-9-1'

go

图4-5-2创建存储过程2

4.6 触发器的创建

(1)创建触发器,当修改或者删除宿舍表中的‘宿舍号’字段时,同时修改或者删除学生表中的该宿舍号。SQL语句如下:

createtriggersushe_trig

on 宿舍forupdate,delete

as

begin

if(UPDATE(宿舍号))

updatestudentset宿舍号=(select 宿舍号frominserted)

where 宿舍号=(select 宿舍号fromdeleted)

else

deletefromstudent

where 宿舍号in(select 宿舍号fromdeleted)

end

图4-6-1创建触发器1

(2)创建触发器,当学生表的宿舍号修改或者删除,学生换宿舍时或者学生毕业,当修改学生表属性宿舍号时,对应deleted表中的原来宿舍床位增加,。SQL语句执行结果如图4-6-2

createtriggerins_s

onstudentforupdate,delete

as

begin

if(update(宿舍号))

update 宿舍set 空余床位=空余床位+1

where 宿舍号=(select 宿舍号fromdeleted)and

宿舍楼=(select 宿舍楼fromdeleted)

else

update 宿舍set 空余床位=空余床位+1

where 宿舍号=(select 宿舍号fromdeleted)and

宿舍楼=(select 宿舍楼fromdeleted)

end

(3)当学生表新插入一个已知宿舍楼宿舍号的学生,对应宿舍空余床位减一。SQL语句执行结果如图4-6-3。

createtriggerdel_s

onstudentforinsert

as

begin

update宿舍set 空余床位=空余床位-1

where宿舍号=(select 宿舍号frominserted)and

宿舍楼=(select 宿舍楼frominserted)

end

图4-6-2创建触发器2

图4-6-3创建触发器3


五、数据库的操作

5.1数据操纵

5.1.1表结构的修改

(1)给宿舍楼表添加一列,地理位置,SQL语句如下:

altertable宿舍楼

add 位置varchar(15);

图5-1-1修改表1

(2)给上述宿舍楼表添加地理位置一列删除,SQL语句如下:

altertable宿舍楼

dropcolumn位置;

图5-1-2修改表2

5.1.2数据插入

(1)先插入管理员表,再插入宿舍楼表,因为宿舍楼中管理员是外键,SQL语句执行显示行受影响,最后查询表结果如下:

insert

into 管理员

values(01,'李梅',10088,'竹一',39);

insert

into 管理员

values(02,'Marry',10087,'竹二',36);

图5-1-3数据插入结果

(2)将学生信息插入学生表,在插入数据时,要保持实体完整性约束和参照完整性约束,先将定义的外键表赋值,SQL语句如下:

insert

intostudent

values(22,'张三','男',19,11033,'大数据','竹二',113);

insert

intostudent

values(23,'刘亦菲','女',19,11035,'大数据','竹一',112);

图5-1-4数据插入结果

5.1.3数据更新

(1)对学生缺寝记录中学号为22的学生,缺寝原因经行修改,将原因由感冒改为阳了。SQL语句如下:

update 学生缺寝记录

set 原因='阳了'

where sno=22;

图5-1-5数据更新结果1

(2)将学生评分管理表中,宿舍楼为竹二宿舍号为113,的宿舍评分改为99.9,SQL语句如下:

update 宿舍评分管理

set 评分=99.9

where 宿舍号=113 and宿舍楼='竹二';

图5-1-6数据更新结果2

5.1.4数据删除

(1)管理员表中姓名为杨幂的管理员要辞职,删除她的信息,SQL如下:

delete

from 管理员

where 姓名='杨幂';

图5-1-7数据删除1

(2)学生表中学号为22的学生毕业,删除学号为22学生个人信息,因为删除学生信息会触发触发器对宿舍空余床位数据更新,所有显示受两次影响。

delete

fromstudent

where 学号=22 ;

图5-1-8数据删除2

5.2 数据查询

5.2.1单表查询

(1)查询宿舍楼表对竹一宿舍楼的介绍,SQL语句如下:

select 管理员,介绍

from 宿舍楼

where 宿舍楼='竹一';

图5-2-1单表查询1

(2)查询宿舍表中那个宿舍还有空余床位可以入住,也就是空余床位不等于零,创建SQL语句如下:

select 宿舍号,宿舍楼,几人间,电话,空余床位

from 宿舍

where 空余床位>0;

图5-2-2单表查询2

(3)查询宿舍评分管理表中,评分大于七十的宿舍所有信息,SQL语句如下:

select*

from 宿舍评分管理

where 评分>=70;

图5-2-3单表查询3

5.2.2多表查询

(1)嵌套查询,查询学号为23学生宿舍评分,SQL语句如下图5-2-4:

select 宿舍号,宿舍楼,评分

from 宿舍评分管理

where 宿舍号=(select 宿舍号

fromstudent

where 学号=23);

(2)连接查询,查询学号为23学生宿舍评分

select 宿舍评分管理.宿舍号,宿舍评分管理.宿舍楼,评分

from 宿舍评分管理,student

wherestudent.宿舍号=宿舍评分管理.宿舍号and

student.宿舍楼=宿舍评分管理.宿舍楼and 学号=23;

图5-2-4多表查询1

(3)查询学号为23,姓名为刘亦菲所在宿舍共有几个人,SQL语句如下:

select 宿舍号,宿舍楼,(几人间-空余床位)

from 宿舍

where 宿舍号=(select 宿舍号

fromstudent

where 学号=23 and姓名='刘亦菲');

图5-2-5多表查询2

(4)查询李白所在宿舍楼的全部缺寝人数次数,SQL如下:

selectCOUNT(宿舍楼)

from 宿舍评分管理

where 宿舍楼in (select 宿舍楼

fromstudent

where 姓名='李白');

图5-2-6 多表查询3


六、总结

略(此处本人有感而发,就不供参考啦)


七、参考文献

[1]黄敏.基于B/S架构的学生宿舍管理系统数据库设计与实践[J].电脑知识与技术,2018,14(35):83-84+92.

[2]薛文辉. 德州学院学生公寓管理信息系统设计与实现[D].山东大学,2018.

源代码提取链接百度网盘:

链接:https://pan.baidu.com/s/1kAUr-jdXhRFxyKcWAt1j6A?pwd=gccc

提取码:gccc

真的很抱歉没法即使回复消息,因为俺也要准备期末考试,感谢理解哈!

猜你喜欢

转载自blog.csdn.net/weixin_52563520/article/details/128647521