数据库实验报告.docx
《数据库实验报告.docx》由会员分享,可在线阅读,更多相关《数据库实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![数据库实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/24/80b8d4f2-1500-43a9-a3f7-4f4f524fbe23/80b8d4f2-1500-43a9-a3f7-4f4f524fbe231.gif)
数据库实验报告
数据库实验报告
组长:
______
组员:
_____
班级:
________
指导教师:
_____________
组长:
主要任务:
1.分析题意,画出E-R图,将E-R图转换为关系模式并进行模式优化。
2.SQLServer2008环境下编写SQL代码,创建视图、触发器、存储过程和游标。
组员:
主要任务:
1.根据优化后的关系模式创建基本表,并填充数据。
2.参与优化模式讨论。
3.撰写实验报告。
一.题目:
设计学生管理系统
需求语义:
今要建立关于系、学生、班级、学会等诸信息的一个关系数据库。
一个系有若干专业,每个专业每年只招一个班,每个班有若干学生。
一个系的学生住在同一宿舍区。
每个学生可参加若干学会,每个学会有若干学生。
学生参加某学会有一个入会年份。
描述各个实体的属性(加下划线者为主码)如下:
学生:
学号、姓名、年龄、系名、班号、宿舍区。
班级:
班号、专业名、入校年份、系名、人数。
系:
系号、系名、系办公室地点、人数。
学会:
学会号、学会名、成立年份、地点。
要完成的任务:
1.画出E-R图。
2.把E-R图转为关系模式,并优化。
3.根据关系模式创建数据库。
表名和属性名用英文,属性的数据类型根据上面的描述自己定义。
4.创建一个视图,能显示每个学会的学会名,学生数(实际不存在,也不能增加)。
5.创建一个触发器,能根据每个班的学生变动情况自动增减班级表和系表的人数字段的值。
6.创建一个存储过程,实现如下功能:
给定一个班的旧班号和新班号,把所有相关表中此班的旧班号改为新班号,并返回此班的人数(使用输出参数)。
7.编写一段脚本,使用游标完成如下功能:
确定系表中人数字段的值与实际学生数是否相符。
如果不相符,把人数字段的值改为实际数,并在窗口打印此系的系号、系名、原人数、实际人数。
二.概念结构设计
原始E-R图:
uyear
uname
uplace
uno
belong
sdname
sdor
sclno
sno
sname
sage
live
dept
major
class
student
stuunion
joinyear
sjoin
m
n
p
cltotal
q
clyear
1
clmjname
belong
open
clno
1
mname
cldname
1
1
dno
establish
n
dname
dorplace
1
dwkplace
dormitory
11
dtotal
消除冲突和冗余后的E-R图
uyear
uplace
uname
uno
stuunion
joinyear
sjoin
m
dorplace
dormitory
dtotal
dname
dwkplace
dno
establish
mjname
clyeaar
cltotal
clno
open
blong
sno
sname
sage
live
dept
major
student
n
p
1
class
1
1
n
1
1
1
三.逻辑结构设计
stuunion(uno,uname,uyear,uplace)
student(sno,sname,sage,clno)
sjoin(uno,sno,joinyear)
class(clno,clyear,cltotal)
major(mjname,clno,dnl)
dept(dno,dname,dwkplace,dtotal)
dormitory(dno,dorplace)
经检验,以上7个关系模式均满足第三范式要求
四.应用程序中遇到的问题及解决方法
根据设计好的关系模式,即可在SQLSever2008环境下编程。
前面创建表、视图、触发器的过程都比较简单,创建存储过程的时候遇到了一点问题,班号更改以后无法把相关表中的班号也修改了,最后发现原因是student和major两个从表无法级联更新,于是又给这两个表增添了随着class表级联更新的属性,问题迎刃而解。
最后创建游标的过程有点复杂,不过整体还是比较顺利的。
五.总结
这次上机实验收获还是挺多的,上课的时候学到了理论,当真正把理论运用到实践中的时候发现其实没那么容易。
虽然只是设计了一个学生管理系统,这个系统规模不大,数据也不多,但是当真正设计这个数据库的时候过程是比较曲折的。
我觉得重点就是根据需求设计E-R图,设计出E-R图后还要消除冲突和冗余,然后将E-R图转换为关系模式,还要对关系模式规范化,达到一个非常好的效果。
此次上机实验也锻炼了同学之间的合作能力,我积极和同学探讨问题,也向老师请教问题,学到了好多课本上没有学到的知识。
附录:
代码:
--student表
createtablestudent
(
snovarchar(8)primarykey,
snamevarchar(20)notnullunique,
sageint,
clnochar(6)referencesclass(clno)
);
--class表
createtableclass
(
clnochar(6)primarykey,
clyearint,
cltotalint
)
--major表
createtablemajor
(
mjnamevarchar(20)primarykey,
clnochar(6)referencesclass(clno),
dnochar
(2)referencesdept(dno)
)
--dept表
createtabledept
(
dnochar
(2)primarykey,
dnamevarchar(20)notnullunique,
dworkplacevarchar(20),
dtotalint
)
--dormitory表
createtabledormitory
(
dorplacevarchar(20),
dnochar
(2)referencesdept(dno)
)
--stuunion表
createtablestuunion
(
unochar(6)primarykey,
unamevarchar(20)notnullunique,
uyearint,
uplacevarchar(20)
)
--sjoin表
createtablesjoin
(
unochar(6)referencesstuunion(uno),
snovarchar(8)referencesstudent(sno),
joinyearint,
primarykey(uno,sno)
)
--创建视图
createviewuname_utotal(uname,utotal)
as
selectuname,count(*)
fromstuunion,sjoin
wherestuunion.uno=sjoin.uno
groupbystuunion.uname
withcheckoption;
--创建触发器
createtriggerinsert_cltotal_dtotalonstudent
forinsert
as
declare@achar(6);
declare@cchar
(2);
set@a=(
selectclass.clno
fromclass,inserted
whereclass.clno=inserted.clno
);
updateclass
setcltotal=cltotal+1
whereclno=@a;
set@c=(
selectdept.dno
frommajor,dept,inserted
wheremajor.dno=dept.dnoandmajor.clno=inserted.clno
);
updatedept
setdtotal=dtotal+1
wheredno=@c;
createtriggerdelete_cltotal_dtotalonstudent
fordelete
as
declare@achar(6)
declare@cchar
(2)
set@a=(
selectclass.clno;
fromclass,deleted;
whereclass.clno=deleted.clno
);
updateclass
setcltotal=cltotal-1
whereclno=@a;
set@c=(
selectdept.dno
frommajor,dept,deleted
wheremajor.dno=dept.dnoandmajor.clno=deleted.clno
);
updatedept
setdtotal=dtotal-1
wheredno=@c;
--创建存储过程
createprocedurepro_modifycno
@oldcnochar(6),@newcnochar(6),@classtotalintoutput
as
updateclass
setclno=@newcno
whereclno=@oldcno;
updatestudent
setclno=@newcno
whereclno=@oldcno;
updatemajor
setclno=@newcno
whereclno=@oldcno;
set@classtotal=
(
selectcltotal
fromclass
whereclno=@newcno
)
declare@xint
execpro_modifycno@oldcno='011221',@newcno='051221',@classtotal=@xoutput
print@x
altertablestudentaddconstraintc1foreignkey(clno)referencesclass(clno)onupdatecascade
altertablemajoraddconstraintc2foreignkey(clno)referencesclass(clno)onupdatecascade
--建立游标
declare@Depvarchar(10);
declare@Classvarchar(10);
droptableChange
createtableChange
(
dnochar(10)primarykey,
dtotalint
);
insertintoChange(dno,dtotal)
selectdept.dno,dept.dtotal
fromdept
declareStuNumCheckcursorfor
selectdno,clno
frommajor
openStuNumCheck
updatedept
setdtotal=0
fetchnextfromStuNumCheckinto@Dep,@Class
while@@FETCH_STATUS=0
begin
updatedept
setdtotal=dtotal+(selectCOUNT(*)
fromstudent
whereclno=@Class
)
wheredept.dno=@Dep;
fetchnextfromStuNumCheckinto@Dep,@Class
end
selectdept.dno,dept.dname,Change.dtotal,dept.dtotal
fromChange,dept
whereChange.dno=dept.dno
closeStuNumCheck
deallocateStuNumCheck