高校成绩管理数据库系统分析与设计

1、需求分析

高校成绩管理系统是一个记录和管理学生成绩的系统,该系统可以使学生、教师和管理员进行查询、更新、插入、删除各项信息操作。高校成绩管理系统使得学校、老师对学生信息的管理更加简单,更加高效,在提供便捷的同时也使成本得以降低。

使用计算机对成绩信息的管理,具有手工管理所无法比拟的优点:信息存储及时,检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高学生成绩管理的效率,也是高校成绩正规化管理的重要途径。

应用环境:SQL Server 2008 R2 Management Studio、Visual Studio 2019

根据实际工作需要,提出了以下数据和业务处理需求:

1.1小组分工

小组完成一个高校成绩管理系统,本人主要做学生的退补选课,选课结果的增删改,并且完成了登陆界面,输入账号自动识别相应用户的身份,转到不同的界面,以及相应的修改密码操作。

1.2 数据需求描述

图1-1 初级数据流图

在这里插入图片描述
图1-2 系统功能模块图
在这里插入图片描述

1.3 系统功能需求

  • 学生:
  1. 课程的退补选

  2. 学生查询可选课程

  3. 进行选课

  4. 对所选课程进行补选、退选

  5. 查询信息

  6. 学生成绩查询,得到个人每学期成绩单

  7. 学生课表查询,可打印出每学期课表

  8. 学生选课结果查询

  9. 学生个人信息查询

  10. 登录密码修改

  • 教师:
  1. 教师教学班成绩录入

  2. 学生名册浏览

  3. 成绩录入

  4. 成绩提交

  5. 成绩分析

  6. 打印成绩单

  7. 登录密码修改

  • 管理员:
  1. 对教学班的增删改查

  2. 新增教学班

  3. 对已结课的教学班进行删除

  4. 对教学班中的数据进行修改

  5. 对教学班的信息进行查询

  6. 登录密码修改

1.4 其他性能需求

  1. 对于并发用户数的需求,可供多个学生或老师同时使用此系统。

    1. 在用户进行输入修改时,可以进行检查并产生提示。

    2. 响应时间应该尽可能的小。

    3. 安全性需求高。

2、概念结构设计

2.1 局部E-R图

图2-1 学生实体及其属性图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g81cs3M6-1598330023989)(media/f156292fcf2fbf20d5756e2ec3956750.png)]

图2-2 课程实体及其属性图

图2-3 教师实体及其属性图

图2-4 教学班实体及其属性图

图2-5 教室资源实体及其属性图

图2-6班级实体及其属性图

图2-7联系产生的实体及其属性图

2.2 优化全局E-R图

图2-8 优化全局E-R图

3、逻辑结构设计

3.1 关系模式设计

实体型的关系模式转换:

Login登录表(用户名,密码)

student学生表(学号,学生姓名,性别,出生日期,生源所在地,已修学分,联系方式
,班级号)

teacher教师表(教师号,教师姓名,性别,出生日期,职称,联系方式,学院编号)

college学院表(学院编号,学院名称)

course课程表(课程号,课程名称,学时,学分,开设学期,考察方式,课程类别,学院编号)

class教学班表(教学班号,学年,学期,上课时间,课程号,教师号,教室编号,校区,楼号)

grade班级表(班级号,专业名称,学年,学院编号)

classroom教室资源表(教室编号,校区,楼号,场地类别,座位数)

report选课表(学号,教学班号,学年,平时成绩,期末成绩,总评,备注)

report2选课表(编号,学号,教学班号,学年,平时成绩,期末成绩,总评,备注)

3.2 数据类型定义

  1. login登录表

表3-1

字段名数据类型长度完整性约束描述
namechar12主键,唯一,非空用户名
pswchar12密码
  1. student学生表

表3-2

字段名数据类型长度完整性约束描述
Snochar12主键,唯一,非空学号
Snamechar15学生姓名
Ssexchar2性别
Sbornchar10出生日期
Saddresschar15生源地
Screditint已修学分
Stelchar11联系方式
Gnochar12外键班级号

3、teacher教室表

表3-3

字段名数据类型长度完整性约束描述
Tnochar12主键,唯一,非空教师号
Tnamechar15教师姓名
Tsexchar2性别
Tbirthchar10出生日期
Tpostchar15职称
Tcallchar11联系方式
Cnolchar12外键学院编号

4、course课程表

表3-4

字段名数据类型长度完整性约束描述
Conochar12主键,唯一,非空课程号
Conamechar15课程名称
Coperiodint学时
Cocreditint学分
Cotermint开设学期
Cowaychar5考查方式
CoTypechar20课程类别
Cnochar12外键学院编号

5、report2选课表

表3-5

字段名数据类型长度完整性约束描述
REnochar20主键、唯一、非空编号
Snochar12外键学号
Rusualint平时成绩
Rtestint期末成绩
Rfinalint总评
Rremarkchar5备注
Clnochar20外键教学班号
Clyearchar12外键学年

6、college学院表

表3-6

字段名数据类型长度完整性约束描述
namechar12主键,唯一,非空用户名
pswchar12密码

7、grade班级表

表3-7

字段名数据类型长度完整性约束描述
Gnochar12主键、唯一、非空班级编号
Mnamechar15专业名称
Yearint年级
Cnochar12外键学院编号

8、classroom教室资源表

表3-8

字段名数据类型长度完整性约束描述
Rnochar12主键、唯一、非空教室编号
Areachar5主键、唯一、非空校区
Buildingchar12主键、唯一、非空楼号
Typechar12场地类别
Seatint座位数

3.3 关系模式的优化

为查询操作更加的方便快速高效,创建一下视图:

  1. 视图Scores: 方便查询学生的成绩

表3-9

字段数据类型字段大小必填字段
Clnochar12
Clyearchar12
Mnamechar15
Snochar12
Snamechar15
Rusualint
Rtestint
Rfinalint
Rremarkchar2

2、视图C_Cl

表3-10

字段数据类型字段大小必填字段
Conochar12
Conamechar15
Clnochar12
Clyearchar12
Tnochar12

3、视图CJ: 查询成绩用的视图

表3-11

字段数据类型字段大小必填字段
Snochar12
Snamechar15
Clyearchar12
Cltermint
Conamechar15
Rusualint
Rtestint
Rfinalint
Rremarkchar2

4、视图KB:查询课表

表3-12

字段数据类型字段大小必填字段
Snochar12
Clyearchar12
Cltermint
Conamechar15
Clnumberchar12
Tnamechar10
Areachar5
Buildingchar12
Rnochar12
Cowaychar5
Coperiodint
Cocreditint
CoTypechar20

5.视图XK:查询课表

表3-13

字段数据类型字段大小必填字段
Clyearchar12
Cltermint
Conochar12
Conamechar15
Cnamechar15
Cocreditint
CoTypechar20
Snochar12
Snamechar15
Tnochar12
Tnamechar10
Clnumberchar12
Coperiodint
Areachar5
Buildingchar12
Rnochar12
Ssexchar2
Mnamechar15
Stelchar11

6、视图RR:选课结果

表3-14

字段数据类型字段大小必填字段
序号char20
课程char15
教师char10
上课时间char12
上课地点char24
学分int
课程类型char20
学号char12

7、视图S:查询个人信息

表3-14

字段数据类型字段大小必填字段
Snochar12
Snamechar15
SCchar15
SGchar15
Bchar10
Schar2
Tchar11
Achar15

8、视图RC:

表3-15

字段数据类型字段大小必填字段
学院char15
教学班号char15
教学班char15
教师char10
课程类型char20
上课时间char12
上课地点char24
学分int
开课学年char12
开课学期int
学时int

4、物理结构设计

4.1 聚簇设计

聚簇索引:学生学号Sno、教师编号Tno、登陆用户名name、教学班号Clno、班级编号Gno、学院编号Cno、课程号Cono

4.2 索引设计

聚簇索引:学生姓名Sname、教师联系方式Tcall

唯一索引:无

5.数据库实施

5.1基本表建立

5.1.1 student学生表

1.建表语句

create table student(

Sno char(12) primary key,

Sname char(15),

Ssex char(2),

Sborn char(10),

Saddress char(15),

Scredit int,

Stel char(11),

Gno char (12),

constraint S_Gno foreign key (Gno) references grade);
5.1.2 college学院表

1.建表语句

create table college(

Cno char(12) primary key,

Cname char(15));
5.1.3 grade班级表

1.建表语句


create table grade(

Gno char(12) primary key,

Mname char(15),

Year int,

Cno char(12),

constraint G_Cno foreign key(Cno) references college);
5.1.4 teacher教师表

1.建表语句

create table teacher(

Tno char(12) primary key,

Tname char(10),

Tsex char(2),

Tbirth char(10),

Tpost char(15),

Tcall char(11),

Cno char(12),

constraint T_Cno foreign key(Cno) references college

);
5.1.5 course课程表

1.建表语句

create table course(

Cono char(12) primary key,

Coname char(15),

Coperiod int,

Cocredit int,

Coterm int,

Coway char(5),

CoType char(5),

Cno char(12),

constraint Co_Cno foreign key(Cno) references college);
5.1.6 class教学班

1.建表语句

create table class(

Clno char(12) primary key,

Clyear char(12) primary key,

Clterm int,

Clnumber char(12),

Cono char(12),

Tno char(12),

Rno char(12),

Area char(5),

Building char(12),

constraint Cl_Building foreign key(Building) references classroom,

constraint Cl_Area foreign key(Area) references classroom,

constraint Cl_Rno foreign key(Rno) references classroom,

constraint Cl_Cono foreign key(Cono) references course,

constraint Cl_Tno foreign key(Tno) references teacher);

5.1.7 report选课表1

1.建表语句

create table report(

Sno char(12),

Clno char(12),

Clyear char(12),

Rusual int,

Rtest int,

Rfinal int,

Rremark char(2),

constraint R_Sno foreign key(Sno) references student,

constraint R_Clno foreign key(Clno) references class

constraint R_Clyear foreign key(Clyear) references class);
5.1.8 report选课表2

1.建表语句

create table report(

REno char(20) primary key,

Sno char(12),

Rusual int,

Rtest int,

Rfinal int,

Rremark char(2),

Clno char(12),

Clyear char(12),

constraint R_Sno foreign key(Sno) references student,

constraint R_Clno foreign key(Clno) references class);
5.1.9 classroom教室资源表

1.建表语句

create table classroom(

Rno char(12),

Area char(5),

Building char(12),

Type char(12),

Seat int(3),

primary key(Rno,Area,Building)

);

5.2 视图的建立

5.2.1可选课程视图
create view
RC(学院,教学班号,教学班,教师,课程类型,上课时间,上课地点,学分,开课学年,开课学期,学时)

as(

select
Cname,Clno,Coname,Tname,CoType,Clnumber,Building+Rno,Cocredit,Clyear,Clterm,Coperiod

from college,class,course,teacher

where college.Cno=course.Cno

and class.Cono=course.Cono

and class.Tno=teacher.Tno)

WITH CHECK OPTION
5.2.2选课结果视图
create view RR(序号,课程,教师,上课时间,上课地点,学分,课程类型,学号)

as(

select REno,Coname,Tname,Clnumber,Building+Rno,Cocredit,CoType,Sno

from course,class,teacher,report2

where class.Tno=teacher.Tno

and class.Clno=report2.Clno

and class.Cono=course.Cono

)

with check option
5.2.2个人信息视图
create view S(Sno,Sname,SC,SG,B,S,T,A)

as(

select Sno,Sname,Cname,Mname,Sborn,Ssex,Stel,Saddress

from student,grade,college

where student.Gno=grade.Gno

and grade.Cno=college.Cno)

with check option

5.3 索引的建立

5.3.1建立学生姓名一索引

Create unique index Sname on student(Sname);

5.3.2 建立教师电话唯一索引

Create unique index Tcall on teacher(Tcall);

6、应用系统开发与试运行

6.1 开发平台和开发环境介绍。

开发平台:SQL Server 2018 Management Studio、Visual Studio 2019

开发环境:利用c#语言和数据库sql语言

前台界面与后台数据库连接说明,代码实现。

C#数据库编程:其中有几个重要的数据库访问对象:DataSet对象、Connection对象、Command对象、DataReader对象、DataAdapter对象,用以上几个对象实现前台界面与后台数据库连接。

与数据库连接类SqlConnect:

namespace database

{

class SqlConnect

{

public SqlConnection conn = null;

public SqlConnect()//构造函数,连接数据库

{

if (conn == null)

{

conn = new SqlConnection("Data
Source=(local);database=University_CourseSystem_Mis;uid=admin;password=123456;");

if (conn.State == ConnectionState.Closed) conn.Open();

}

}

public void CloseConnect()//关闭连接函数

{

if (conn.State == ConnectionState.Open) conn.Close();

}

public SqlDataReader aa(string sql)//判断是否有该元组

{

if (conn.State == ConnectionState.Closed) conn.Open();

SqlCommand cmd = new SqlCommand(sql, conn);

cmd.CommandType = CommandType.Text;

SqlDataReader sdr;

sdr = cmd.ExecuteReader();

return sdr;

}

public DataSet Getds(string sql)//获取DATESET类型的数据库查询结果

{

if (conn.State == ConnectionState.Closed) conn.Open();

DataSet ds = new DataSet();//表集合

SqlDataAdapter da = new SqlDataAdapter(sql, conn);//查询

da.Fill(ds);//填充

conn.Close();//关闭连接

return ds;//返回结果

}

public int OperateData(string sql)//修改数据库结果

{

if (conn.State == ConnectionState.Closed) conn.Open();

SqlCommand sqlcom = new SqlCommand();

sqlcom.CommandText = sql;//文本

sqlcom.CommandType = CommandType.Text;//类型

sqlcom.Connection = conn;//连接

int x = sqlcom.ExecuteNonQuery();//执行

conn.Close();//关闭

return x;//返回一个影响行数

}

public void Tos(string s){//将查询结果的某个具体值绑定到公共参数上

SqlCommand sc = conn.CreateCommand();

sc.CommandText = s;

SqlDataReader r = sc.ExecuteReader();

r.Read();

pub.Sname = Convert.ToString(r["Sname"]);

pub.SC= Convert.ToString(r["SC"]);

pub.SG = Convert.ToString(r["SG"]);

pub.B= Convert.ToString(r["B"]);

pub.S = Convert.ToString(r["S"]);

pub.T = Convert.ToString(r["T"]);

pub.A = Convert.ToString(r["A"]);

}

public DataSet BindDataGridView(DataGridView dgv, string sql)//数据视图

{

if (conn.State == ConnectionState.Closed) conn.Open();

SqlDataAdapter da = new SqlDataAdapter(sql, conn);

DataSet ds = new DataSet();

da.Fill(ds);

dgv.DataSource = ds.Tables[0];

return ds;

}

}

}

6.3 系统各功能设计和运行界面截图。

登录界面:分别学生、教师、管理员三种用户登录(自动识别不同身份的用户名,登陆进不同的主界面)

图6-1登录界面

6.3.1学生功能:

1、学生登录

图6-2 学生登录界面

2、学生主界面

图6-3 学生登陆的主界面

3、查询个人信息

图6-4 学生查询个人信息

4、学生选课界面

、

图6-5 学生选课界面

图6-6 根据可选课程进行筛选,以及验证数据库

图6-7 文本框输入模糊查询结果

图6-8 选课

图6-9 不会重复选同一节课

图6-10 查看已选课程,并验证数据库

图6-11 退选

图6-12 验证是否退课成功

图6-13 同一时间段的两节课禁止选

5、修改密码

图6-14 修改密码需要两次输入相同密码

图6-15 密码修改成功

6.3.2教师界面测试:

图6-16 教师账号登陆

图6-17 教师账号登陆

6.3.3管理员界面测试:

图6-18 管理员账号登陆

图6-19 管理员账号登陆

7、实验总结

7.1 遇到的问题和解决的办法

a)前期没有充分的思考用户需求导致思路不清晰

一开始和队友大概的分析了用户需求,并没有十分详细的了解并且系统的分析,所以在建基本表以及写嵌入式语言、写前端时需要反复的改基本表的属性以及一些条件约束等等。所以在以后的大实验过程中,前期的讨论与充分的分析十分重要,应当重视。

b)在vs上写嵌入式sql语句时常见错误

在vs上写sql语句时,需要用到双引号。而一些属性需要单引号才可以使用。所以在执行系统时,会遇到不能进行此操作这种提示。遇到这类的问题,我首先会排查是否是sql语句写的不正确,我会将这条语句复制到数据库进行执行,如果在数据库中执行成功,则大多是单引号双引号的问题,再进行排查即可。

c)如何获取数据库内容

窗体中有组件可以放数据库数据,但是不知道如何在选中行直接获取某一列的值以及或者是DateSet中的某一个单元格的值,为了解决这个问题,查了比较多的资料,才成功解决了该问题。

  • 第一种是用SqlCommand来绑定相应的值,并显示在固定位置:
 public void Tos(string s){//将查询结果的某个具体值绑定到公共参数上

SqlCommand sc = conn.CreateCommand();

sc.CommandText = s;

SqlDataReader r = sc.ExecuteReader();

r.Read();

pub.Sname = Convert.ToString(r["Sname"]);

pub.SC= Convert.ToString(r["SC"]);

pub.SG = Convert.ToString(r["SG"]);

pub.B= Convert.ToString(r["B"]);

pub.S = Convert.ToString(r["S"]);

pub.T = Convert.ToString(r["T"]);

pub.A = Convert.ToString(r["A"]);

}
  • 第二种获取数据库视图中某一个单元的具体值:
    private void dataGView_CellContentClick(object sender,
    DataGridViewCellEventArgs e)

{

int index = dataGView.CurrentRow.Index;

pub.Rcl = dataGView.Rows[index].Cells[1].Value.ToString();//教学班编号

//MessageBox.Show(pub.Rcl);

pub.Ry = dataGView.Rows[index].Cells[8].Value.ToString();//学期

pub.Rn = dataGView.Rows[index].Cells[5].Value.ToString();//节数

}
  • 第三种,获取dataset中某行某列的值,还可以判断查询结果是否为空
sql = "select \* from RR where 上课时间='" + pub.Rn + "'";//是否有时间冲突

ds = con.Getds(sql);

time = ds.Tables[0].Rows[0]["序号"].ToString();

if (ds == null \|\| ds.Tables[0].Rows.Count == 0)//是否查询结果为空

d) 数据库绑定下拉框

可以将数据库中的属性值绑定到下拉框中,但是如何再绑定后的下拉框中再加一个项,增加一个全部项,增加查询条件:

protected void cmbTBind()

{

try

{

cmbT.DropDownStyle = ComboBoxStyle.DropDownList;

cmbT.Items.Clear();

ds = con.Getds("select distinct 课程类型 from RC");

DataRow dt = ds.Tables[0].NewRow();//增加项

dt["课程类型"] = "全部";

ds.Tables[0].Rows.InsertAt(dt, 0);

cmbT.DisplayMember = "课程类型";

cmbT.DataSource = ds.Tables[0];

cmbT.SelectedIndex = 0;

//cmbT.Items.Insert(0, "全部");

}

catch (Exception)

{

MessageBox.Show("不能作该操作!", "提示", MessageBoxButtons.OK,
MessageBoxIcon.Information);

}

}

7.2 系统设计的不足

  1. 并发操作

在这次的构建系统中,我没有思考到并发操作这一问题。高校学生管理系统是一个多用户会同时在线的系统,如何保证在并发操作时,实现数据的安全性、正确性是十分重要的。所以我认为并发操作不可缺少。

  1. 基本表之间的联系以及属性的约束

在建表的过程中,通过不断的讨论和设计,已经建立了一个较为完整的系统结构,但是在设计实际过程中就发现有很多实际问题,比如选课的时候,不可能选同一节课,同一时间也不可能选两节课,这就需要很多的唯一索引,但是在建表的时候并没有考虑到,所以只能用代码来尽量优化。

7.3 进一步改进思路

  1. 安全性

学生以及老师的登录用户名和密码需要进行保护,最重要的是管理员的用户名与密码。可以通过动态定时改变密码,也可以创建一个触发器,设置当输入密码错误,就自动更换一个密码,并传送到管理员的手机中等等的方法。

  1. 用户登录问题

在登录界面上,可以设置一个注册界面,并且当设置成功时,将学号或者用户名自动添加到学生信息表和教师信息表中,同时将用户名与密码添加到login表中。

  1. 界面的美化

c#写的前端界面不够简洁好看,可以尝试使用javaweb的方法写html和jsp文件,实现前端界面的美化以及一些前端的表示逻辑。

  1. 管理员和教师的功能实现

我的数据库部分只需要实现学生的选课功能,但是在界面设计的时候也放了一些查询的功能,以及管理员和教师登陆后的主界面窗口,时间足够的话,可以将小组实验尝试合并,形成一个完整的数据库管理系统,使系统的功能更加的丰富饱满,提高系统的实用性。

7.4 实验体会

在这次短学期中,利用短短4天的时间要完成学生选课模块的功能,写了,虽然只需要完成这一个功能,但是为了提高实用性,不断地优化和改进选课模块的各个细节以及现实问题,做了较多的考虑和修改。

而且在实际执行sql语言后,发现前期与队友分析的一些用户需求不够全面完整,所以反反复复修改了好几次基本表。所有的sql语言其实不是特别的难,需要的是编写代码的时候的细心。

再解决完一些基础问题、实现基础功能之后,最大的问题是如何优化该功能,为了更加的方便操作贴近生活,增加可选功能,一个一个细节的慢慢优化,可能编写基础框架只用了优化的1/4时间,并且再改进过程中查询了大量的资料,了解了很多相关知识,才能够最后实现预想的成果,比如选中某一行数据,在点击按钮就可以添加选课,而不需要再次筛选条件来插入选课记录。在查询现有的可选课程时,参考了正方系统的选课界面,添加四个条件选项,并且还可以通过文本搜索来实现查询,尽量将系统做到人性化。

源码链接:https://github.com/bumor/database.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值