资源描述
数据库系统课程设计
学生姓名:
班 学 号:
指导老师:
中国地质大学
年 月 日
教务管理系统
1、需求分析
教务管理系统
该教学系统关键提供数据维护、学生选课和老师讲课信息查询功效。其实现功效(即其包含查询)有:系统中对老师、学生基础信息录入;系统中对老师、学生基础信息查询;查询学生选课情况;查询老师讲课情况;还包含学生选课功效。该数据库系统包含学生密码表、学生信息表、老师信息表、老师密码表、学生选课表、课程匹配表,管理员密码表七个关系表,基础情况以下:三张密码表全部有对应账户和密码;老师信息表有工作证号、姓名、性别、族别、政治面貌、出生年月、联络方法、所在系、所在学院、职称;学生表有学号、姓名、性别、族别、政治面貌、出生年月、联络方法、班号、所在系、所在学院;课程有课程名、学分、名额、上课时间信息;讲课表有课程号、工作证号信息;学生选课表有课程名称、课程号、讲课老师、讲课时间、讲课地点、剩下容量、工作证号、成绩。课程匹配表则有课程号,学号,学生姓名,班号,所在专业,所在学院,成绩。每个学生全部属于一个班,每个老师也全部属于一个系。一名老师能够教多门课,一门课能够有几位主讲老师,一名同学能够选多门课。学生、老师全部有能够有重名,工作证号、学号能够作为标识。
系统中实体:
① 老师:工作证号、姓名、性别、职称、电话等;
② 学生:学号、姓名、性别、出生年月、职位、电话等;
③ 班级:班号、最低总学分、人数等;
④ 系:系代号、系名、系办公室电话等;
⑤ 课程:课序号、课名、学分、上课时间、名额等。
实体间关系:
① 每个学生全部属于一个班,每个班全部属于一个系,每个老师也全部属于一个系;
② 每个班班主任全部由一名老师担任;
③ 一名老师能够教多门课,一门课能够有几位主讲老师,但不一样老师讲同一门课其课序号是不一样(课序号是唯一);
④ 一名同学能够选多门课,一门课可被若干同学选中;
⑤ 一名同学选中课若已学完,应该统计有对应成绩;
⑥ 本单位学生、老师全部有重名,工作证号、学号能够作为标识。
系统需求:
① 教学系统关键提供数据维护、选课和信息查询;
②系统中各对象基础信息录入和查询;
③指定班、系学生信息查询;
④学生成绩、学分情况查询;
⑤老师讲课情况和学生选课情况查询。
系统组成:
教务管理系统包含老师管理子系统、学生管理子系统、管理员管理子系统。其中各个系统中拥有独自一套查询、添加、删除、更新操作。系统管理员进行数据维护操作。
2、概念设计
(1)概念模型(E-R图):
① 选课E-R图
学生
课程恩
选课课
m
n
学号
年纪
性别
所在系
课程号
课名
学分
名额
① 讲课E-R图
工作证号
课程号
姓名
老师
课程恩
讲课
m
n
课名
性别
学分
电话
名额
① 总E-R图
m
学生
选课
学号
姓名
专业
课程恩
老师
讲课
n
m
n
工作证号
课程号
姓名
电话
…
…
(2)数据字典:
① 数据项
编号
实体
数据项名
数据项含义说明
数据类型
长度
和其它数据项逻辑关系
1
老师
工作证号
区分老师数据项
Bigint
20
决定姓名性别等老师属性
2
姓名
许可重名
Char
10
决定性别等老师属性
3
性别
老师性别
Char
10
4
所在系
所在系
Char
10
5
电话
老师联络方法
Bigint
20
6
用户名
登录验证
Char
20
7
用户密码
登录验证
Char
20
8
所在学院
所在学院
Char
30
9
族别
所属民族
Char
30
10
职称
老师职称
Char
20
11
政治面貌
老师政治面貌
Char
20
12
学院电话
学院电话
Bigint
20
13
出生年月
老师出生年月
Char
20
14
学生
学号
区分学生数据项
Bigint
20
决定姓名性别等学生属性
15
学生姓名
许可重名
Char
10
16
学生性别
学生性别
Char
10
17
出生年月
许可反复
Char
18
所在系
许可空值
Char
10
19
班号
学生联络方法
Char
11
20
用户名
登录验证
Char
20
21
用户密码
登录验证
Char
20
22
所在学院
所在学院
Char
30
23
族别
所属民族
Char
30
24
政治面貌
学生政治面貌
Char
20
25
联络方法
学生联络方法
Bigint
26
课程
课程号
区分课程数据项
Char
10
决定课名学分等课程属性
27
课程名
课程名称
Char
10
28
学分
所含学分
Char
10
29
上课时间
上课日期
Char
30
30
名额
课程限制最高人数
Char
10
31
选课
课程号
学生所选课课程号
Char
10
由课程表课程号和学生表学号决定
32
学号
学生学号
Char
20
33
讲课
课程号
学生所选课课程号
Char
10
由课程表课程号和学生表学号决定
34
工作证号
老师工作证号
nchar
20
② 数据流
编号
数据流名
数据流起源
数据流去向
1
查询老师信息
工作证号
老师信息
2
注册老师信息
插入信息
老师信息
3
查询学生信息
学号
学生信息
4
注册学生信息
插入信息
学生信息
5
查询课程信息
学号
课程信息
7
选择课程
选课信息
课程匹配表
8
查询选课信息
学号
选课信息
9
查询讲课信息
课程号
课程匹配表
总数据流图
录入
选课
查询
评价
5.0 更新:
② 数据结构
编号
数据结构名
含义说明
组成
1
老师
老师实体
工作证号、姓名、性别、族别、政治面貌、出生年月、联络方法、所在系、所在学院、职称
2
学生
学生实体
学号、姓名、性别、族别、政治面貌、出生年月、联络方法、所在系、所在学院、班号
3
课程
课程实体
课程号、课名、余量、上课时间、上课地点
4
选课
学生实体和课程实体
学号、课程号、成绩
5
任教
老师实体和课程实体
工作证号、课程号
3、逻辑结构设计
①关系描述
依据数据库系统设计最基础要求,消除依靠集F中部分依靠和传输依靠,消除插入异常、删除异常、修改异常,达成第三范式无损链接和保持依靠,从而得到以下关系模型和其主码:
老师(工作证号、姓名、性别、电话、所在系、用户名、用户密码)
学生(学号、姓名、性别、年纪、所在系、班号、用户名、用户密码)
课程(课程号、课程名、学分、名额、上课时间)
选课(课程号、学号)
讲课(课程号、工作证号)
以上加下划线表示关系模型里面主码。
②实体间联络分析
老师—班级: 1:1;
系—老师: 1:n;
系—班级: 1:n;
班级—学生: 1:n;
课程—老师: m:n;
课程—学生: m:n
4、物理设计
4.1物理存放结构
编号
数据存放名
说明
输入数据流
输出数据流
1
老师信息表
存取老师信息
老师实体其中一项或多项项信息
老师信息或任课信息
2
学生信息表
存取学生信息
学生实体其中一项或多项项信息
学生信息或选课信息
3
选课信息表
存取课程信息
课程实体其中一项或多项项信息
课程信息或选课信息或任课信息
4
课程匹配表
存取选课信息
学生全部选课统计
选课信息或课程信息
4.1.1数据库
我此次课程设计采取了SQL sever平台进行存放建立基础表和信息。编写关系模式,载入数据。其存在多个存取方法。而且首先要运行调试软件运行恢复部分,确保数据以后转储和恢复。
4.1.2基础表
Student表
-- ----------------------------
DROP TABLE IF EXISTS `Student`;
CREATE TABLE `student` (
`学号` bigint() NOT NULL,
`姓名` char(30) NOT NULL,
性别` char(10) DEFAULT NULL,
`族别` char(30) NOT NULL,
`政治面貌` char(20) NOT NULL,
`出生年月` char(30) NOT NULL,
`联络方法` bigint() NOT NULL,
`班号`bigint()NOT NULL,
`所在专业` char(20) NOT NULL,
`所在学院` char(20) NOT NULL,
PRIMARY KEY (`学号`),
KEY `姓名` (`姓名`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
Teacher表
-- ----------------------------
DROP TABLE IF EXISTS `Teacher`;
CREATE TABLE `Teacher` (
`工作证号` bigint() NOT NULL,
`姓名` char(30) NOT NULL,
性别` char(10) DEFAULT NULL,
`族别` char(30) NOT NULL,
`政治面貌` char(20) NOT NULL,
`出生年月` char(30) NOT NULL,
`联络方法` bigint() NOT NULL,
`职称`char(20)NOT NULL,
`所在专业` char(20) NOT NULL,
`所在学院` char(20) NOT NULL,
‘学院电话’char(20)NOT NULL,
PRIMARY KEY (`工作证号’)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
选课表
-- ----------------------------
DROP TABLE IF EXISTS `studentchoose`;
CREATE TABLE `studentchoose` (
`cNum` varchar(7) NOT NULL,
`Name1` varchar(5) NOT NULL,
`Unit` varchar(20) NOT NULL,
PRIMARY KEY (`cNum`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- studentchoose表
-- ----------------------------
DROP TABLE IF EXISTS `stock`;
CREATE TABLE `stock` (
`课程名称` char(30) NOT NULL,
`课程号` bigint() NOT NULL,
`讲课老师` char(30) NOT NULL,
`讲课时间` char(30) NOT NULL,
`剩下容量` char(30) NOT NULL,
`工作证号` char(30) NOT NULL,
`成绩` bigint() NOT NULL,
PRIMARY KEY (`课程号`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- ATapparier表
-- ----------------------------
DROP TABLE IF EXISTS `ATapparier`;
CREATE TABLE `ATapparier` (
`课程号` bigint() NOT NULL,
`学号` bigint() NOT NULL,
`姓名` char(30) NOT NULL,
‘班号’char(20)NOT NULL,
`所在专业` char(20) NOT NULL,
`所在学院` char(20) NOT NULL,
‘成绩’char(20)NOT NULL,
PRIMARY KEY (`课程号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `ATapparier`;
CREATE TABLE `ATapparier` (
`课程号` bigint() NOT NULL,
`学号` bigint() NOT NULL,
`姓名` char(30) NOT NULL,
‘班号’char(20)NOT NULL,
`所在专业` char(20) NOT NULL,
`所在学院` char(20) NOT NULL,
‘成绩’char(20)NOT NULL,
PRIMARY KEY (`课程号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.2索引设计
4.2.1存放安排方法选择:
教务管理系统是一个多用户共享系统,对同一个关系要建立多条存取路径才能满足多用户多个应用要求。数据库管理系统通常提供多个存取方法:第一类是缩阴方法,现在关键是B+树索引方法;第二类是聚簇方法;第三类是Hash方法。我们现在关键采取B+树索引存取方法。
4.2.2索引
一个属性常常在查询条件中出现,则考虑这个(组)属性上建立索引(或组合索引);假如一个属性常常作为最大值和最小值等聚集函数参数,则考虑在这个属性上建立索引;假如一个(组)属性常常在链接操作链接条件中出现,则考虑在这个(组)属性上建立索引——学号,工作证号,课程号。
4.2.3存放路径建立
我将表和索引放在不一样磁盘上,在查询时,因为磁盘驱动器秉性工作,能够提升物理I/O读写效率;将比较大表,如“选课信息”,分别放在两个磁盘上,以加紧存取速度,这在多用户环境下尤其有效;另外将日志文件和数据库对象9表、索引等)放在不一样磁盘上,以改善系统性能。
5、系统实施
5.1DBMS&语言选择
我选择是SQL Sever系统语言,基于Microsoft Visual Studio 平台呃C#语言编写界面。较为简单轻易。
5.2数据输入
在SQL Sevel 中进行部分数据手动输入(或查询语句进行输入)用以进行测试,以后用户可在管理系统中进行相关信息添加。
Studentchoose表初始信息:
Studentbase表初始信息:
Teacherbase表初始信息:
Adminmessage表初始信息:
5.3 编写代码
因为要连接数据库,采取VS连接工具来进行数据库连接。
String conn = "Data Source=.;Initial Catalog=cyh st class;Integrated Security=True";
//链接语句
在编写代码时候碰到很多问题,比如常见多个问题就是少添加头文件,链接查询不对,SQL语句使用不对,高级查询等等一系列问题。
5.4 过程实施
在实现选课功效时候,首先在数据库内对本学期要开设课程进行预制,以后学生选课,只能一次选择一门,以后输入课程号,同时将登陆时学会设置为全局变量,在C#中进行换页传值,将学号等个人信息在学生主页进行显示,选课时,则将所选课程和自己学号以插入方法插入Studentchoose,以后,以后分别从学生选课表调用显示到学生课程信息,老师讲课信息中,以后在老师批改成绩时,将成绩和studentchoose表联络对应,完成学生-课程-成绩三位一体对应关系,命名为STapparier,以后进行更新操作,并同时SQL查询显示到学生成绩查询界面。管理员则是对全部信息进行汇总查询修改,将不一样信息封装起来,对于老师和学生实体部分显示,对于管理员全部显示。同时对于学生还可进行注册报道,数据库中为每个学生提供了一个学号和初始密码,学生到校后进入教务系统修改密码,补充个人资料,完成数据入库,以供后期使用。
6、运行维护
一、恢复数据库方法
对于事物内部故障:恢复时要在不影响其它事务运行情况下,强行回滚该事务,即撤销该事务已经做出任何对数据库修改;
对于系统故障:首先,在系统重新开启时让全部非正常终止事务滚回,强行撤销全部未完成事务;其次,把已完成事务提交结果重新写入数据库;
对于介质故障:在故障发生前对数据库进行转储,即使用数据库镜像功效,依据实际情况要求自动把整个数据库或其中关键数据复制到另一个磁盘上,防患于未然。
二、数据库恢复实现技术
1、采取转储方法定时地将整个数据库复制到磁带或另一个磁盘上保留起来,称为后备副本或后援副本。(动态转储和静态转储);
2、经过登记日志文件,进行事务故障恢复和系统故障恢复,并帮助后备副本进行介质故障恢复。
三、数据库恢复策略
1、事务故障恢复:
(1)反向扫描日志文件,查找该事务更新操作;
(2)对该事务更新操作实施逆操作,立即日志统计中“更新前值”写入数据库;
(3)继续反向扫描日志文件,查找该事物其它操作,做一样处理,直到事物开始标志为止。
2、系统故障恢复:
(1)正向扫描日志文件,找出在故障发生前已经提交事务,将其事务标识记入重做队列。同时找出故障发生时还未完成事务,将其事务标识记入撤销队列。
(2)反向扫描日志文件,对每个UNDO事务更新操作实施逆操作,立即日志统计中“更新前值”写入数据库。
(3)正向扫描日志文件,对每个REDO事务重新实施日志文件登记操作。立即日志统计中“更新前值”写入数据库。
3、介质故障恢复:重装数据库
(1)装入最新数据库后备副本,使数据库恢复到最近一次转储时一致性状态。
(2)装入对应日志文件副本,重做已完成事务。
7、总结
数据库课程设计是上大学以来最痛苦一个课程设计。在上学期平时实习中,我认为数据库相较于C++程序编写和相关利用数据结构程序编写来说,相对轻易简单。本认为这次课程设计也不过很简单就能完成。可是万万没想到,真从设计到开发出一个数据库系统远比编程可怕多了。
首先,数据库需求设计简直是让我们这种之前没有过设计经验人摸不到头脑,不知从何下手。也可能因为上学期在学习数据库时没有让我们想着设计一个大型需要注意细节数据库,所以感觉概念全部很模糊。数据字典是啥啊?不是先画ER图吗?数据流图又是什么。。?那ER图画完就能建表了?那么数据库和EXEL表格又有什么区分啊等等这类我总会冒出小白问题层出不穷。
在三个题目:教务、书店、病房中,我选择了看起来仿佛参与者比较少,比较简单教务管理系统。不过着手设计起来真是极难,因为个人主观原因比较大,比较灵活,最终做成一个什么样子数据库是由你自己来决定,所以有部分度要自己把握。假如放开了去想,去做,全部会复杂庞大到无法完成。就在我想着自己构想庞大数据库该怎样实现复杂功效时,感觉很恐怖。但还是硬着头皮开始做。
一开始碰到很大挫折,在尝试了两天C++后,我认为极难,于是,开始自学C#,相比C++,C#相对简单一点,去图书馆翻遍了《C#编程宝典》之类书后,在室友引导下开始设计。一开始认为自己设计数据库没问题,认为不难,不过越往后做发觉很多数据再传输时候走不到共享,首先是自己编程能力不够,对于DATAGRIDVIEW这个控件掌握太少,在显示值,单元格传值时候极难,以后决定改变设计,从改变SQL表格入手,删除了无须要表,尽可能用少表完成。这么一来对窗体设计要求更高,还有就是对SQL高级查询语句要求更高。现在想想发觉最大问题一个是C#中Datagridview控件单元格和数据库交互传值,另一个就是SQL高级复杂查询语句使用和C#中textbox,或数据库其它表链接查询。这两个问题在最终几天难住我了,最终和学长,室友,和大量去论坛求援,baidu找方法,看博客加上自己探索,一个一个处理了,受益匪浅。
除此之外碰到问题就是数据库设计问题,要实现更多功效,一个方法是将各个数据分装在各个表里,调用一个个单体,不过这么造成数据过于庞大,一样最好处理方法是少许存放空间,大量调用,将常见数据匹配在一起,这点在我STapparier表中有所表现,将实体主键找到对应联络装在一个表里,以后调用其它表进行自然连接,实现调用,这么层次清楚,也达成了三范式。不过最终设计出来数据库和我最初设计差异还是蛮大,所以我认为好数据库是改出来,好数据库极难一次成功,每一次实践全部是我们下一场设计宝贵经验。经过这次课程设计我知道为何系统分析师会这么抢手了。可能程序员工作评定是一个程序时间复杂度和空间复杂度,那么系统分析师工作评定可能就是整个系统信息量存放是否高效,增删改查等操作是否轻易进行,怎样把数据存放更合理问题了。显然,系统分析师工作愈加宏观,而且更大一部分影响着整个运行效率。写到这里我不由得想到学校那个常常瓦解教务系统。所以对一个商家一个企业而言,好数据库系统是尤为关键,甚至能够影响到企业未来发展,增加竞争力。
除此之外,我认为每一次有难度课程设计对于我来说全部像一次挑战,一次历练。从没想过自己能够做成平时浏览网页一样界面,也从没想过自己能做出一个有很多功效按钮窗体实现系统。即使实习过程天天全部很痛苦,绞尽脑汁思索着,一步不对,又要重新改,重新做是很痛苦。就比如昨天还在熬夜赶汇报。不过经历了这个过程,逼自己一把,看到最终东西,心里还是很欣慰很有成就感。我认为人潜能是无穷,有时候就需要逼自己一把,不要偷懒,勤奋部分,让自己学习更多,进步更大,从而体会到人生乐趣和意义,内心愈加强大地生活下去。
总来说,在数据库建表过程中,一开始没有根据数据库规范建表,造成后边产生一系列问题,又重新建立数据库,做了很多无用功,这才意识到按步骤规范建立数据库关键性。因为C#、JAVA等语言在日常学习中没有包含到,使得此次数据库系统设计变得相对比较困难,经过查阅对应图书资料在开始编程之初对C#还是很陌生,但经过前几次实习掌握了C#基础语句,在学长指导下也少走了很多弯路,但在SQL server 和C#链接时出现问题一直没有处理,到以后经过反复上网搜索处理了这一难题。大部分相关C# windows窗体建立代码全部是从参考书中学习到,但也有部分特殊功效实现是在网上搜索到,在这个过程让我对C# windows窗体有了一个快速学习和认识。总而言之,经过此次课程设计反应出了很多在理论课上看不到问题,收获也很多,在提升了实践水平同时也锻炼了自己自学能力,对于专业认识也更深了一步,同时也谢谢老师,室友,学长和博客中各位大神指点。
展开阅读全文