一、概要设计
1.1 目的和意义
随着无纸化办公的普遍实现,信息的自动处理以及网络式的信息交互方式已经被人们广泛应用。让计算机来管理学生的信息是现在各个高校都在积极进行的工作之一,也是高校教学管理工作的重要内容之一。网上选课与传统的选课方式相比更加节约资源,增加了学生选课自主权。学生选课系统作为一种现代化的教学技术,越来越受到人们的重视,是一个学校不可或缺的部分, 学生选课系统就是为了管理好选课信息而设计的。学生选课系统的将使选课管理工作规范化、系统化、程序化,避免选课管理的随意性,提高信息处理的速度和准确性,能够准确、及时、有效的查询和修改学生选课情况。
与传统的选课方式相比,网上选课系统利用局域网为学生选课带来了极大的便捷。学生在公共机房,或者宿舍的个人电脑上便可以通过校园网络来选课。在选课期间内,学生能够使用选课系统灵活的修改自己的选课情况,大大提高了学校选课工作的效率。教务处的教师则可以通过选课系统的管理员子系统来管理学生的选课情况,使得学生选课工作达到系统化和自动化,大大提高了学校的工作效率,为广大师生及相关人员节省了极多的时间。
数据库对于一个应用系统的意义是相当重要的,一个设计良好的数据库系统一方面,能够给开发者带来便捷,更轻松的进行系统设计与编码;另一方面,对于系统的后期维护也非常重要,一个良好的数据库系统能够保证系统的可扩充性,以及系统的移植性等问题。
1.2 内容和要求
本实验将设计出一个高校网上选课数据库系统,其要求简要如下:(1)系统用户由三类组成:教师、学生和管理员。
(2)管理员负责的主要功能:
①用户管理(老师、学生及管理员的增、删、改);
②课程管理(添加、删除和修改);
③选课管理(实现选课功能开放和禁止、老师成绩输入开放和禁止)。
(3)学生通过登录,可以查询课程的基本信息、实现选课、退课和成绩查询;
(4)老师通过登录,可以查看选课学生的基本信息,可以输入成绩。
二、需求分析
2.1 背景
全校性选修课开设的目的在于扩大学生的知识面、加强学生素质教育、培养复合型高级人才,具有不可替代的重要性。随着教育改革的不断深入和素质教育的加强,学分制的实施,选修课在一个学生的培养计划中占的比重将越来越大。网上选课系统的出现使同学们能够更加自主、便捷、准确的进行选课。但是,由于一般高校中的学生都比较多,因此带来了诸多如信息管理等问题,鉴于需要将学生信息、选课信息等信息数字化以便于管理维护,我们便想到了利用数据库能够比较良好地解决此类问题,由此下面我将设计出一个高校选课系统以供参考。
2.2 概要分析
根据1.2节中所描述的系统分析要求,我们的高校选课系统将包含学生、教师、管理员等实体,学生可以在规定的时间内选课、退选和成绩查询等操作;教师可以查看学生的相关信息,录入学生成绩等操作;管理员可以添加管理员,管理教师、学生等信息。2.3 开发技术
开发工具: Microsoft SQL Server 2000开发语言: SQL
开发技术: 数据库开发技术
面向对象: 需求者
SQL Server 2000 是Microsoft 公司推出的SQL Server 数据库管理系统,该版本继承了SQL Server 7.0 版本的优点,同时又比它增加了许多更先进的功能。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows XP 的大型多处理器的服务器等多种平台使用。本实验中最终将使用Microsoft SQL Server 2000数据库管理系统将我们设计的数据库实现。
2.4 系统主要功能
实验选课系统分为教师,学生及系统管理员三类用户,学生的功能包括选课、退选、查询选课信息等,教师的功能包括学生成绩录入,查询实验信息等。管理员的功能包括新建教师、学生账户,添加课程信息,其系统功能模块如图2-1:![](https://img-my.csdn.net/uploads/201205/01/1335842563_2335.jpg)
三、E-R图
本章节主要包含概念设计、E-R图,以及如何将E-R图转换为实际的物理模型等内容。3.1 概念设计
在我们的数据库系统中共有6个实体:学生、教师、管理员、专业、院系、课程。(1)学生的属性:学号、姓名、性别、生日、密码
(2)教师的属性:工号、姓名、性别、生日、密码、职称
(3)管理员的属性:工号、姓名、性别、生日、密码、权限标志
(4)专业的属性:专业号码、专业名、辅导员、联系方式、专业介绍
(5)院系的属性:系号码、系名称、系主任、联系方式、系介绍
(6)课程的属性:课程号码、学时、学分、课程介绍
(7)控制设置属性:选课控制、成绩录入控制
3.2 E-R图
各个实体的E-R图如下所示:![](https://img-my.csdn.net/uploads/201205/01/1335842563_6556.jpg)
![](https://img-my.csdn.net/uploads/201205/01/1335842563_8015.jpg)
![](https://img-my.csdn.net/uploads/201205/01/1335842563_4798.jpg)
![](https://img-my.csdn.net/uploads/201205/01/1335842563_1460.jpg)
![](https://img-my.csdn.net/uploads/201205/01/1335842573_6948.jpg)
![](https://img-my.csdn.net/uploads/201205/01/1335842573_1418.jpg)
![](https://img-my.csdn.net/uploads/201205/01/1335842764_4892.jpg)
四、逻辑结构
4.1 逻辑转换
根据3.2节中的E-R图可以将系统中的概念模型转换为具体的表(即关系)结构,共分为7个关系,详细信息如下所示:学生(学号、专业号码、姓名、性别、生日、密码)
教师(教师工号、系号码、姓名、性别、生日、密码、职称)
管理员(管理员工号、姓名、性别、生日、密码、权限标志)
专业(专业号码、系号码、专业名、辅导员、联系方式、专业介绍)
院系(系号码、系名称、系主任、联系方式、系介绍)
课程(课程号码、学时、学分、课程介绍)
选课信息 ( 学号、课程号码 、教师工号、成绩)4.2 细化表结构
为方便,根据上述文字描述,用英文简写为表和列取名,确定列的数据类型及必要的约束规则,给出如下所示数据库表的基本结构及说明:(1)学生信息表
列名 | 说明 | 数据类型 | 约束 |
StudentNum | 学号 | char(10) | 主码 |
MajorNum | 专业号码 | char(10) | not null,引用tb_major的外码 |
StudentName | 姓名 | varchar(10) | Not null |
StudentSex | 性别 | char(2) | not null,取“男”或“女” |
StudentBirthday | 生日 | datetime | not null |
StudentPassword | 密码 | varchar(20) | not null, |
(2)教师信息表
列名 | 说明 | 数据类型 | 约束 |
TeacherNum | 教师工号 | char(10) | 主码 |
DeptNum | 院系号码 | char(10) | not null,引用tb_dept的外码 |
TeacherName | 姓名 | varchar(10) | not null |
TeacherSex | 性别 | char(2) | not null,取“男”或“女” |
TeacherBirthday | 生日 | datetime | not null |
TeacherTitle | 职称 | varchar(20) |
|
(3)管理员信息表
列名 | 说明 | 数据类型 | 约束 |
ManagerNum | 管理员工号 | char(10) | 主码 |
ManagerName | 姓名 | varchar(10) | not null |
ManagerSex | 性别 | char(2) | not null,取“男”或“女” |
ManagerBirthday | 生日 | datetime | not null |
(4)专业信息表
列名 | 说明 | 数据类型 | 约束 |
MajorNum | 专业号码 | char(10) | 主码 |
DeptNum | 系号码 | char(10) | not null,引用tb_dept的外码 |
MajorName | 专业名 | varchar(20) | not nul |
MajorAssistant | 辅导员 | varchar(10) | not null |
MajorTel | 联系方式 | varchar(15) | not null |
(5)院系信息表
列名 | 说明 | 数据类型 | 约束 |
DeptNum | 系号码 | char(10) | 主码 |
DeptName | 系名称 | varchar(20) | not null |
DeptChairman | 系主任 | varchar(10) | not null |
DeptTel | 联系方式 | varchar(15) | not null |
DeptDesc | 系介绍 | text | not null |
(6)课程信息表
列名 | 说明 | 数据类型 | 约束 |
CourseNum | 课程号码 | char(10) | 主码 |
CourseName | 课程名 | varchar(20) | not null |
CourseCredit | 学分 | float | not null |
CourseClass | 学时 | smallint | not null |
CourseDesc | 课程介绍 | text | not null |
(7)选课信息表
列名 | 说明 | 数据类型 | 约束 |
StuCourseID | 选课编号 | int | 主码,自动递增 |
StudentNum | 学号 | char(10) | not null,引用tb_student的外码 |
CourseNum | 课程号码 | char(10) | not null,引用tb_course的外码 |
TeacherNum | 教师工号 | char(10) | not null,引用tb_student的外码 |
Grade | 成绩 | smallint |
|
(8)控制设置表
列名 | 说明 | 数据类型 | 约束 |
IfTakeCourse | 选课控制 | char(1) | not null,取“0”或“1” |
IfInputGrade | 成绩录入控制 | char(1) | not null,取“0”或“1” |
五、数据库实施
本章节主要包含创建表、添加数据和创建必要的视图、触发器和存储过程等内容。5.1 创建表
考虑到各个表之间的约束条件以及外键索引等要求,在创建表的时候应当按照一定的次序进行创建,否则会出现错误,还有一种方法是先创建各个基本表,然后在对特定的表添加列和外码约束,在本报告册中将采取第一种方法。(1)tb_dept院系信息表
- CREATE TABLE tb_dept(
- DeptNum char(10) NOT NULL PRIMARY KEY,
- DeptName varchar(20) NOT NULL,
- DeptChairman varchar(10) NOT NULL,
- DeptTel varchar(15) NOT NULL,
- DeptDesc text NOT NULL,
- )
- CREATE TABLE tb_major(
- MajorNum char(10) NOT NULL PRIMARY KEY,
- DeptNum char(10) NOT NULL,
- MajorName varchar(20) NOT NULL,
- MajorAssistant varchar(10) NOT NULL,
- MajorTel varchar(15) NOT NULL,
- FOREIGN KEY (DeptNum) REFERENCES tb_dept(DeptNum)
- )
- CREATE TABLE tb_student(
- StudentNum char(10) NOT NULL PRIMARY KEY,
- MajorNum char(10) NOT NULL,
- StudentName varchar(10) NULL,
- StudentSex char(2) NOT NULL,
- StudentBirthday datetime NOT NULL,
- StudentPassword varchar(20) NOT NULL,
- FOREIGN KEY (MajorNum) REFERENCES tb_major(MajorNum)
- )
- CREATE TABLE tb_teacher(
- TeacherNum char(10) NOT NULL PRIMARY KEY,
- DeptNum char(10) NOT NULL,
- TeacherName varchar(10) NOT NULL,
- TeacherSex char(2) NOT NULL,
- TeacherBirthday datetime NOT NULL,
- TeacherTitle varchar(20) NULL,
- FOREIGN KEY (DeptNum) REFERENCES tb_dept(DeptNum)
- )
- CREATE TABLE tb_manager(
- ManagerNum char(10) NOT NULL PRIMARY KEY,
- ManagerName varchar(10) NOT NULL,
- ManagerSex char(2) NOT NULL,
- ManagerBirthdate datetime NOT NULL,
- ManagerRights int NOT NULL
- )
- CREATE TABLE tb_course(
- CourseNum varchar(10) NOT NULL PRIMARY KEY,
- CourseName varchar(20) NOT NULL,
- CourseCredit float NOT NULL,
- CourseClass smallint NOT NULL,
- CourseDesc text NOT NULL,
- )
- CREATE TABLE tb_stucourse(
- StudentNum char(10) NOT NULL,
- CourseNum char(10) NOT NULL,
- TeacherNum char(10) NOT NULL,
- Grade smallint NULL,
- FOREIGN KEY (StudentNum) REFERENCES tb_student(StudentNum),
- FOREIGN KEY (CourseNum) REFERENCES tb_Course(CourseNum),
- FOREIGN KEY (TeacherNum) REFERENCES tb_teacher(TeacherNum),
- )
- CREATE TABLE tb_control(
- IfTakeCourse char(1) NOT NULL check(IfTakeCourse in ( '0', '1')),
- IfInputGrade char(1) NOT NULL check(IfInputGrade in ( '0', '1')),
- )
5.2 创建必要视图
(1)建立学生成绩视图vi_grade,从学生、老师、选课表中选择Grade不为空的记录,其关键代码如下所示:- CREATE VIEW vi_grade
- AS
- SELECT tb_stucourse.StudentNum,StudentName,CourseName
- ,CourseCredit,TeacherName,Grade
- FROM tb_stucourse,tb_student,tb_course,tb_teacher
- where tb_stucourse.StudentNum=tb_student.StudentNum and
- tb_stucourse.TeacherNum=tb_teacher.TeacherNum and
- tb_stucourse.CourseNum=tb_course.CourseNum and
- Grade is not null
- CREATE VIEW vi_major
- AS
- SELECT tb_major.MajorName,StudentNum,StudentName,StudentSex,StudentBirthday
- FROM tb_major,tb_student
- WHERE tb_major.MajorNum=tb_student.MajorNum
5.3 创建必要触发器
(1)建立学生添加院系触发器tri_adddept,当该表中已存在所对应院系号码的院系时,系统给与错误提示并回滚,其关键代码如下所示:- CREATE TRIGGER tri_adddept ON tb_dept
- FOR INSERT,UPDATE
- AS
- IF
- (SELECT COUNT(*) FROM tb_dept,inserted
- WHERE tb_dept.DeptNum=inserted.DeptNum)>0
- BEGIN
- PRINT '院系号码产生冲突,请核对后重试!'
- ROLLBACK
- END
- CREATE TRIGGER tri_addmajor ON tb_major
- FOR INSERT,UPDATE
- AS
- IF(SELECT COUNT(*) FROM tb_dept,inserted
- WHERE tb_dept.DeptNum=inserted.DeptNum)=0
- BEGIN
- PRINT '未找到该专业的院系信息,请添加相应院系后重试!'
- ROLLBACK
- END
- ELSE IF
- (SELECT COUNT(*) FROM tb_major,inserted
- WHERE tb_major.MajorNum=inserted.MajorNum)>0
- BEGIN
- PRINT '院系号码产生冲突,请核对后重试!'
- ROLLBACK
- END
- CREATE TRIGGER tri_addstudent ON tb_student
- FOR INSERT,UPDATE
- AS
- IF(SELECT COUNT(*) FROM tb_major,inserted
- WHERE tb_major.MajorNum=inserted.MajorNum)=0
- BEGIN
- PRINT '未找到该学生的专业信息,请添加相应专业后重试!'
- ROLLBACK
- END
- ELSE IF
- (SELECT COUNT(*) FROM tb_student,inserted
- WHERE tb_student.StudentNum=inserted.StudentNum)>0
- BEGIN
- PRINT '学号产生冲突,请核对后重试!'
- ROLLBACK
- END
- CREATE TRIGGER tri_takecourse ON tb_stucourse
- FOR INSERT,UPDATE
- AS
- IF(SELECT COUNT(*) FROM tb_stucourse,inserted
- WHERE tb_stucourse.CourseNum=inserted.CourseNum)>40
- BEGIN
- PRINT '所对应课程选课人数不能超过40个!'
- ROLLBACK
- END
- ELSE IF
- (SELECT COUNT(*) FROM tb_student,inserted
- WHERE tb_student.StudentNum=inserted.StudentNum)>5
- BEGIN
- PRINT '对应学生的选课不能超过5门!'
- ROLLBACK
- END
- ELSE IF
- (SELECT IfTakeCourse FROM tb_control)='0'
- BEGIN
- PRINT '当前不是选课时间段!'
- ROLLBACK
- END
5.4 创建必要存储过程
(1)建立学生选课存储过程tri_takecourse,其作用为查询所有学生的选课记录,其关键代码如下所示:- CREATE PROC proc_getcourse
- @StudentNum char(10) OUT,
- @StudentName char(10) OUT,
- @CourseName varchar(20) OUT,
- @CourseCredit float OUT,
- @TeacherName char(10) OUT
- AS
- SELECT @StudentNum=tb_student.StudentNum
- ,@StudentName=tb_student.StudentName
- , @CourseName=tb_course.CourseName
- ,@CourseCredit=tb_course.CourseCredit
- , @TeacherName=tb_teacher.TeacherName
- FROM tb_stucourse,tb_course,tb_student,tb_teacher
- WHERE tb_stucourse.StudentNum=tb_student.StudentNum AND
- tb_stucourse.CourseNum=tb_course.CourseNum AND
- tb_stucourse.TeacherNum=tb_teacher.TeacherNum
- CREATE PROC proc_teachercourse
- @TeacherNum char(10),
- @StudentNum char(10) OUT,
- @StudentName char(10) OUT,
- @CourseName varchar(20) OUT,
- @CourseCredit float OUT,
- @TeacherName char(10) OUT
- AS
- SELECT @StudentNum=tb_student.StudentNum
- ,@StudentName=tb_student.StudentName
- , @CourseName=tb_course.CourseName
- ,@CourseCredit=tb_course.CourseCredit
- , @TeacherName=tb_teacher.TeacherName
- FROM tb_stucourse,tb_course,tb_student,tb_teacher
- WHERE tb_stucourse.StudentNum=tb_student.StudentNum AND
- tb_stucourse.CourseNum=tb_course.CourseNum AND
- tb_stucourse.TeacherNum=tb_teacher.TeacherNum and
- tb_teacher.TeacherNum=@TeacherNum
- CREATE PROC proc_studentcourse
- @StudentNum char(10),
- @StudentName char(10) OUT,
- @CourseName varchar(20) OUT,
- @CourseCredit float OUT,
- @TeacherName char(10) OUT
- AS
- SELECT @StudentNum=tb_student.StudentNum
- ,@StudentName=tb_student.StudentName
- , @CourseName=tb_course.CourseName
- ,@CourseCredit=tb_course.CourseCredit
- , @TeacherName=tb_teacher.TeacherName
- FROM tb_stucourse,tb_course,tb_student,tb_teacher
- WHERE tb_stucourse.StudentNum=tb_student.StudentNum AND
- tb_stucourse.CourseNum=tb_course.CourseNum AND
- tb_stucourse.TeacherNum=tb_teacher.TeacherNum and
- tb_student.StudentNum=@StudentNum
六、总结
经过这一个学期数据库原理与应用的学习,我对数据库的使用更加顺手了,尤其是最近两个星期的数据库最后一个实验(数据库设计)给我带来了挑战,数据库设计的是一个系统,而非一两张表,因此在对待表与表之间的关系的时候要有一种宏观上的认识。在设计这个数据库系统的时候我学到了许多新知识,如使用PowerDesign数据模工具对数据库逻辑结构的建立,转换为物理模型,然后连接到SQL Server,再进行视图、触发器和存储过程的设计等。在使用过程中,查阅了不少资料,包括网上和书籍等,锻炼了我的自学能力!