高校教务管理系统数据库模型
- 需求分析
- 事务需求(权限)
- 概念结构设计
- 逻辑结构设计
- 物理设计
- 数据库实现
- 一、 问题总结
需求分析
对教务管理系统进行模块划分,分步进行设计和管理:
1、 学生信息管理
该模块是教务工作人员进行对学生信息的管理,进行学生信息的添加、修改、删除。在进行信息的添加时,首先在新的窗口进行学生信息的录入,在保存的时候要进行学生学号是否有重复的检查,如果添加的学生编号有重复就要对用户进行提示。只有在不重复的情况下才能进行信息的添加。在进行信息的删除时,要首先打开提示窗口让用户确认是否要删除,只有在用户确认的情况下才能进行信息的删除。在进行信息的修改时,要根据用户选定的学生进行修改,即列出用户选定的学生的所有信息,在这个基础上进行学生信息的修改。
2、 教师信息管理
教务工作人员通过此模块来管理教师信息,包括教师信息的添加、修改、删除等。
信息的添加时,需要验证教师的编号是否重复;删除和和修改学生信息,和学生信息管理模块相同。
3、 院系管理
此模块是用来管理院系的信息,包括班级院系的添加,修改,删除等。在进行信息的添加时,需要进行班级的编号是否重复的检查,如院系编号重复则对用户进行提示,不重复则添加成功。院系管理模块的删除和修改和学生信息管理模块相同。
4、 课程信息管理
教务工作人员通过该模块来管理课程的基本信息,包括课程信息的添加,修改,删除和班级课程的设置等,具体做法同前面的模块。
5、 成绩管理
教务工作人员通过该模块来进行学生成绩的管理,在进行学生成绩的添加时,可用它来为学生设置所在班级的课程表来直接输入成绩。
6、 打印管理
教务工作人员可以通过打印模块来打印学生成绩信息,选课表和班级表。可以根据班级、学生学号、课程编号来打印学生成绩单,打印前还要可以预览所要打印的报表。
7、 综合查询
通过该模块可以查询教务所需要的各种信息。如学生信息查询提供了包括学生学号、姓名、所在班级、班主任名字和宿舍等信息,学生信息进行查询的各种查询条件,用户可以根据单个的查询条件或者它们的组合来进行查询。同时,在查询的时候还提供了进行模糊查询的功能,即该模块能够利用读者输入的非完整的查询条件进行查询,这样更加方便了用户的查询管理。综合查询模块包括了学生信息查询、教师信息查询、班级信息查询、院系信息查询、课程信息查询和成绩查询等各种功能查询。
8、 系统管理
该模块可以对系统登录的用户进行管理。在该模块中,教务人员可以添加允许登录的人员名单以及相应的密码,并对已有的用户进行密码修改或删除。
(结构如上图)
事务需求(权限)
综合分析教务管理系统各模块,我们需要对该系统实现基本的功能,并实现对用户对象的使用做出相应的权限。
1、 学生可以查看学生自己的成绩、课程安排、课程表。
2、 教师可以可以查看自己的基本信息、考试安排,可以对学生进行成绩的录入,不能添加、修改、删除系统的用户。
3、 教务人员可以通过系统管理模块对系统用户进行添加、修改、删除;可以对学生的基本信息、成绩、课程、宿舍等进行添加、修改、删除;可以对教师的基本信息、课程安排进行各种操作;可以对各种模块进行更新和删除操作。
概念结构设计
概念设计是对整个数据库系统的一个抽象的描述和整体的概括,我们可以更加直观的去理解教务管理系统的结构,形成一个独立于具体DBMS(数据库管理系统)的概念模型,概念设计生成E-R图。
逻辑结构设计
1、学生信息管理:学生的学号、姓名、性别、专业、院系、联系方式(电话)
2、教师信息管理:教师的编号、姓名、性别、主讲课程、联系方式(电话)
3、院系管理:系别编号、系别名称、系主任、系主任联系方式(电话)
4、成绩管理:学生学号、姓名、课程号、课程名称、分数
5、课程信息表:课程号、课程名、任课教师、学分
6、系统管理:管理员姓名、性别、电话
根据这些模块的划分,结合模块的属性,我们需要在数据库中建立以下表:学生信息表(Student)、教师信息表(Teacher)、院系表(Department)、课程信息表(Course)、成绩表(Achievement)、管理员信息表(Administrator)。
学生信息表
属性名 | 类型 | 宽度 | 主键 | 取值范围 |
Sid | 字符型 | 10 | 是 | |
Sname | 字符型 | 20 | ||
Ssex | 字符型 | 2 | ||
Spre | 字符型 | 20 | ||
Sdep | 字符型 | 20 | ||
Stel | 字符型 | 13 |
教师信息表
属性名 | 类型 | 宽度 | 主键 | 取值范围 |
Tid | 字符型 | 10 | 是 | |
Tname | 字符型 | 20 | ||
Tsex | 字符型 | 2 | ||
Tcou | 字符型 | 20 | ||
Ttel | 字符型 | 13 |
院系表
属性名 | 类型 | 宽度 | 主键 | 取值范围 |
Did | 字符型 | 10 | 是 | |
Dmc | 字符型 | 20 | ||
Dname | 字符型 | 20 | ||
Dtel | 字符型 | 13 |
课程信息表
属性名 | 类型 | 宽度 | 主键 | 取值范围 |
Cid | 字符型 | 10 | 是 | |
Cname | 字符型 | 20 | ||
Stc | 字符型 | 10 | ||
Cxf | 字符型 | 5 |
成绩信息表
属性名 | 类型 | 宽度 | 主键 | 取值范围 |
Sid | 字符型 | 10 | ||
Sname | 字符型 | 20 | ||
Cid | 字符型 | 10 | ||
Cname | 字符型 | 20 | ||
Afs | tinyint, |
系统信息表
属性名 | 类型 | 宽度 | 主键 | 取值范围 |
Aname | 字符型 | 20 | ||
Asex | 字符型 | 2 | ||
Atel | 字符型 | 13 |
物理设计
数据库的物理设计是对前一阶段的逻辑设计进行具体的物理实现,把我们的思想转化为实实在在的物理应用,通过对数据库的实践操作来实现我们的前期设计,良好的物理设计能很好的体现数据库的设计质量。在这阶段,我们需要确定在物理设备上的存储模式和存取方法,反复的思考,多次的评估,以确保物理路径清晰,各个表之间的相互关系明确;理清内模式以及内模式和模式之间的映像关系。具体来说,可以分为五步完成,前三步设计物理结构设计,后两步设计到约束和具体程序的设计:
- (1) 存储记录结构设计:包括记录的组成,数据项的类型、长度,以及逻辑记录到存储记录的映射。
- (2) 确定数据存放位置:可以把经常同时被访问的数据组合在一起,“记录聚簇”技术能满足这个要求(该技术在网上查询到的)。
- (3) 存取方法的设计:存取路径可分为主存取路径和辅存取路径,前者用于主键的检索,后者用于辅助键的检索。
- (4) 完整性和安全性的考虑:设计者应在完整性、安全性、有效性和效率方面进行分析,作曲权衡。
数据库实现
数据库实施阶段,运用DBMS提供的宿主语言,根据逻辑设计和物理设计的结果,建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。
1、创建数据库
(1) 打开SQL工具“查询分析器”
(2) 在查询窗口中键入下列SQL语句
create database Edu_System
执行上述SQL语句即可新建一名为Edu_System的数据库
2、创建数据表
数据表是数据库中一个非常重要的对象,是其他对象的基础。数据库只是一个框架,数据表才是内容的实质,建表的原则:一个完整的数据库不可缺少的就是数据表,若干个数据表的集合成一个数据库。数据表主要用来存放一定格式的记录,数据表中的行被称为记录,列被称为字段。创建数据表的过程其实就是定义字段的过程。
创建数据库后,为Edu_System数据库添加数据表,步骤如下 :
(1) 新建查询窗口
(2) 在查询窗口中键入下列SQL语句创建表,同时建立主键和外键:
(学生信息表)
create table Student( /* 创建学生信息表*/
Sid char(10) primary key, /* 学号*/
Sname varchar(20) not null, /* 姓名*/
Ssex char(2) check (Ssex in ('男','女')), /* 性别*/
Spre varchar(20), /* 专业*/
Sdep varchar(20), /* 院系 */
Stel char(13), /* 联系电话*/
)
(教师信息表)
create table Teacher( /* 创建教师信息表*/
Tid char(10) primary key, /* 编号*/
Tname varchar(20) not null, /* 姓名*/
Tsex char(2) check (Tsex in ('男','女')), /* 性别*/
Tcou varchar(20), /* 主讲课程*/
Ttel char(13), /* 电话*/
)
(院系表)
create table Department( /* 创建院系表*/
Did char(10) primary key, /* 编号*/
Dmc varchar(20) not null, /* 系别名称*/
Dname varchar(20) not null, /* 系主任*/
Dtel char(13), /* 电话*/
)
(课程信息表)
create table Course( /* 创建课程信息表*/
Cid char(10) primary key, /* 课程号*/
Cname varchar(20) not null, /* 课程名*/
Stc varchar(10), /* 任课教师*/
Cxf varchar(5), /* 学分 */
)
(成绩信息表)
create table Achievement( /* 创建成绩信息表*/
Sid char(10) not null foreign key references Student(Sid), /* 学号*/
Sname varchar(20) , /* 姓名*/
Cid char(10) not null foreign key references Course(Cid), /* 课程号*/
Cname varchar(20) , /* 课程名*/
Afs tinyint, /* 分数 */
)
(系统管理表)
create table Administrator( /* 创建系统管理表*/
Aname varchar(20) not null, /* 管理员姓名*/
Asex char(2) check (Asex in ('男','女')), /* 性别*/
Atel char(13) not null, /* 联系电话*/
)
3.运用sql语句向表格中插入数据:
(学生信息表)
INSERT INTO Student(Sid,Sname,Ssex,Spre,Sdep,Stel)
VALUES ('0811090101','熬霞','女','信息管理与信息系统','工商管理学院','15232326361');
INSERT INTO Student(Sid,Sname,Ssex,Spre,Sdep,Stel)
VALUES ('0811090102','陈健','男','信息管理与信息系统','工商管理学院','15232326362');
INSERT INTO Student(Sid,Sname,Ssex,Spre,Sdep,Stel)
VALUES ('0811090103','陈勤','男','信息管理与信息系统','工商管理学院','15232326363');
INSERT INTO Student(Sid,Sname,Ssex,Spre,Sdep,Stel)
VALUES ('0811090104','陈欣欣','女','信息管理与信息系统','工商管理学','15232326364');
INSERT INTO Student(Sid,Sname,Ssex,Spre,Sdep,Stel)
VALUES ('0811090105','戴柯柯','男','信息管理与信息系统','工商管理学','15232326365');
(教师信息表)
INSERT INTO Teacher(Tid,Tname,Tsex,Tcou,Ttel)
VALUES ('101','王刚','男','数据结构 ','15242421001');
INSERT INTO Teacher(Tid,Tname,Tsex,Tcou,Ttel)
VALUES ('102','高星','男','计算机网络','15242421002');
INSERT INTO Teacher(Tid,Tname,Tsex,Tcou,Ttel)
VALUES ('103','肖娟','女','java程序设计','15242421003');
INSERT INTO Teacher(Tid,Tname,Tsex,Tcou,Ttel)
VALUES ('104','许伟丽','女','项目管理','15242421004');
INSERT INTO Teacher(Tid,Tname,Tsex,Tcou,Ttel)
VALUES ('105','刘书霞','男','jsp程序设计','15242421005');
(院系表)
INSERT INTO Department(Did,Dmc,Dname,Dtel)
VALUES ('201','工商管理学院','秦波','15262620011');
INSERT INTO Department(Did,Dmc,Dname,Dtel)
VALUES ('202','数信学院','韩旭','15262620012');
INSERT INTO Department(Did,Dmc,Dname,Dtel)
VALUES ('203','文法学院','陈其','15262620013');
INSERT INTO Department(Did,Dmc,Dname,Dtel)
VALUES ('204','财经学院','魏芳','15262620014');
INSERT INTO Department(Did,Dmc, Dname,Dtel)
VALUES ('205','体育系','李元','15262620015');
(课程信息表)
INSERT INTO Course(Cid,Cname,Stc,Cxf)
VALUES ('301','数据结构','王刚','4');
INSERT INTO Course(Cid,Cname,Stc,Cxf)
VALUES ('302','计算机网络','高星','3');
INSERT INTO Course(Cid,Cname,Stc,Cxf)
VALUES ('303','java程序设计','肖娟','4');
INSERT INTO Course(Cid,Cname,Stc,Cxf)
VALUES ('304','项目管理','许伟丽','2');
INSERT INTO Course(Cid,Cname,Stc,Cxf)
VALUES ('305','jsp程序设计','刘书霞','3');
(系统管理表)
INSERT INTO Administrator(Aname,Asex,Atel)
VALUES ('张操','男','15372720001');
INSERT INTO Administrator(Aname,Asex,Atel)
VALUES ('许杰','男','15372720002');
INSERT INTO Administrator(Aname,Asex,Atel)
VALUES ('吴旭','男','15372720003');
INSERT INTO Administrator(Aname,Asex,Atel)
VALUES ('安鹏','男','15372720004');
INSERT INTO Administrator(Aname,Asex,Atel)
VALUES ('冉静','男','15372720004');
(成绩信息表)
INSERT INTO Achievement(Sid,Sname,Cid,Cname,Afs)
VALUES ('0811090101','熬霞','301','数据结构','98');
INSERT INTO Achievement(Sid,Sname,Cid,Cname,Afs)
VALUES ('0811090101','熬霞','302','计算机网络','92');
INSERT INTO Achievement(Sid,Sname,Cid,Cname,Afs)
VALUES ('0811090101','熬霞','303','java程序设计','97');
INSERT INTO Achievement(Sid,Sname,Cid,Cname,Afs)
VALUES ('0811090101','熬霞','304','项目管理','93');
INSERT INTO Achievement(Sid,Sname,Cid,Cname,Afs)
VALUES ('0811090101','熬霞','305','jsp程序设计','94');
(该图只是部分数据)
4.运用sql语句进行查询
- 查询所有学生的课程编号为304(即项目管理),且成绩大于95的学生:
select * from Achievement where(Cid=304 and Afs>95)
查询结果如下图:
- 对学生的某一门课程进行查询,并按降序显示结果:
select * from Achievement order by afs desc
- 关联查询:查询成绩管理表中课程为 模电,学号为01的同学的手机号码
select t1.Sname,t1.Stel from Student t1
inner join Achievement t2 on t1.Sid=t2.Sid
where t2.Cname like '模电%' and t2.Sid='01'
- 聚合函数查询:查询课程平均分大于80的同学成绩的姓名,学号,院系,最高分,最低分,平均分,并按姓名分组,平均分倒序排列
select t1.Sid,t1.Sname,t1.spre,max(t2.afs) zgf, min(t2.afs) zdf ,avg(t2.afs) pjf
from Student t1
right join Achievement t2 on t1.Sid=t2.Sid
where 1=1
group by t1.Sid,t1.Sname ,t1.spre
having avg(t2.afs) > 60
order by avg(t2.afs) desc
- 创建视图,视图可以将不同表中的数据通过关联实现多表数据输出
create view newView
as
select Sid,Sname,Cname,Afs
from Achievement
where Sid=0811090104
- 视图如下:
- 存储过程,查询上述(5) 题干查询结果中,学生编号为01的数据结果
use teaching
go
create procedure achi_pro @sid char(4)
as
select t1.Sid,t1.Sname,t1.spre,max(t2.afs) zgf, min(t2.afs) zdf ,avg(t2.afs) pjf from Student t1
right join Achievement t2 on t1.Sid=t2.Sid
where 1=1 and t1.sid=@sid
group by t1.Sid,t1.Sname ,t1.spre
having avg(t2.afs) > 60
order by avg(t2.afs) desc
execute achi_pro '01'
一、 问题总结
- (1) 需求分析阶段,考虑问题不全面,以致于需求分析迟迟做不出来。
- (2) 在绘制 ER图时,总是设计不出满意的图形,经过本人多次修改才完成以上这张感觉不错的ER图。
- (3) 创建数据表时,为主键和外键费了很大的精力,总是不能得到满意的结果。经多次查询各种资料,完成这种关系的确立。
在这个数据库的设计过程中,让我对SQL server 有了更多的了解,更加熟练的去使用这个数据库。对SQL语句也有更多的理解,巩固了知识的理解和运用,养成良好的动手能力,培养一种热爱思考的思维和习惯。