数据库实验报告数据库综合设计.docx
《数据库实验报告数据库综合设计.docx》由会员分享,可在线阅读,更多相关《数据库实验报告数据库综合设计.docx(16页珍藏版)》请在冰豆网上搜索。
![数据库实验报告数据库综合设计.docx](https://file1.bdocx.com/fileroot1/2023-5/23/95718688-84a2-468b-a0e7-e86b2a952878/95718688-84a2-468b-a0e7-e86b2a9528781.gif)
数据库实验报告数据库综合设计
专业
****
学号
****
姓名
****
实验名称
实验8数据库综合设计
日期
2012年4月28日
实验目的要求:
1、要求能设计并设立一个比较完整且实用的数据库(综合前面所学内容。
包括:
表,索引,视图,完整性约束,关系图,存储过程与触发器,等)。
2、应用系统开发(开发工具自选,如:
C#,Delphi,………)
(应按照数据库设计的步骤进行:
1系统调查分析,2、概念设计(E-Rl图),3、逻辑设计,4、物理设计,5、系统功能设计,6、应用程序编写,………)
题目,例如:
1、“学生成绩管理系统”,2、“学生考勤管理系统”,3、“学生借还书管理系统”,4、“商品进销存管理系统”,………。
一、实验目的
通过该实验把数据库的理论知识(表、索引、视图、完整性约束、关系图、存储过程、触发器等)应用到具体的综合实例中,达到数据库与其他课程整合的目的。
二、实验内容
综合前面所学内容,包括:
表,索引,视图,完整性约束,关系图,存储过程与触发器等,设计并设立一个比较完整且实用的数据库:
教务管理系统。
三、设计说明
教务管理系统采用delphi做前台界面,SQL做后台语言。
四、实验结果及分析
(一)需求分析
1、信息需求:
教务管理系统涉及的实体有:
学生:
学号、姓名、性别;班级:
班级名称、学制、入学年份;专业:
专业编号、专业名称;系部:
系编号、系名称;教师:
教工号、姓名;课程:
课程号、课程名、学分。
实体间的联系:
一个系有若干专业,每个专业有若干个班级,每个班有若干个学生;每个系有若干教师,教师分为两种:
授课教师和教学秘书,每个系有一名教学秘书;一名教师可以教授多门课程,可以教授多个班级;每个学生可以学习多名课程,每门课程可以被若干个学生学习。
学生选修课程分为必修和选修,每门课程都有一个期末成绩,可以重修或补考两次,总评取3个成绩中最高的,还有选修课程的年份和学期。
2、功能需求:
教务管理系统的用户分为:
学生、教师、管理员。
学生可以查询成绩、修改密码、选修课程;教师又分为普通教师和教学秘书,普通教师可以登记成绩、查询成绩,教学秘书可以查询成绩、为某个班级指定必修课、为教师指定其教授的课程及授课班级。
管理员具有管理系统的所有权利。
数据流图:
(二)概念结构设计
(三)逻辑结构设计
1、根据系统的概念结构分析,得出其关系模式如下:
系部(系编号,系名称)
专业(专业编号,所属系部,专业名称)
班级(班级名称,所属专业,所属系部)
学生(学号,姓名,性别,班级)
课程(课程号,课程名,学分)
教工(教工号,姓名,所属系部)
就职(系编号,系教学秘书)
教授(教工号,课程号,教授班级)
学习(学号,课程号,期末,总评,补考1,补考2,学期,学年,课程类型)
因为关系模式“就职”和“系部”具有相同的码,所以将两个关系模式合并,得到关系模式:
系部(系编号,系名称,系教学秘书)
2、设计视图:
(1)为学生查询成绩设计视图:
成绩1(课程名,期末,总评,重修1/补考1,重修2/补考2,学分,必修/选修,学年,学期)。
(2)为教师查询成绩设计视图:
成绩2(学号,姓名,课程名,期末,总评,必修/选修,学年,学期,班级)
(3)为教学秘书查询成绩设计视图:
成绩3(学号,姓名,课程名,总评,必修选修,学年,学期,班级)
(4)为教师上传成绩设计视图:
成绩4(学号,姓名,课程名,成绩)
(四)物理设计
1、根据逻辑结构所设计的关系模式创建基本表,并创建主键。
系统自动为主键字段创建索引。
系部表:
department
列名
数据类型
长度
允许空
主键/外键
索引
备注
dno
varchar
2
否
主键
升序
系编号
dname
varchar
10
否
否
系名
dtea
varchar
10
是
外键:
teacher.tno
系教学秘书
专业表:
subject
列名
数据类型
长度
允许空
主键/外键
索引
备注
sbno
varchar
2
否
主
键
升序
专业编号
department
varchar
2
否
外键:
department.dno
升序
所属系部
sbname
varchar
10
否
否
专业名
班级表:
class
列名
数据类型
长度
允许空
主键/外键
索引
备
clname
varchar
20
否
主键
升序
班级名
subject
varchar
2
否
否
升序
所属专业
department
varchar
2
否
外键:
department.dno
所属系部
grade
varchar
4
否
否
入学年份
课程表:
course
列名
数据类型
长度
允许空
主键/外键
索引
备注
cno
varchar
20
否
主键
升序
班级名
cname
varchar
2
否
否
所属专业
credit
varchar
2
否
否
所属系部
学生表:
student
列名
数据类型
长度
允许空
主键/外键
索引
备注
sno
varchar
12
否
主键
升序
学号
sname
varchar
10
否
否
姓名
ssex
varchar
2
否
否
性别
class
varchar
20
否
外键:
class.clname
班级
教工表:
teacher
列名
数据类型
长度
允许空
主键/外键
索引
备注
tno
varchar
18
否
主键
升序
教工号
tname
varchar
8
否
否
教工姓名
tsex
varchar
2
否
否
性别
department
varchar
2
否
外键:
department.dno
所属系部
教授表:
tc
列名
数据类型
长度
允许空
主键/外键
索引
备注
tno
varchar
10
否
主
键
外键:
teacher.tno
升序
教工号
cno
varchar
4
否
外键:
o
升序
课程号
class
varchar
20
否
外键:
class.clname
升序
授课班级
学习表:
sc
列名
数据类型
长度
允许空
主键/外键
索引
备注
sno
varchar
12
否
主
键
外键:
student.sno
升序
学号
cno
varchar
4
否
外键:
o
升序
课程号
score
numernic
9
否
否
期末
sl
numernic
9
否
否
总评
score1
numernic
9
否
否
重修/补考1
score2
numernic
9
否
否
重修/补考2
term
varchar
1
否
否
学期
xyear
varchar
4
否
否
学年
type
varchar
6
否
否
课程类型
2、根据系统需要设计索引
(1)查询学生信息时经常要根据学生所在班级进行查询,为“学生表”的“班级”字段创建聚簇索引。
(2)查询教师信息时经常要根据教师所在系进行查询,为“教工表”的“所在系”
字段创建聚簇索引。
(五)实施
1、登录控制
本系统采用SQLSERVER身份验证,用户需要提供用户名和密码才能登陆数据库。
2、数据完整性
(1)实体完整性
为关系定义主键:
关系
系部
专业
班级
学生
教工
课程
教授
学习
主码
dno
(sbno,department)
clname
sno
tno
cno
(tno,cno,class)
(sno,cno)
(2)参照完整性
为关系定义外键:
department.teareferencesteacher.tno
subject.departmentreferencesdepartment.dno
class.departmentreferencesdepartment.dno
student.classreferencesclass.clname
teacher.departmentreferencesdepartment.dno
tc.tnoreferencesteacher.tno
oreferenceso
tc.classreferencesclass.clname
sc.snoreferencesstudent.sno
oreferenceso
(3)自定义完整性
student表的ssex属性只允许取“男”或“女”:
check(ssex=’男’orssex=’女’);
sc表的score、sl、score1、score2属性值应该在0~100之间:
check(score>=0andscore<=100)、check(sl>=0andsl<=100)、check(score1>=0andscore1<=100)
、check(score2>=0andscore2<=100)
系部名称、专业名称、班级名称都取唯一值:
UNIQUE
创建触发器T2,作用:
添加学生信息时自动根据其学号生成其登录密码
createtriggerT2
onstudent
forinsert
as
ifupdate(sno)
begin
declare@spswchar(12)
select@spsw=snofrominserted
updatestudent
setspsw=@spsw
wheresno=(selectsnofrominserted)
end
创建触发器T3,作用:
添加教师信息时自动根据其工号生成其登录密码
3、安全性设计
本系统用户分为四类:
管理员、学生、教师、教学秘书
管理员具有管理系统的所有权利;
学生可以查询成绩、修改密码、选修课程;
教师可以登记成绩、查询成绩;
教学秘书可以查询成绩、为某个班级指定必修课、为教师指定其教授的课程及授课班级。
--创建管理员用户
EXECsp_addloginadmin,admin
USEstu_course
EXECsp_grantdbaccessadmin,admin
--创建学生用户
EXECsp_addloginstudent,student
USEstu_course
EXECsp_grantdbaccessstudent,student
--创建教师用户
EXECsp_addloginteacher,teacher
USEstu_course
EXECsp_grantdbaccessteacher,teacher
--创建教学秘书用户
EXECsp_addlogindtea,dtea
USEstu_course
EXECsp_grantdbaccessdtea,dtea
4、其它功能设计
创建触发器T1:
添加或更改学生成绩时,自动生成总评
createtriggerT1
onsc
forinsert,update
as
ifupdate(score)orupdate(score1)orupdate(score2)
begin
declare@scorenumeric(18,1),@score1numeric(18,1),@score2numeric(18,1)
select@score=scorefrominserted
select@score1=score1frominserted
select@score2=score2frominserted
if@scoreisnotnulland@score1isnotnulland@score2isnotnull
begin
updatesc
setsl=(
casewhen@score>@score1and@score>@score2then@score
when@score1>@scoreand@score1>@score2then@score1
else@score2end
)
wheresno=(selectsnofrominserted)andcno=(selectcnofrominserted)
end
else
if@scoreisnotnulland@score1isnotnull
begin
updatesc
setsl=(
casewhen@score>@score1then@score
else@score1end
)
wheresno=(selectsnofrominserted)andcno=(selectcnofrominserted)
end
else
begin
updatesc
setsl=@score
wheresno=(selectsnofrominserted)andcno=(selectcnofrominserted)
end
end
触发器T2:
:
添加学生信息时自动根据其学号生成其登录密码
createtriggerT2
onstudent
forinsert
as
ifupdate(sno)
begin
declare@spswchar(12)
select@spsw=snofrominserted
updatestudent
setspsw=@spsw
wheresno=(selectsnofrominserted)
end
触发器T3:
添加教师信息时自动根据其工号生成其登录密码
存储过程和游标:
教学秘书为学生指定必修课程
createprocstu_cou@subjectvarchar(20),@classvarchar(20),@cnamevarchar(50),@xyearvarchar(4),@termvarchar
(1)
as
declare@cnovarchar(4),@snovarchar(12),@pint,@nint,@sqlcodeint
declaresxcursorforselectsnofromstudentwhere@class=class
opensx
set@n=1
select@p=count(*)fromstudentwhere@class=class
select@cno=cnofromcoursewhere@cname=cname
while@n<=@p
begin
fetchsxinto@sno
insertintosc(sno,cno,term,type,xyear)values(@sno,@cno,@term,'必修',@xyear)
set@n=@n+1
end
closesx
调用此过程如:
execstu_cou'商务英语','商务英语B081','大学英语','2010','1',就可以为“商务英语”专业“商务英语B081”班指定“2010”学年第“1”学期的“必修课”“大学英语”。
存储过程:
为教师指定其所教课程及所授班级
createproctea_cou@teachervarchar(8),@coursevarchar(50),@classvarchar(20)
as
declare@tnovarchar(10),@cnovarchar(4)
select@tno=tnofromteacherwhere@teacher=tname
select@cno=cnofromcoursewhere@course=cname
insertintotc(tno,cno,class)values(@tno,@cno,@class)
调用此过程如:
exectea_cou'张雪','商务英语','日语B072',就可以为教师张雪指定所教课程“商务英语”及所教班级“日语B072”。
视图
--学生查询成绩视图:
只能查询自己的信息
createviewuser_s1()
as
selectcname'课程名称',score'期末',sl'总评',score1'重修1(补考1)',score2'重修2(补考2)',credict'学分',type'必修/选修',xyear'学年',term'学期'
fromcourse,sc
whereo=oandsc.sno=user
--教师查询成绩视图
createviewuser_t1
as
selectsc.sno'学号',sname'姓名',cname'课程名',score'期末',sl'总评',type'必修/选修',xyear'学年',term'学期',tc.class'班级'
fromstudent,sc,course,tc
wherestudent.sno=sc.snoando=oandtc.class=student.classandtc.tno=user
--教师上传成绩视图
createviewuser_t3(学号,姓名,班级,成绩)
as
selectsc.sno,sname,class,score
fromsc,student
wheresc.sno=student.sno
--教学秘书查询学生成绩视图
createviewuser_t4(学号,姓名,课程名,总评,必修选修,学年,学期,班级)
as
selectsc.sno,sname,cname,sl,type,xyear,term,tc.class
fromstudent,sc,course,tc,department
wherestudent.sno=sc.snoando=oandtc.class=student.classandtc.tno=department.dteaandtno=user
教师评语:
成绩:
指导教师:
日期:
注:
实验报告应包括:
1、实验目的、2.实验内容,3。
设计说明(数据、程序、界面),4、正确的程序代码,5、运行结果,6、结果分析(并针对实验中出现的问题,写出解决方案)