JIANGXI AGRICULTURAL UNIVERSITY
本 科 课 程 实 训
题目: 数据库排课系统课程设计
学 院: 软件学院 小组成员: 曾凡 蔡玉洁 学 号: 20101509 20101508 专 业: 软件工程 班 级: 软件1002班 指导教师: 黄欣 职 称: 教师
二0一一年十二月
1
目录
目录 ................................................................................ 2
引言 ................................................................................ 3
一.需求分析 ................................................................... 3
二.数据库设计 ............................................................... 4
1.概念结构设计 .................................................... 4
2.所有表的汇总和触发器 .................................... 8
3.存储过程(实现排课的时间不冲突等) .......... 16
三.实训小结 ................................................................. 16
2
引言
目前我院教务处的许多事务都采用机进行管理,如学生选课系统、成绩查询系统等,但在每学期中,各科教师在拿到教务部门下发的实验任务后,就必须到计算中心进行排课登记,排课人员面对这么多的上机实验课程,如何高效而迅速地安排机房。一直以来排课人员都是使用一张手工排课表,查找到空余机房后再将该课程的排课信息填入其中,最后录入电脑进行打印后张贴到值班室,以供值班人员查阅。这样不仅工作繁琐,效率低下,而且只能安排上机的时间,无法具体安排所用教室,增加了不少工作量,同时也不便于课程和机房的查询以及信息的分类汇总与统计。为解决这一系列的问题,我们设计和开发了排课系统。
一.需求分析
(1)部门分类:学校包括多个院,如软件院,经贸院、工学院、外语院、计信院,生工院等,而每个院又分为许多专业,每个专业又分为不同的班级;
(2)课程分类:大中小班上课、计算机课、实训课
(3)目标:自动排课系统将最复杂的排课部分交给计算机来完成,避免了手工排课容易产生教师时间安排冲突(即一位老师在
3
同一时间只能给一个班上课)和教室时间安排冲突(即一个教室同一时间只能有一个班上课)的缺点。用户只要将班级、课程和教室的各项资料输入,确定合班上课的班级,剩下的排课部分则完全交给计算机。如果资料输入有错误,可以对各项资料进行添加、删除和修改,各项资料有所变动之后,则可以重新确定合班上课的班级,清除排课之后再重新进行自动排课。
(3)故障处理要求:当用户输入不合理时输出明确的错误提示,比如输入为空,数据格式不正确等。 (4)系统运行环境
具有输入设备,安装了SQL SERVER 7.0或者SQL SERVER 2000 数据库以及浏览器的WIN 98或者WIN 2000 环境。
二.数据库设计
1.概念结构设计
1.实体型集:学校.,学院、班级、学生、教师、课程、教学楼、教室 2.实体型之间的联系:
学校和学院:一个学院只能在一个学校,一个学校可由多个学院组成; 存在“组成”的关系:1:N
学院和班级:一个班级只能在一个学院,一个学院可由多个班级组成; 存在“组成”的关系:1:N
学院和学生:一个学生只能在一个学院,一个学院可由多个学生组成; 存在“组成”的关系:1:N
班级和学生:一个学生只能属于一个班级,一个班级拥有多个学生; 存在“属于”的关系:1:N
学院和教师:一个教师只属于一个学院,一个学院拥有多个教师; 存在“属于”的关系:1:N
学生和课程:一个学生要学习多门课程,一门课程可以有多个学生学习; 存在“学习”的关系:N:M
班级和课程:一个班级要学习多门课程,一门课程可以有多个班级学习;
4
存在“学习”的关系:N:M
教师和班级:一个教师可以教多个班级,一个班级可以有多个任课教师; 存在“任课”的关系:N:M
教师和课程:一个教师可教授多门课程,一门课程可由多个老师教; 存在“授课”的关系:N:M
教学楼和教室:一个教室只能在一个教学楼,一个教学楼拥有多个教室; 存在“拥有”的关系:1:N 3.属性集:
(1)实体型属性:
学校.:学校代码,学校名称 学院:学院代码,学院名称
班级:班级码,班级名,年级,人数 学生:学号,姓名, 教师:教工号,姓名
课程:课程号,课程名,学分,周学时,起止时间,任课老师 教学楼:楼号,名称
教室:教室编号,教室类型 4.画出E—R图,如下所示:
(1)第一.画出各个存在联系的实体型的E—R图: 学校代学校名院代码 院名 1 学校 组成 N 学院 年级 院代院名 班级码 班级名 1 学院 组成 N 班级 人数 院代码 院名 教工号 姓名 1 学院 属于 N 教师 学院代码 学院名称 学号 姓名 1 学院 组成 N 学生 5 课程课程 学号 姓名 周学时 号 名 M N 起止时课程 学生 学习 任课老 学 班级课程课程班级年级 名 周学码 人数 M N 学习 起止时班课 级 程 任课老 学 年级 班级班级 教工姓名 号 名 人数 1 N 任课 教师 班级 课程课程 教工号 姓名 周学时 号 名 M N起止时课程 教师 任 课 任课老 学 班级班级学号 年级 姓名 码 名 1 N 人数 属于 班级 学生 楼号 教室编名称 教室类型 号 1 N 拥有 教室 教学楼
6
(2)总的E—R图如下所
1 学校 拥有 N 教学楼 1 1 组成 M 拥有 1 学院 N 属于 教师 M 任课 授N 1 组成 1 M N N N N M 学习 N 课程 开设 M 教室 班级 组成 1 属 M N 学习 N 学生 M 7 2.所有表的汇总和触发器
表名 XUEYUAN CLASS STUDENT TEACHER COURSE TeacherBurring ClassRoom 功能说明 存储每个学院的信息 存储班级的基本信息 存储学生的基本信息 存储教师的基本信息 存储各个课程的基本信息 存储教学楼的基本信息 存储教室的基本信息 存储教师在班级的任课信息 存储教师教授课程的信息 存储班级学习课程的信息 存储教室与课程关系的信息 存储班级、课程、教室之间关系的信息 存储学校的信息
AssumeCourse TeachingCourse StudyCourse RoomandCourse ClassCourse CRoom University
(1) University 列名 UniversityID UniversityName 数据类型(精度范围) 空/非空 Char(4) Varchar(16) 非空 非空 约束条件 Primary key 说明 学校代码 学校名称 Create table University
( UniversityID Char(4) Primary key not null , ---将学校代码设置为主
8
键,并不允许为空
UniversityName Varchar(16) not null , ---将学校名称设置不允许为空
)
Create trigger University_xuexiao
On University For insert As begin
Declare @ UniversityID Char(4) , @ UniversityName Varchar(16) Set @ UniversityID =(selcect UniversityID from inserted) Set @ UniversityName=(select UniversityName from insered) If(@ UniversityID==null and @ UniversityName==null) Begin Rollback End Else
Insert into University values(@ UniversityID , @ UniversityName) End
(2) XUEYUAN 列名 YUANID UniversitID YUANName 数据类型(精度范围) 空/非约束条件 空 Char(4) 非空 Primary key Char(4) 非空 Foreign key Varchar(20) 非空 说明 院代码 学校代码 院名 Create table XUEYUAN
(YUANID Char(4) Primary key not null , ---将院代码设置为主键,并不允许
为空
UniversitID Char(4) not null , ---将学校代码设置为不允许为空 YUANName Varchar(20) not null , ---将院名设置为不允许为空
Foreign key UniversitID references University(UniversitID) ---将学校代码设置为外键,被参照表是University,被参照列是UniversitID )
Create trigger XUEYUAN_xueyuan
On XUEYUAN For insert As begin
Declare @YUANID Char(4), @UniversitID Char(4), @YUANName Varchar(20), @i int
Set @YUANID=(select YUANID from inserted)
Set @UniversitID=(select UniversitID from inserted)
9
Set @ YUANName=(select YUANName from inserted) Set @i=(select count(YUANID) from inserted
If (@i>1) Begin Rollback End
If(@YUANID ==null and @ UniversitID ==null and @ YUANName==null) Begin Rollback End Else
Insert into XUEYUAN values(@YUANID , @ UniversitID, @ YUANName)
End
(3) CLASS 列名 ClassID Year YUANID ClassName Total 数据类型(精度范空/约束条件 说明 围) 非空 Char(4) 非空 Primary key 能被唯一识别的班级号 Char(4) 非空 年级 Char(4) 非空 Foreign key 院代码 Varchr(20) 非空 班级名 Char(3) 非空 班级人数 Create table CLASS
(ClassID Char(4) Primary key not null , ---将班级号设置为主键,并不允许为
空
Year Char(4) not null , ---将年级设置为不允许为空
YUANID Varchar(4) not null , ---将院代码设置为不允许为空 ClassName Varchr(20) not null , ---将班级名设置为不允许为空 Total Char(3) not null , ---将班级人数设置为不允许为空
Foreign key YUANID references XUEYUAN (YUANID) ---将学院代码设置为外键,被参照表是XUEYUAN,被参照列是YUANID )
Create trigger CLASS_banji
On CLASS For insert As begin
Declare @ClassID Char(4), @ Year Char(4), @ YUANID Varchar(4), @ ClassName Varchr(20),@ Total Char(3) ,@i int Set @YUANID=(select YUANID from inserted)
Set @ ClassID =(select ClassID from inserted) Set @ Year =(select Year from inserted)
10
Set @ ClassName =(select ClassName from inserted) Set @ Total =(select Total from inserted)
Set @i=(select count(ClassID) from inserted If (@i>1) Begin Rollback End
If(@YUANID ==null and @ ClassID ==null and @ Year ==null and @ ClassName ==null and @ Total ==null) Begin Rollback End Else
Insert into CLASS values(@YUANID , @ ClassID, @ Year, @ ClassName, @ Total)
End
(4) STUDENT 列名 StudentID StudentName ClassID 数据类型(精度范空/非约束条件 说明 围) 空 Char(10) 非空 Primary 学生学号 key varChar(8) 非空 学生姓名 Char(4) 非空 Foreignkey 能被唯一识别的班级号 Create table STUDENT
(StudentID Char(10) Primary key not null , ---将学生学号设置为主键,并不
允许为空
StudentName varChar(8) not null , ---将学生姓名设置为不允许为空 ClassID Char(4) not null , ---将班级号设置为不允许为空
Foreign key ClassID references Class (ClassID) ---将班级号设置为外键,被参照表是Class,被参照列是ClassID )
Create trigger STUDENT _xuesheng On STUDENT For insert As begin
Declare @StudentID Char(4), @StudentName Char(4), @ ClassID Varchar(20), @i int
Set @ StudentID =(select StudentID from inserted)
Set @ StudentName =(select StudentName from inserted) Set @ ClassID =(select ClassID from inserted) Set @i=(select count(YUANID) from inserted
11
If (@i>1) Begin Rollback End
If(@StudentID ==null and @ StudentName ==null and @ ClassID ==null) Begin Rollback End Else
Insert into STUDENT values(@StudentID , @ StudentName, @ ClassID)
End
(5) TEACHER 列名 TeacherID TeacherName YUANID 数据类型(精度范围) Char(5) varChar(8) Char(4) 空/非空 约束条件 非空 非空 非空 Primary key Foreign key 说明 教工号 教师名称 院代码 Create table TEACHER
(TeacherID Char(5) Primary key not null , ---将教工号设置为主键,并不允许
为空
TeacherName varChar(8) not null , ---将教师姓名设置为不允许为空 YUANID Char(4) not null , ---将院代码设置为不允许为空
Foreign key YUANID references XUEYUAN(YUANID) ---将院代码设置为外键,被参照表是XUEYUAN,被参照列是YUANID )
Create trigger TEACHER_teacher
On TEACHER For insert As begin
Declare @ TeacherID Char(4), @ TeacherName Char(4), @ YUANID Varchar(20), @i int
Set @ TeacherID =(select TeacherID from inserted)
Set @ TeacherName =(select TeacherName from inserted) Set @ YUANID =(select YUANID from inserted) Set @i=(select count(YUANID) from inserted If (@i>1) Begin Rollback End
If(@TeacherID ==null and @ TeacherName ==null and @ YUANID ==null) Begin
12
Rollback End Else
Insert into Teacher values(@TeacherID , @ TeacherName, @ YUANID)
End
(6) COURSE 数据类型(精度范围) CourseID Char(4) CourseName Varchar(20) Credit Char(3) Week Period Char(6) Start and End Char(5) TeacherID Char(4) 列名 空/非空 约束条件 非空 非空 非空 非空 非空 非空 Primary key Foreignkey 说明 课程号 课程名称 学分 周学时 起止时间 任课老师 Create table COURSE
(CourseID Char(4) Primary key not null , ---将课程号设置为主键,并不允许
为空
CourseName Char(20) not null , ---将课程名称设置为不允许为空 Credit Char(3) not null , ---将学分设置为不允许为空
Week Period char(6) not null , ---将周学时设置为不允许为空 Start and End char(5) not null , ---将起止时间设置为不允许为空 TeacherID Char(4) not null , ---将教工号设置为不允许为空
Foreign key TeacherID references TEACHER (TeacherID) ---将教工号设置为外键,被参照表是TEACHER,被参照列是TeacherID )
(7) TeacherBurring 数据类型(精度范围) TeachingBuildingName Varchar(20) UniversityID Char(4) 列名 空/非约束条件 空 非空 非空 Foreign key 说明 教学楼名 学校代码 Create table TeacherBurring
(TeachingBuildingName Varchar(20) not null , ---将教学楼名设置为不允许
为空
UniversityID Char(4) not null , ---将学校代码设置为不允许为空
Foreign key UniversityID references University (UniversityID) ---将院代码设置为外键,被参照表是University,被参照列是UniversityID )
(8) ClassRoom 列名 ClassroomID
数据类型(精度范空/非空 约束条件 围) Varchar(10) 非空 Primary key 说明 教室编号 13
Teaching BuildingName Style Varchar(20) Varchar(20) 非空 非空 教学楼名 类型 Create table ClassRoom
(ClassroomID Varchar(10)Primary key not null , ---将教室编号设置为主键,
并不允许为空
Teaching BuildingName varChar(20) not null , ---将教学楼名设置为不允许为空
Style Varchar(20) not null , ---将类型设置为不允许为空
)
(9) AssumeCourse 列名 ClassID TeacherID 数据类型(精度范空/非空 约束条件 围) Varchar(10) 非空 Foreign key Char(4) 非空 Foreign key 说明 班级号 教工号 Create table AssumeCourse
(ClassID Varchar(10) not null , ---将班级号设置为主键不允许为空
TeacherID Char(4) not null , ---将教工号设置为不允许为空
Foreign key TeacherID references Teacher (TeacherID) ---将院代码设置为外键,被参照表是Teacher,被参照列是TeacherID )
(10) TeachingCourse 列名 数据类型(精度范空/非空 约束条件 说明 围) TeacherID Char(4) 非空 Foreign key 教工号 CourseID Char(4) 非空 Foreign key 课程号 StudyYear Char(9) 非空 学年 Studyterm Char(2) 非空 学期 Create table TeachingCourse
(TeacherID char(4) not null , ---将教工号设置为不允许为空
CourseID Char(4) not null , ---将课程号设置为不允许为空 StudyYear Char(9) not null , ---将学年设置为不允许为空 Studyterm Char(2) not null , ---将学期设置为不允许为空
Foreign key TeacherID references Teacher(TeacherID) ---将院代码设置为外键,被参照表是Teacher,被参照列是TeacherID
Foreign key CourseID references Course (CourseID) ---将院代码设置为外键,被参照表是Course,被参照列是CourseID
)
(11) StudyCourse 列名
数据类型(精度范空/非空 约束条件 说明 14
围) ClassID char(4) 非空 Foreign key 班级号 CourseID Char(4) 非空 Foreign key 课程号 StudyYear Char(9) 非空 学年 Studyterm Char(2) 非空 学期 (ClassID char(4) not null , ---将班级号设置为不允许为空 CourseID Char(4) not null , ---将课程号设置为不允许为空 StudyYear Char(9) not null , ---将学年设置为不允许为空 Studyterm Char(2) not null , ---将学期设置为不允许为空
Foreign key ClassID references Class(ClassID) ---将院代码设置为外键,被参照表是Class,被参照列是ClassID
Foreign key CourseID references Course (CourseID) ---将院代码设置为外键,被参照表是Course,被参照列是CourseID ) (12) RoomandCourse 列名 数据类型(精度范空/非空 约束条件 说明 围) CourseID Char(4) 非空 Foreign key 课程号 ClassroomID Varchar(4) 非空 Foreign key 教室编号 Week Char(6) 非空 星期 schooltime Char(10) 非空 上课时间 (CourseID char(4) not null , ---将课程号设置为不允许为空 ClassroomID Char(4) not null , ---将教室编号设置为不允许为空 Week Char(6) not null , ---将星期设置为不允许为空
schooltime Char(10) not null , ---将上课时间设置为不允许为空
Foreign key ClassroomID references Classroom(ClassroomID) ---将院代码设置为外键,被参照表是Class,被参照列是ClassID
Foreign key CourseID references Course (CourseID) ---将院代码设置为外键,被参照表是Course,被参照列是CourseID ) (13) ClassCourse Room 列名 数据类型(精度范空/非空 约束条件 说明 围) ClassID Char(4) 非空 Foreign key 班级号 CourseID Char(4) 非空 Foreign key 课程号 ClassroomID Varchar(4) 非空 Foreign key 教室编号 Week Char(6) 非空 星期 schooltime Char(10) 非空 上课时间 (ClassID char(4) not null , ---将班级号设置为不允许为空 CourseID char(4) not null , ---将课程号设置为不允许为空
ClassroomID Char(4) not null , ---将教室编号设置为不允许为空 Week Char(6) not null , ---将星期设置为不允许为空
schooltime Char(10) not null , ---将上课时间设置为不允许为空
Foreign key ClassroomID references Classroom(ClassroomID) ---将院代码设置为
15
外键,被参照表是Class,被参照列是ClassID
Foreign key CourseID references Course (CourseID) ---将院代码设置为外键,被参照表是Course,被参照列是CourseID
Foreign key ClassID references Class(ClassID) ---将院代码设置为外键,被参照表是Class,被参照列是ClassID )
3.存储过程(实现排课的时间不冲突等)
Create procedure paike (@renshu int,@banjihao char(4),
As Begin
Declare @style char(4),@countrenshu char(4) If(@renshu>100) Begin
Insert into student(Week) values(Select Week from ClassCourse Room where ClassroomID in(Select ClassroomID from classroom where style=’da’)) End
If(@renshu>45and @renshu<100) Begin
Insert into student(Week) values(Select Week from ClassCourse Room where ClassroomID in(Select ClassroomID from classroom where style=’zhong’)) End
If(@renshu<45) Begin
Insert into student(Week) values(Select Week from ClassCourse Room where ClassroomID in(Select ClassroomID from classroom where style=’xiao’)) end
三.实训小结
通过这次的实训使我们学到了很多,同时也让我们意识到我们要学的更多。从需求分析到数据库的设计,编写、画图、调试、修改、完善、到最后的实训报告,每个人都付出了时间和精力去做好自己的任务帮助队友,所以团队的合作和队友之间的相互协助非常重要。通过实训让我们更深一步的对自己的专业,对自己的能力,对自己所学的有正确的认
16
识,并且能在以后的学习中不断提高和完善自己。
这次实训在大家的帮助下,得以的成功,无论是团队合作这方面还是个人动手这方面,我们都得到了很好的锻炼。也通过这次实训,我们对数据库这门课有了对知识更进一步的渴望。我相信,汗水不会白费的,我们以后的成功是有目共睹的。
本学期的课业接近尾声,感谢黄老师,,感谢老师教我们这门课,老师教的很好,只是我们领悟的不够。
17
18
因篇幅问题不能全部显示,请点此查看更多更全内容