数据库系统课程设计(高校成绩管理数据库系统的设计与实现)
Posted 阿阿阿扶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库系统课程设计(高校成绩管理数据库系统的设计与实现)相关的知识,希望对你有一定的参考价值。
目录
1.需求分析
开发平台:Microsoft Visual Studio 2013
开发环境:微软在Builder 2013开发者大会上发布了Visual Studio 2013预览版,并且发布其程序组件库.NET 4.5.1的预览版,该软件已于北京时间2013年11月13日23:00时正式发布。Visual Studio 2013 预览版以 Visual Studio 2012 和后续的Microsoft Visual Studio 更新中的进展为基础构建而成,为开发团队提供需要的解决方案,使其接纳这种转变并开发和交付利用下一波Windows 平台创新 (Windows 8.1) 的新式应用程序,同时在所有 Microsoft 平台上支持多种设备和服务。
1.1 数据需求描述
分析系统的数据需求,用数据字典和数据流图描述系统的数据需求,一般要求有2级(初级和详细级)数据流图,并确定系统开发边界。
1.2 系统功能需求
系统功能框架介绍,处理模块描述。
管理员
- 添加教师名单
- 查询教师名单
- 修改教师信息
- 删除教师信息
- 添加学生名单
- 查询学生名单
- 修改学生名单
- 统计生源地信息
- 修改管理员密码
- 重置教师密码
- 重置学生密码
学生
- 查询个人基本信息
- 查询个人成绩
- 查询班级课表
- 查询个人课表
- 修改个人密码
- 查询自己的总学分
教师
- 查询教师个人信息
- 查询个人任课信息
- 查询所任课程平均成绩
- 查询所任课程学生排名
- 提交所任课程的学生成绩
- 修改个人密码
1.3 其他性能需求
1.3 其他性能需求
(1)用户输入出错时,有错误提示。
(2)给管理员,教师,学生不同的权限,提高数据安全性;
(3)创建触发器,存储过程,防止数据不一致;
2、概念结构设计
2.1 局部E-R图
画出局部的E-R图,进一步进行解释说明。
2.2 全局E-R图
合并成全局的E-R图,5个数据类别之间存在6个关系。
2.3 优化E-R图
因为本次的E-R已经符合了要求,这里就不需要优化了。
3、逻辑结构设计
3.1 关系模式设计
教师teachers(教师编号,教师姓名,教师性别,教师年龄,教师职称,联系电话)
专业major(专业编号,专业名称)
班级class(班级编号,班级名称,专业编号)
学生students(学号,姓名,性别,年龄,地区,已修学分,班级编号)
课程course(课程编号,课程名称,课程学时,教师姓名,课程学期,考核方式,学分)
开设 class-course(课程编号,班级编号)
上课 teacher-class(教师编号,班级编号)
授课 teacher-course(教师编号,课程编号)
成绩报告 reports (学号,课程编号,学期,成绩,教师姓名)
管理员账号administer-account(管理员账号,管理员密码)
教师账号Teachers-account(教师账号,教师密码)
学生账号students-account(学生账号,学生密码)
3.2 数据类型定义
- 教师Teacher表
表1 Teacher表
数据项名 | 数据类型 | 长度 | 完整性约束 |
教师编号 | char | 10 | 主键 |
教师姓名 | char | 10 | |
教师性别 | char | 5 | |
教师年龄 | int | ||
职称 | char | 10 | |
联系电话 | char | 20 |
- 专业Major表
表2 Major表
数据项名 | 数据类型 | 长度 | 完整性约束 |
专业编号 | char | 10 | 主键 |
专业名称 | char | 10 |
- 班级Class表
表3 class表
数据项名 | 数据类型 | 长度 | 完整性约束 |
班级编号 | char | 10 | 主键 |
班级名称 | char | 10 | |
专业编号 | char | 10 | 外键 |
- 学生表Students表
表4 students表
数据项名 | 数据类型 | 长度 | 完整性约束 |
学号 | char | 12 | 主键 |
姓名 | char | 10 | |
性别 | char | 5 | |
年龄 | int | ||
生源所在地 | char | 20 | |
已修学分 | float | ||
班级编号 | char | 10 | 外键 |
- 课程Course表
表5 courses表
数据项名 | 数据类型 | 长度 | 完整性约束 |
课程编号 | char | 10 | 主键 |
课程名称 | char | 10 | |
教师姓名 | char | 10 | |
课程学期 | char | 20 | |
课程学时 | int | >0 | |
考核方式 | char | 5 | |
学分 | float | >0 |
- 开设 class-course表
表6 class-course表
数据项名 | 数据类型 | 长度 | 完整性约束 | |
班级编号 | char | 10 | 主键 | 外键 |
课程编号 | char | 10 | 外键 |
- 上课 teacher-class表
表7 teacher-class表
数据项名 | 数据类型 | 长度 | 完整性约束 | |
教师编号 | char | 10 | 主键 | 外键 |
班级编号 | char | 10 | 外键 |
- 授课 teacher-course表
表8 teacher-course表
数据项名 | 数据类型 | 长度 | 完整性约束 | |
教师编号 | char | 10 | 主键 | 外键 |
课程编号 | char | 10 | 外键 |
- 成绩报告表reports表
表9 reports表
数据项名 | 数据类型 | 长度 | 完整性约束 | |
学号 | char | 12 | 主键 | 外键 |
课程编号 | char | 10 | 外键 | |
学期 | char | 10 | ||
成绩 | int | |||
教师姓名 | char | 10 |
- 教师账号
表10 Teacher-account表
数据项名 | 数据类型 | 长度 | 完整性约束 |
教师编号 | char | 10 | 主键 |
教师密码 | char | 10 |
- 管理员账号
表11 Admin-account表
数据项名 | 数据类型 | 长度 | 完整性约束 |
管理员编号 | char | 10 | 主键 |
管理员密码 | char | 10 |
- 学生账号
表12 student-account表
数据项名 | 数据类型 | 长度 | 完整性约束 |
学生编号 | char | 12 | 主键 |
学生密码 | char | 10 |
3.3 关系模式的优化
该关系模式已经满足规范化需求,这里不进行规范化处理。
4、物理结构设计
4.1 聚簇设计
教师Teacher(教师编号)
课程Course(课程编号)
学生Students(学生编号,班级编号)
班级Class(班级编号)
原因:这几张表都是实体表,同时聚簇中的属性都是主键或是外键,且被访问次数高,而其他表或者这些表上的其他属性被访问次数较低,没有考虑聚簇的必要。
原则:
1基本表中该属性访问次数较多
2基本表中某属性列重复率较高
3基本表中某属性列的值修改很少,或者增加和删除元组次数较少
4.2 索引设计
建立索引的一般规则:
- 在主键属性列和外键属性列上通常都可以分别建立索引,不仅有助于唯一性检查和完整性检查,而且可以加快连接查询的速度。
- 以查询为主的关系可建立尽可能多的索引。
- 对等值连接,但满足条件的元组较少的查询可以考虑建立索引。
- 如果查询可以从索引直接得到结果而不必访问关系,则对此种查询可以建立索引。
所以我们建了这些索引:
(1)
教师表Xum_Teachers18 索引:(教师编号 xm_Tno18)
create unique index Tea_Tno on Xum_Teachers18(xm_Tno18)
(2)
课程表Xum_Courses18 索引:(课程编号xm_Cno18)
create unique index Cour_Cno on Xum_Courses18(xm_Cno18)
(3)
班级表 Xum_Class18 索引:(班级编号 xm_CLno18, 专业编号xm_Mno18)
create unique index Mno_CLno on Xum_Class18(xm_CLno18,xm_Mno18)
(4)
学生表Xum_Students18 索引:(学生学号xm_Sno18,班级编号xm_CLno18)
create unique index CLno_Sno on Xum_Students18(xm_Sno18,xm_CLno18)
(5)
成绩报告表Xum_Reports18 索引:(学生编号xm_Sno18 ,课程编号xm_Cno18)
create unique index Cno_Sno on Xum_Reports18(xm_Sno18,xm_Cno18)
(6)
专业表 xm_Cno18 索引:(专业编号xm_Mno18)
create unique index Majo_Mno on Xum_Majors18(xm_Mno18)
4.3 分区设计
磁盘分区设计的一般原则:
1减少访问冲突,提高I/O并发性。多个事物并发访问同一磁盘时,会产生磁盘访问冲突而导致效率低下,如果事务访问数据均能分布于不同磁盘上,则I/O可并发执行,从而提高数据库访问速度。
2分散热点数据,均衡I/O负担。在数据库中数据访问的频率是不均匀的,那些经常被访问的数据成为热点数据,此类数据宜分散存在于不同的磁盘上,以均衡各个磁盘的负荷,充分发挥多磁盘的并行操作的优势。
3保证关键数据快速访问,缓解系统瓶颈。在数据库中有些数据如数据字典等的访问频率很高,为保证对它的访问不直接影响整个系统的效率,可以将其存放在某一固定磁盘上,以保证其快速访问。
实际例子有将关系和索引放在不同磁盘上,查询时两个磁盘同时运行提高物理I/O效率。
不过考虑到本次课题数据量有限,暂不考虑分区设计。
5、数据库实施
5.1 基本表建立
- (1)教师表建立 Xum_Teachers18
图10 建立教师表
create table Xum_Teachers18 (
xm_Tno18 char(10) primary key,
xm_Tname18 char(10),
xm_Tsex18 char(5),
xm_Tage18 int,
xm_Tpos18 char(10),
xm_Tpho18 char(20)
)
(2)专业表建立Xum_Majors18
create table Xum_Majors18(
xm_Mno18 char(10) primary key,
xm_Mname18 char(10)
)
(3)班级表建立Xum_Class18
create table Xum_Class18(
xm_Clno18 char(10) primary key,
xm_Clname char(10),
xm_Mno18 char(10)
constraint Major_Class foreign key(xm_Mno18) references Xum_Majors18
)
(4)学生表Xum_Students18
create table Xum_Students18(
xm_Sno18 char(12) primary key,
xm_Sname18 char(10),
xm_Ssex18 char(5),
xm_Sage18 int,
xm_Sorig18 char(20),
xm_Ssum18 float,
xm_Clno18 char(10)
constraint Class_Student foreign key(xm_Clno18) references Xum_Class18
)
(5)课程表 Xum_Courses18
create table Xum_Courses18(
xm_Cno18 char(10) primary key,
xm_Cname18 char(10),
xm_Tname18 char(10),
xm_Cdate18 char(20),
xm_Cway18 char(5),
xm_Ccredit18 float check(xm_Ccredit18>0),
xm_Chour18 int check(xm_Chour18>0)
)
(6)授课表 Xum_Tea_Cour18
create table Xum_Tea_Cour18(
xm_Tno18 char(10),
xm_Cno18 char(10),
primary key(xm_Tno18,xm_Cno18),
constraint teacher_course foreign key(xm_Tno18) references Xum_Teachers18,
constraint tea_cour foreign key(xm_Cno18) references Xum_Courses18
)
(7)班级上课表Xum_Class_Cour18
create table Xum_Class_Cour18(
xm_Clno18 char(10),
xm_Cno18 char(10),
primary key(xm_Clno18,xm_Cno18),
constraint class_course foreign key(xm_Clno18) references Xum_Class18,
constraint clas_cour foreign key(xm_Cno18) references Xum_Courses18
)
(8)教师任课表Xum_Teac_Class18
create table Xum_Teac_Class18(
xm_Tno18 char(10),
xm_Clno18 char(10),
primary key(xm_Tno18,xm_Clno18),
constraint tea_class foreign key(xm_Tno18) references Xum_Teachers18,
constraint teach_class foreign key(xm_Clno18) references Xum_Class18
)
(9)成绩表Xum_Reports18
create table Xum_Reports18(
xm_Cno18 char(10),
xm_Sno18 char(12),
xm_Score18 float,
xm_date char(10),
xm_Tname18 char(10),
primary key(xm_Cno18,xm_Sno18),
constraint cour foreign key(xm_Cno18) references Xum_Courses18,
constraint stude foreign key(xm_Sno18) references Xum_Students18
)
(10)管理员账号密码表 (11)学生账号密码表(12)教师账号密码表
create table Students_account18(
xm_Sno18 char(12) primary key,
xm_Skey18 char(10)
)
create table Teachers_account18(
xm_Tno18 char(12) primary key,
xm_Tkey18 char(10)
)
create table Admin_account18(
xm_Ano18 char(12) primary key,
xm_Akey18 char(10)
)
(13)数据库表预览
5.2 视图的建立
(1)学生成绩
create view 学生成绩统计
as
(select Xum_Students18.xm_Sno18,Xum_Students18.xm_Sname18,
Xum_Courses18.xm_Cname18,Xum_Class18.xm_Clname,
Xum_Reports18.xm_Tname18,Xum_Courses18.xm_Ccredit18,
Xum_Courses18.xm_Cdate18,Xum_Reports18.xm_Score18
from Xum_Reports18,Xum_Students18,Xum_Courses18,Xum_Class18
where Xum_Students18.xm_Sno18=Xum_Reports18.xm_Sno18
and Xum_Reports18.xm_Cno18=Xum_Courses18.xm_Cno18
and Xum_Class18.xm_Clno18=Xum_Students18.xm_Clno18
)
(2)课程平均成绩
create view 每门平均成绩
as(
select xm_Cno18,avg(xm_Score18)平均分
from Xum_Reports18
group by xm_Cno18
)
(3)课程和学分统计
create view 课程和学分统计
as
(
select xm_Sno18,xm_Cname18,xm_Ccredit18
from 学生成绩统计
)
(4)教师课表
create view 教师课表
as(
select xm_Tno18,Xum_Teachers18.xm_Tname18,xm_Cno18,xm_Cname18,
xm_Ccredit18,xm_Chour18
from Xum_Teachers18,Xum_Courses18
where Xum_Teachers18.xm_Tname18=Xum_Courses18.xm_Tname18
)
(5)班级课表
create view 班级课表
as
(
select Xum_Class18.xm_Clno18,xm_Clname,Xum_Courses18.xm_Cno18,
xm_Cname18,xm_Cdate18,xm_Ccredit18,xm_Chour18
from Xum_Class18,Xum_Courses18,Xum_Class_Cour18
where Xum_Class18.xm_Clno18=Xum_Class_Cour18.xm_Clno18
and Xum_Class_Cour18.xm_Cno18=Xum_Courses18.xm_Cno18
)
(6)生源地人员统计
create view 生源地人员统计
as
(select xm_Sorig18,count(xm_Sno18)数量
from Xum_Students18
group by xm_Sorig18
)
(7)教师课程成绩
create view 教师课程成绩
as
(
select xm_Tno18,Xum_Teachers18.xm_Tname18,xm_Cno18,xm_Sno18,xm_Score18
from Xum_Teachers18,Xum_Reports18
where Xum_Teachers18.xm_Tname18=Xum_Reports18.xm_Tname18
)
(8)教师与学生成绩
(9)视图预览
5.3 索引的建立
create unique index Tea_Tno on Xum_Teachers18(xm_Tno18)
create unique index Cour_Cno on Xum_Courses18(xm_Cno18)
create unique index Mno_CLno on Xum_Class18(xm_CLno18,xm_Mno18)
create unique index Majo_Mno on Xum_Majors18(xm_Mno18)
create unique index CLno_Sno on Xum_Students18(xm_Sno18,xm_CLno18)
create unique index Cno_Sno on Xum_Reports18(xm_Sno18,xm_Cno18)
5.4 触发器建立
(1)教师删除(删除一个教师时,与教师相关的记录全都删除)
这里漏写了删除教师账号信息 如果运行出错了 可以参考“学生删除“代码 改写触发器
create trigger 教师删除18
on Xum_Teachers18
for delete
as
delete xm_Tno18
where Xum_Tea_Cour18.xm_Tno18=(select xm_Tno18 from deleted)
and Xum_Teac_Class18.xm_Tno18=(select xm_Tno18 from deleted)
(2)学生删除(删除一个学生时,与该学生相关的记录全都删除
create trigger 学生删除18
on Xum_Students18
for delete
as
begin
delete from Xum_Reports18
where Xum_Reports18.xm_Sno18 in (select xm_Sno18 from deleted)
delete from Students_account18
where Students_account18.xm_Sno18 in (select xm_Sno18 from deleted)
end
(3)学生统计(提交成绩时,将》=60的成绩记为合格,同时加上该课程学分)
create trigger 学分统计18 on Xum_Reports18
for insert
as
update Xum_Students18
set xm_Ssum18=(
select sum(xm_Ccredit18)
from Xum_Courses18
where xm_Cno18 in
(
select xm_Cno18
from Xum_Reports18
where xm_Score18>=60
and Xum_Reports18.xm_Sno18 in
(select xm_Sno18
from inserted)
)
)
where Xum_Students18.xm_Sno18 in
(
select xm_Sno18
from inserted
)
(4)教师更新
create trigger 教师更新
on Xum_Teachers18
for update
as
if update(xm_Tno18)
begin
update Xum_Tea_Cour18
set xm_Tno18=i.xm_Tno18
from deleted d,inserted i ,Xum_Tea_Cour18 t
where t.xm_Tno18=d.xm_Tno18
end
begin
update Xum_Teac_Class18
set xm_Tno18=i.xm_Tno18
from deleted d,inserted i,Xum_Teac_Class18 c
where c.xm_Tno18=d.xm_Tno18
end
(5)学生添加 自动注册新用户 默认密码12345
create trigger 插入创建学生新用户18
on Xum_Students18
for insert
as
declare @sno char(10)
begin
select @sno=xm_Sno18 from inserted
insert into Students_account18
values(@sno,'12345')
end
(6)教师添加 自动注册新用户 默认密码12345
create trigger 插入创建教师新用户18
on Xum_Teachers18
for insert
as
declare @tno char(10)
begin
select @tno=xm_Tno18 from inserted
insert into Teachers_account18
values(@tno,'12345')
end
5.5 建存储过程
(1)插入新学生
create procedure pro_插入新学生
@sno char(12),
@sname char(10),
@ssex char(5),
@sage int,
@sorig char(20),
@ssum float,
@clno char(10)
as
insert Xum_Students18(xm_Sno18,xm_Sname18,xm_Ssex18,xm_Sage18
,xm_Sorig18,xm_Ssum18,xm_Clno18)
values(@sno,@sname,@ssex,@sage,@sorig,@ssum,@clno)
select *
from Xum_Students18
go
(2)自动算学分
create procedure pro_输入成绩自动生成学分
@sno char(12),
@cno char(10),
@cname char(10),
@cdate char(10),
@score int,
@tname char(10),
@credit float
as
begin
insert into pro_选修
values(@sno,@cno,@score)
update Xum_Students18
set xm_Ssum18=xm_Ssum18+@credit
where Xum_Students18.xm_Sno18=@sno
end
6、应用系统开发与试运行
6.1 开发平台和开发环境介绍。
Visual studio 2013 + SQL server 2014
Win10系统
6.2 前台界面与后台数据库连接说明,代码实现。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace WindowsFormsApplication1
class sqlConnect
public SqlConnection conn = null;
public sqlConnect()
if (conn == null)
string connectString = "Data Source =LAPTOP-FPCD1SM8\\\\SQL2014; database =XumMIS18; " +
"Integrated Security = True";
conn = new SqlConnection(connectString);
if (conn.State == ConnectionState.Closed) conn.Open();
public void closeConnect()
if (conn.State == ConnectionState.Closed) conn.Close();
public DataSet Getds(string sql)
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 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;