1、数据库原理实训-学生管理系统班级:成员:指导老师:开发时间:一 需求分析1、编写目的为了明确软件需求、安排项目规划与进度、组织软件开发与测试,撰写本文档。本文档供项目经理、设计人员、开发人员参考.2、项目背景使用计算机对学生信息进行管理,拥有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、成本低等.这些优点能够极大地提高学生信息的效率,也是管理科学化、正规化的重要支撑。学生信息管理系统能够方便地查询和变更学生的基本数据(包括学籍数据和成绩数据),节省大量工作时间,有效地提高学生信息管理的效率。而查询信息的直观显示将有助于系统的用户一目了然地掌握学生的情况。3、开发计划分
2、阶段完成任务:第一阶段实现快速界面原型,并进行相应的补充修改以满足客户的需求;第二阶段完成界面的进一步设计求精,形成最终的设计样式;第三阶段:完成数据库的开发;第四阶段:整合管理系统并进行各项测试改正出现的各种问题。4、实现的内容学生信息管理系统属于应用系统。学生信息管理系统的使用者是教务处管理员和学生。它的功能就是教师通过输入用户名和口令登陆到教学管理数据库中,从而实现对各门选课人数限制,对学生信息的维护限制.每个新学年的开始,都有新生的进入,和毕业生离校,每个学期学生的课程会发生改变以及有些学生因为不同的原因离校或者有新来的转校生。系统要对这些情况做相应的改变。离校的将学生信息删除,新来的
3、要将学生信息存入系统,课程改变了,要将其修改.教务处访问该系统将学生信息填入、删除或修改,学生可以在系统上查询本人信息.该系统是一个集成多功能的信息管理系统,有教师资料管理、学生管理、班级管理、院系管理、课程管理和成绩管理功能模块。本系统将大大提高学生信息的管理效率,带来数据共享、网络查询和网络管理等便利,实现学生信息管理的数字化和智能化。教师管理模块:本模块主要对教师的资料信息进行查询,删除,修改和添加.学生管理模块:本模块主要对学生资料信息进行相应的查询,删除,修改和添加。添加了学生所在院系资料与学生所在专业资料,同时可对院系资料与专业资料进行相应的添加,修改,查询。课程管理模块:本模块主
4、要对课程资料进行管理,对其进行查询,添加,修改和删除。又详细划分了课程类别资料,对其进行如上操作。成绩管理模块:本模块对学生成绩进行查询操作,如发现成绩有输入错误,可对其进行相应的修改,还可对学生的成绩进行录入班级管理模块:本模块班级资料信息进行管理,对其进行相应的查询,修改,删除和添加。根据实际问题,本系统要实现以下功能:(1)用户认证。本系统用户有教务处管理员和学生,所以用户必须通过认证才能登入系统。系统能够自动识别用户类型,能够给不同的用户分配不同的权限.教务处管理员用户成功登入后可以进入操作界面,学生成功登入后即可进入学生本人信息界面。(2)数据维护.可以对学生的成绩和课程等数据进行维
5、护。(3)信息管理。允许教务处管理员修改学生信息,允许学生在任何时候登入查询本人信息。如图所示:学生信息管理系统学生信息管理 查看学生信息修改学生信息增加学生信息删除学生信息所在学院信息所在专业信息所在年级信息所在班级信息老师信息管理查看老师信息修改老师信息增加老师信息删除老师信息所在教研室信息课程信息管理课程资料管理学生选课管理成绩信息管理成绩录入成绩修改成绩查询二。 概念结构设计概念结构所涉及的数据是独立于硬件和软件系统的,它的目标是以用户可以理解的形式来表达信息的流程,从而可以和不熟悉计算机的用户交换意见。它要充分地反映实体之间的关系,成为反映现实的概念数据模型。这是各种基本数据模型的共
6、同基础,易于向关系模型转变。通过需求分析得到的数据项和数据结构,可以设计出各种实体以及它们之间的关系图,为后面的逻辑结构设计打下基础.这些实体包含各种具体信息,通过相互之间的作用形成数据的流动.根据上面的设计规划处的实体有:学院实体,专业实体,年级实体,班级实体,学生实体、课程实体,教师实体。(1)一个学院有多个专业,一个专业只能属于一个学院,因此学院与专业之间具有一对多关系。(2)一个专业有多个年级,一个年级有多个专业,因此学院与专业之间具有多对多关系.(3)一个专业有多个班级,一个班级只能属于一个专业,因此专业与班级之间具有一对多关系。(4)一个班级有多个学生,一个学生只能属于一个班级,因
7、此班级与学生之间具有一对多关系。(5)一个学生可以选修多门课程,一门课程可以被多个学生选修,因此学生与课程之间是多对多的联系。用成绩来表示学生和课程之间联系的属性。(6)一个学院有多个教师,一个教师只能属于一个学院,因此学院与教师具有一对多的联系。(7)一个教师可以任教多门课程,一门课程可以被多个教师任教,因此课程与教师具有多对多的联系。学生信息系统ER图如图所示:学院编号名称专业编号名称学院名称学院学院专业专业专业年级年级年级班级班级班级学生学生学生课程课程教师课程教师学院教师1nmn1n1nmn1nmp年级专业编号专业名称学院名称年级班级学院编号年级班级学生班级电话年级专业名称学院名称年龄
8、性别姓名学号教师年龄学院名称教研室名称电话性别姓名工号教师教研室教研室编号学院名称教研室名称课程学分课程号课程名学院名称三、逻辑结构设计此阶段的任务是把概念结构转换成SQL Server 2005数据库管理系统能处理的数据模型.在进行这种转换时,是把实体类型和联系类型分别转换成一个个关系模式,这中间存在着多种可能组合,必须从中选择一个性能好的关系模式集作为关系数据库的模式.学生管理系统的关系模式集如下:(1) 学生信息表(学生学号,学生姓名,性别,年龄,学院名称,专业名称,年级,班级名称,电话),主键为学生学号。(2) 课程数据表(课程号,课程名称,学院名称,学分),主键为课程号.(3) 学生
9、选课表(学号,课程号,老师工号,成绩),主键为学号,课程号.(4) 教师数据表(老师工号,老师姓名,性别,年龄,学院名称,教研室名称,电话),主键为老师工号。(5) 学院数据表(学院名称,学员编号),主键为学院名称.(6) 专业数据表(专业名称,专业编号,学院名称),主键为专业名称。(7) 年级班级数据表(年级,学院名称,专业名称,班级名称),主键为年级,班级名称。(8) 教师教研室表(教研室名称,教研室编号,学院名称),主键为教研室名称。(9) 教师任课数据表(课程号,课程名称,教师工号),主键为课程号,教师工号.四、物理结构设计物理结构设计是指对给定的基本数据模型选择一个最适合应用环境的物
10、理结构的过程。数据库的物理结构主要是指数据库的存储记录格式、存储记录安排和存取方法。确定数据库的存储结构,主要是指确定数据的存放位置和存储结构,包括确定关系、索引、系统存储参数的配置,确定数据库的存储方法。1. 数据结构:设置每一张数据表的属性的属性名,类型和宽度每张数据表的属性的属性名,类型和宽度如表所示.学生信息表student名称字段类型长度是否为空备注学号snochar10否主键姓名studentnamevarchar10否性别sexchar2年龄sagesmallint学院名称collegenamevarchar20外键专业名称majornamevarchar20外键年级gradei
11、nt外键班级名称classchar10外键电话telvarchar16课程数据表course字段别名类型长度是否为空备注课程号cnochar10否主键课程名称coursenamevarchar20否学院名称collegenameVarchar20外键学分Creditint否学生选课表selectcourse字段别名类型长度是否为空备注学号snochar10否主键(外码)课程号Cnochar10否主键(外码)工号TeacherIDvarchar10外键成绩Scoreint教师数据表teachers名称字段类型长度是否为空备注工号teacherIDvarchar10否主键姓名teachername
12、varchar10否性别sexchar2年龄sagesmallint学院名称collegenamevarchar20外键教研室名称departmentvarchar20外键电话telvarchar16学院数据表college名称字段类型长度是否为空备注学院名称collegenamevarchar20否主键学院编号collegeIDint否专业数据表major名称字段类型长度是否为空备注专业名称majornamevarchar20否主键专业编号majorIDint否学院名称coolegenamevarchar20否外键班级数据表class名称字段类型长度是否为空备注年级gradeint否外键学院
13、名称collegenamevarchar20否外键专业名称majornamevarchar20否外键班级名称classchar10否主键年级数据表grade名称字段类型长度是否为空备注年级gradeint否主键学院名称collegenamevarchar20否外键专业名称majornamevarchar20否外键教师教研室表depart名称字段类型长度是否为空备注教研室名称departmentvarchar20否主键教研室编号departIDint否学院名称collegenamevarchar20外键教师任课数据表teachercourse名称字段类型长度是否为空备注课程号cnochar10否
14、主键(外码)课程名称coursenamevarchar20否工号teacherIDvarchar10否主键(外码)2. 设置参照属性(1) 学生信息表(学生学号,学生姓名,性别,年龄,学院名称,专业名称,年级,班级名称,电话)中的学院名称,专业名称,年级,班级名称分别参照学院数据表中学院名称,专业数据表中的专业名称,年级-班级数据表中的年级,班级名称。(2) 课程数据表(课程号,课程名称,学院名称,学分)中的学院名称参照学院数据表中学院名称.(3) 学生选课表(学号,课程号,老师工号,成绩)中的学号,课程号,老师工号分别参照学生信息表中的学号,课程数据表中的课程号,教师数据表中的老师工号。(4
15、) 教师数据表(老师工号,老师姓名,性别,年龄,学院名称,教研室名称,电话)中的学院名称,教研室名称分别参照学院数据表中的学院名称,教师教研室表中的教研室名称。(5) 专业数据表(专业名称,专业编号,学院名称)中的学院名称参照学院数据表中学院名称。(6) 年级-班级数据表(年级,学院名称,专业名称,班级名称)中的学院名称,专业名称分别参照学院数据表中的学院名称,专业数据表中的专业名称。(7) 教师教研室表(教研室名称,教研室编号,学院名称)中的学院名称参照学院数据表中学院名称。(8) 教师任课数据表(课程号,课程名称,教师工号)中的课程号,工号分别参照课程数据表中的课程号,教师数据表中的教师工
16、号.3. 索引在成绩上创建索引score_index在学生年龄上创建索引student_sage_index在老师成绩上创建索引teachers_sage_index4. 设置视图为学生信息创建视图student_view创建各院系学生的视图college_major_s创建各班级视图class_s为各学院课程创建视图college_course为各班的学生选课成绩创建视图selectcourse_s为各班学生的学号及平均成绩创建视图avg_s为老师信息创建视图teachers_view为教研室创建视图depart_view为老师任课创建视图teachercourse_view为各学院所拥有的
17、专业创建视图c_major_view5. 设置存储过程a.创建一个存储过程,输入学号可以查询该学生的各科成绩b.创建一个存储过程,输入课程名显示该门课程的平均成绩和选课人次c。创建一个存储过程,输入学院名称显示该学院的代号,学院名称以及包含的各个专业的代号和名称,并统计该学院包含专业的数目d。创建一个存储过程,输入学院名称,专业名称,年级,班级显示该班级所有学生的信息,并统计该班的人数e.创建一个存储过程,输入老师姓名,显示该老师所教的所有课程编号,课程名称,并显示这位老师的ID号,所属院系,教研室名称6. 设置触发器(1)要求学生选课课程表中的课程号被删除时,学生选课成绩表中的对应的课程号的
18、信息也被删除.(2)要求学生信息表中的学好被修改时,学生选课成绩表、学生公共课成绩表中的学号自动修改.(3)触发器ttrigger:要求教师信息表中老师的职工号修改,则教师选课信息的职工号也会被修改(4)触发器 ttrigger:要求若输入的学号或者课程号与数据库中数据不符则不插入选课成绩表中(5)触发器insert_student:如果学生表中有新的学生插入,则触发该触发器,使得该学生信息插入(6)触发器insert_classes:如果有新的班级被添加,则触发该触发器使得该班级信息添加进来(7)触发器insert_college:如果有新的学院被添加,则触发该触发器使得该学院信息添加进来(
19、8)触发器insert_course:如果有新的课程被添加,则触发该触发器使得该课程相关信息添加进来(9)触发器insert_depart:如果有新的教师研究室被添加,则触发该触发器使得该教师研究室的相关信息添加进来(10)触发器insert_major:如果有新的专业被添加,则触发该触发器使得该专业的相关信息被添加进来(11)触发器insert_selectcourse:如果有某位同学新选的课程需要添加进来,则触发该触发器使得该学生选择的这门课程的相关信息被添加进来 (12)触发器insert_teachercourse:如果有某位教师的选课信息要添加,则触发该触发器使得相关信息被添加进来(
20、13)触发器insert_teachers:如果有新老师要被添加,则触发该触发器使得该教师的相关信息被添加进来五、实施阶段现在我们可以根据物理设计的结果产生一个具体的数据库,并把原始数据输入数据库中。利用SQL Server 2005 数据库系统中的SQL查询分析器来实现.下面给出具体的实现过程.1) 创建学生信息管理数据库createdatabase studentmanagesystemonprimary(name=studentmanagement,filename=D:DATAstudentmanagesystem。mdf,size=3,maxsize=unlimited,filegr
21、owth=1)logon(name=studentmanagesystem_log,filename=D:DATAstudentmanagesystem_log.ldf,size=1,maxsize=2,filegrowth=10)2) 创建数据表文件学院数据表collegeCREATETABLE college (collegename varchar(20)primarykeynotnull, collegeID intnotnull)专业数据表majorCREATETABLE major (majorname varchar(20)primarykeynotnull, majorID i
22、ntnotnull, collegename varchar(20)notnull,FOREIGNKEY(collegename)REFERENCES college (collegename),);年级数据表gradesCREATETABLE grades(grade intnotnullprimarykey, collegename varchar(20)notnull, majorname varchar(20)notnull,FOREIGNKEY(collegename)REFERENCES college (collegename),FOREIGNKEY(majorname)REFE
23、RENCES major (majorname))班级数据表 classesCREATETABLE classes(class char(10)notnullprimarykey,grade intnotnull, collegename varchar(20)notnull, majorname varchar(20)notnull,FOREIGNKEY(collegename)REFERENCES college (collegename),FOREIGNKEY(majorname)REFERENCES major (majorname),FOREIGNKEY(grade)REFERENC
24、ES grades (grade)学生信息表studentcreatetablestudent(sno char(10)primarykeynotnull,studentname varchar(10)notnull,sex char(2),sage smallint,collegename varchar(20),majorname varchar(20),grade int,class char(10),tel varchar(16),foreignkey(collegename)references college(collegename),foreignkey(majorname)re
25、ferences major(majorname),foreignkey(grade)references grades(grade),foreignkey(class)references classes(class)课程数据表coursecreatetable course(cno char(10)primarykeynotnull,coursename varchar(20)notnull,collegename varchar(20),Credit intnotnull,foreignkey(collegename)references college(collegename)教师教研
26、室表departCREATETABLE depart(department varchar(20)notnullprimarykey, departID intnotnull, collegename varchar(20),FOREIGNKEY(collegename)REFERENCES college (collegename),);教师数据表teacherscreatetable teachers(teacherID varchar(10)primarykeynotnull,teachername varchar(10)notnull,sex char(2),sage smallint
27、,collegename varchar(20),department varchar(20),tel varchar(16),foreignkey(collegename)references college(collegename),foreignkey(department)references depart(department))学生选课及成绩表selectcoursecreatetable selectcourse(sno char(10)notnull,Cno char(10)notnull,teacherID varchar(10),score int,primarykey(s
28、no,cno),foreignkey(sno)references student(sno),foreignkey(cno)references course(cno),foreignkey(teacherID)references teachers(teacherID),)教师任课数据表teachercourseCREATETABLE teachercourse (cno char(10)notnull,coursename varchar(20)notnull, teacherID varchar(10),PRIMARYKEY(cno,teacherID ),foreignkey(cno)
29、references course(cno),foreignkey(teacherID)references teachers(teacherID),);3) 创建索引在成绩上创建索引score_indexcreatenonclusteredindex score_indexon selectcourse(score desc)在学生年龄上创建索引student_sage_indexcreatenonclusteredindex student_sage_indexon student(sage desc)在老师成绩上创建索引teachers_sage_indexcreatenoncluste
30、redindex teachers_sage_indexon teachers(sage desc)4) 创建视图为学生信息创建视图student_viewcreateview student_viewasselect*from student创建各院系学生的视图college_major_screateview college_major_sasselect sno,studentname,collegename,majorname,telfrom studentgroupby collegename,majorname,sno,studentname,tel创建各班级视图class_scr
31、eateview class_sasselect sno,studentname,grade,class,telfrom studentgroupby collegename,majorname,grade,class,sno,studentname,tel为各学院课程创建视图college_coursecreateview college_courseasselectfrom coursegroupby collegename,cno,coursename,credit为各班的学生选课成绩创建视图selectcourse_screateview selectcourse_s(sno,cno,
32、teacherID,score)asselect selectcourse。sno,cno,teacherID,scorefrom selectcourse,class_swhere selectcourse。sno=class_s。sno为各班学生的学号及平均成绩创建视图avg_screateview avg_s(sno,grade,class,gavg)asselect selectcourse。sno,grade,class,avg(score)from selectcourse,class_swhere selectcourse.sno=class_s。snogroupby grade
33、,class,selectcourse.sno为老师信息创建视图teachers_viewcreateview teachers_viewasselect*from teachersgroupby collegename,department,teacherID,teachername,sex,sage,tel为教研室创建视图depart_viewcreateview depart_viewasselectfrom departgroupby collegename,departID,department为老师任课创建视图teachercourse_viewcreateview teacher
34、course_viewasselectfrom teachercoursegroupby teacherID,cno,coursename为各学院所拥有的专业创建视图c_major_viewcreateview c_major_view(collegename,collegeID,majorname,majorID)asselect collegeID,college.collegename,majorID,majornamefrom college,majorwhere major.collegename=college。collegename5) 创建存储过程(1)创建一个存储过程,输入学
35、号可以查询该学生的各科成绩createproc scoreprocsno char(10)asbeginselect student。sno,studentname,coursename,score,creditfrom student,course,selectcoursewhere student。sno=selectcourse。sno and course。cno=o and student.sno=snoendgo用户请输入:execscoreproc 输入您需要查询的学号(2)创建一个存储过程,输入课程名显示该门课程的平均成绩和选课人次createproc avgscoreproc
36、cname char(20),avg intoutput,count smallintoutputasbeginselect avg=avg(grade),count=count()from course,selectcoursewhere o=selectcourse。cno and coursename=cnameendgo用户请输入:declare a int,b smallintexec avgscoreproc 输入您要查找的课程名,a output,b outputselect aas 平均成绩,bas 选课人次(3)创建一个存储过程,输入学院名称显示该学院的代号,学院名称以及包含
37、的各个专业的代号和名称,并统计该学院包含专业的数目createproc majorproccollegename char(20),countmajor intoutputasbeginselect college.collegeID,collegename,majorID,majornamefrom college,majorwhere college.collegename=major.collegename andcollege.collegename=collegenameselect countmajor=count()from major where collegename=col
38、legenameendgo用户请输入:declare a intexec majorproc 输入您要查找寻的学院名字,a outputselect aas专业数目(4)创建一个存储过程,输入学院名称,专业名称,年级,班级显示该班级所有学生的信息,并统计该班的人数createproc classproccollegename char(20),majorname char(20),grade int,class char(10),num intoutputasbeginselectfrom studentwhere collegename=collegename and majorname=m
39、ajorname andgrade=grade and class=classselect num=count()from studentwhere collegename=collegename and majorname=majorname andgrade=grade and class=classendgo用户请输入:declare x intexec classprco输入学院名称,专业名称,年级,班级,x outputselect xas 人数(5)创建一个存储过程,输入老师姓名,显示该老师所教的所有课程编号,课程名称,并显示这位老师的ID号,所属院系,教研室名称createpro
40、c teacherprocteacher char(10),ID char(10)output,college char(10) outchar,department char(20)outputasbeginselect cno,coursenamefrom teachers,teachercoursewhere teachers。teacherID=teachercourse。teacherID andteachername=teacherselect ID=teacherID,college=collegename,department=departmentfrom teacherswh
41、ere teachername=teacherendgo用户请输入:declare x char(10),y char(20),z char(10)exec teacherproc 请输入您要查找的老师姓名,x output,y output,z outputselect x,y,z6) 创建触发器(1)触发器ctrigger:要求学生选课课程表中的课程号被删除时,学生选课成绩表中的对应的课程号的信息也被删除.createtrigger ctrig oncourse after deleteasbegindelete SC where cno in(select cno from delete
42、d)End用户输入:delete Cwhere cno=(输入您要删除的课程号)(2)触发器strigger:要求学生信息表中的学号被修改时,学生选课成绩表、学生公共课成绩表中的学号自动修改。createtrigger ctrig onstudent after updateasbeginupdateselectcourseset sno in(select sno from inserted)where sno in(select sno from deleted)end用户输入:update student set sno=请输入您要修改的新学号wheresno=请输入该学生的旧学号()触
43、发器ttrigger:要求教师信息表中老师的职工号修改,则教师选课信息的职工号也会被修改createtrigger ttrig on teachers after updateasbeginupdate teachercourse set teacherID in(select teacherID from inserted)where teacherID in(select teacherID from deleted)end用户输入:update teachers set teacherID=请输入您要修改的新职工号whereteacherID=输入原来的旧职工号()触发器 ttrigger:要求若输入的学号或者课程号与数据库中数据不符则不插入选课成绩表中createtrigger check_trigon selectcourse after insertasbeginifexists(selectfrom inserted where sno notin(select sno from s)or cno notin(select cno from course)rollbackendgo用户输入:insert selectco