学生成绩管理系统数据库.docx
《学生成绩管理系统数据库.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统数据库.docx(19页珍藏版)》请在冰豆网上搜索。
学生成绩管理系统数据库
学生成绩管理系统数据库
一.需求分析阶段
1.信息要求
高校学生的成绩管理工作量大、繁杂,人工处理非常困难。
学生成绩管理系统借助于计算机强大的处理能力,大大减轻了管理人员的工作量,并提高了处理的准确性。
学生成绩管理系统的开发运用,使得学生的成绩管理工作更加清晰、条理化、自动化,不仅把广大教师从繁重的成绩管理工作中解脱出来、把学校从传统的成绩管理模式中解放出来,而且对学生成绩的判断和整理更合理、更公正,同时也给教师提供了一个准确、清晰、轻松的成绩管理环境。
2.处理要求
能够进行数据库的数据定义、数据操纵、数据控制等处理功能,进行联机处理的相应时间要短。
此系统实现如下系统功能:
(1)通过用户名和密码登录系统,教师根据安排进行课程的添加、删除、修改、查询,成绩的添加、修改、删除、查询、报表,学生的添加及其信息修改、查询、删除和教师基本信息的查询、修改及密码修改。
(2)通过用户名和密码登录系统,学生查询个人信息、所学课程成绩及修改登录密码等功能。
(3)设计人机友好界面,功能安排合理,操作使用方便,并且进一步考虑系统在安全性,完整性,并发控制,备份和恢复等方面的功能要求。
3.安全性与完整性要求
对于学生成绩管理系统数据库来讲,由于其主要数据是学生成绩,只能由本人以及所教老师和教务处知道,因此做好做好数据安全性是重中之重。
另外,要求所有在校学生的信息要录入其中,并且要设计好个别情况。
4.数据流图
成绩管理系统大体可以分成二大模块,一是学生的基本信息模块,里面应该包含学生的各方面的基本信息;二是教师管理模块,在该模块中应该包含有对学生成绩信息的查询和处理(即报表),如平均成绩、成绩排名以及不及格学生的统计,其中还包含有教师、课程、学生等相关信息的模块。
因此可以得到系统流程图如下所示:
5.数据字典
数据项是数据库的关系中不可再分的数据单位,下表分别列出了数据的名称、数据类型、长度、取值能否为空。
利用SQLServer2000建立“学生成绩管理”数据库,其基本表清单及表结构描述如下:
1、课程(course)信息数据表,结构如下:
字段名
描述
数据类型
约束控制
cno
课程号
char(10)
Primarykey(主键)
cname
课程名
char(10)
Notnull
tname
教师名
char(10)
Notnull
credit
学分
int(4)
Notnull
ctime
学时
int(4)
Notnull
2、学生(student)基本情况数据表,结构如下:
字段名
描述
数据类型
约束控制
sno
学号
int(10)
Primarykey(主键)
sname
姓名
char(10)
Notnull
ssex
性别
char
(2)
Notnull
sage
年龄
int
(2)
Notnull
sdept
系别
char(10)
Notnull
3.教师表(teacher)信息数据表,结构如下:
字段名
属性
数据类型
约束控制
tno
教师号
char(10)
Primarykey(主键)
tname
教师名
char(10)
Notnull
tsex
教师性别
char
(2)
Notnull
tdept
教室系别
char(10)
Notnull
4.成绩表(grade)信息数据表,结构如下:
字段名
属性
数据类型
约束控制
sno
学号
char(10)
外部键
cno
课程名
char(10)
外部键
score
成绩
int(4)
Notnull
二.概念结构设计阶段
概念结构设计阶段是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。
设计成绩管理数据库包括学生、成绩、课程、教师四个关系。
因此可以得出E-R图如下所示:
三.逻辑结构设计阶段
逻辑结构是独立于任何一种数据模型的信息结构。
逻辑结构的任务是把概念结构设
计阶段设计好的基本E-R图转化为宜选用的DBMS所支持的数据模型相符合的逻辑结构,并对其进行优化。
E-R图向关系模型转化要解决的问题是如何将实体型和实体间的联系转化为关系模
式,如何确定这些关系模式的属性和码。
设计学生成绩管理数据库,包括课程、学生、教师、成绩四个关系,由系统E—R图
转化而得到的关系模式如下:
课程信息表
course:
(课程号,课程名,教师名,学分,学时)其中主关键字为课程号;
学生信息表
student:
(学号,姓名,性别,年龄,系别)其主关键字为学号;
教师表
teacher:
(教师号,教师名,教师性别,教师系别)其中主关键字为教师号;
成绩表
grade:
(学号,课程号,成绩)其中主关键字为学号和课程号。
四.物理设计阶段
数据库物理设计的任务是为上一阶段得到的数据库逻辑模式,即数据库的逻辑结构选择合适的应用环境的物理结构,既确定有效地实现逻辑结构模式的数据库存储模式,确定在物理设备上所采用的存储结构和存取方法,然后对该存储模式进行性能评价、修改设计,经过多次反复,最后得到一个性能较好的存储模式。
数据库物理设计内容包括记录存储结构的设计,存储路径的设计。
4.1确定关系模型的存取方法
在将概念模型转换成物理模型之后,我们可以对物理模型进行设计,双击物理模型的关系,可以对该关系的名称、注释等信息进行查询。
可对该关系的属性列进行设计,可分别设置其名称、码、数据类型以及主码、是否为空等。
在实际设计中最常用的存取方法是索引发,使用索引可以大大减少数据的查询时间,在建立索引时应遵循:
在经常需要搜索的列上建立索引; 在主关键字上建立索引;在经常用于连接的列上建立索引,即在外键上建立索引;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的等规则。
才能充分利用索引的作用避免因索引引起的负面作用。
4.2确定数据库的存储结构
确定数据库的存储结构主要指确定数据的存放位置和存储结构,包括确定关系、索引、日志、备份等的存储安排及存储结构,以及确定系统存储参数的配置。
因为该成绩管理系统的数据量小,所以我们只用把数据存储在使用的电脑硬盘上,不用作更多的安排。
(1)创建学生基本信息表:
createtablestudent(
snochar(9)primarykey,
snamechar(10)notnull,
ssexchar
(2)notnull,
sageintnotnull,
sdeptchar(10)notnull,
)
(2)创建课程表:
createtablecourse(
cnochar(10)primarykey,
cnamechar(10)notnull,
tnamechar(10)notnull,
creditintnotnull,
ctimeintnotnull,
)
(3)创建成绩表:
createtablegrade(
snochar(9),
cnochar(10),
scoreint,
)
(4)创建教师表:
createtableteacher(
tnochar(10)primarykey,
tnamechar(10)notnull,
tsexchar
(2)notnull,
tdeptchar(10)notnull,
)
执行上述SQL语句即可创建成绩表相关表格
学生信息相关表格
sno
sname
ssex
sage
sdept
090261001
张三
男
22
工商
090261002
李四
女
23
工商
090361003
王五
男
22
数学系
093821004
赵六
女
22
计算机系
090021005
田七
女
20
人文系
课程信息相关表格
Cno
cname
tno
credit
ctime
0301
数据库
001
1
24
0302
计算机网络
002
3
18
0303
系统结构
003
3
36
0304
组成原理
004
2
32
0305
数据结构
005
4
30
0306
操作系统
006
4
32
0307
数据库原理
007
5
30
0308
专业英语
008
1
45
0309
高数
009
5
35
成绩信息表
sno
cno
score
090261001
0306
85
090261001
0303
90
090261001
0305
86
090261002
0306
82
090261002
0304
84
090261002
0301
81
090361003
0306
93
090361003
0302
79
090361003
0304
85
093821004
0306
94
093821004
0308
74
093821004
0307
86
教师信息表
tno
tname
tsex
tdept
001
卢亚君
女
财管
002
李昌明
男
财管
003
张富强
男
财管
004
刘翠杰
女
数统
005
王庆石
男
数统
006
黄立明
男
数统
007
王纲
男
计算机
008
徐伟丽
女
计算机
009
刘书霞
女
计算机
下图显示了学生,课程和成绩三个关系的物理设计其中课程号与学号号分别为关系的主码。
五.数据库实施和维护阶段
5.1数据库的连接:
此阶段主要任务包括创建数据库,加载初始数据,数据库试运行,数据库的安全性和完整性控制数据库的备份与恢复,数据库性能的监督分析和改仅,数据库的重组和重构等。
首先在数据库中建立一个学生成绩管理系统数据库,然后新建一个数据源。
主要代码如下:
#include"stdafx.h"
#include"StudentScore.h"
#include"Course.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
//CCourse
IMPLEMENT_DYNAMIC(CCourse,CRecordset)
CCourse:
:
CCourse(CDatabase*pdb)
:
CRecordset(pdb)
{//{{AFX_FIELD_INIT(CCourse)
//}}AFX_FIELD_INIT
m_nDefaultType=snapshot;
CStringCCourse:
:
GetDefaultConnect()
{return_T("ODBC;DSN=");
}
CStringCCourse:
:
GetDefaultSQL()
{return_T("");}
voidCCourse:
:
DoFieldExchange(CFieldExchange*pFX)
{
//{{AFX_FIELD_MAP(CCourse)
pFX->SetFieldType(CFieldExchange:
:
outputColumn);
//}}AFX_FIELD_MAP
}
//CCoursediagnostics
voidCCourse:
:
AssertValid()const
{CRecordset:
:
AssertValid();}
voidCCourse:
:
Dump(CDumpContext&dc)const
{CRecordset:
:
Dump(dc);}
//MainFrm.h:
interfaceoftheCMainFrameclass
classCMainFrame:
publicCFrameWnd
{protected:
//createfromserializationonly
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
//Attributes
public:
//Operations
public:
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CMainFrame)
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);
//}}AFX_VIRTUAL
//Implementation
public:
virtual~CMainFrame();
protected:
//controlbarembeddedmembers
//CStatusBarm_wndStatusBar;
//CToolBarm_wndToolBar;
//Generatedmessagemapfunctions
protected:
//{{AFX_MSG(CMainFrame)
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
afx_msgvoidOnPassword();
afx_msgvoidOnUser();
afx_msgvoidOnStudent();
afx_msgvoidOnTeach();
afx_msgvoidOnTeacher();
afx_msgvoidOnScore();
afx_msgvoidOnQueryTeach();
afx_msgvoidOnQueryScore();
afx_msgvoidOnCourse();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
//CScoreAddDlgdialog
CScoreAddDlg:
:
CScoreAddDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CScoreAddDlg:
:
IDD,pParent)
{/{{AFX_DATA_INIT(CScoreAddDlg)
//}}AFX_DATA_INIT
}
voidCScoreAddDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScoreAddDlg)
DDX_Control(pDX,IDC_SCORE_STUDENT,m_cStudent);
DDX_Control(pDX,IDC_SCORE_SCORE,m_cScore);
DDX_Control(pDX,IDC_SCORE_COURSE,m_cCourse);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CScoreAddDlg,CDialog)
//{{AFX_MSG_MAP(CScoreAddDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
voidCScoreAddDlg:
:
OnOK()
{
CStringstudent,course,score,student_no,course_no;
m_cStudent.GetWindowText(student);
m_cCourse.GetWindowText(course);
m_cScore.GetWindowText(score);
else//成绩不为空
{
CStringstrSQL;
//查出该学生的学号
strSQL.Format("select*fromstudentwhereactive_status='Y'andstudent_name='%s'",student);
CRecordsetm_recordSet=&m_database;
m_recordSet.Open(CRecordset:
:
forwardOnly,strSQL);
m_recordSet.GetFieldValue("student_no",student_no);
m_recordSet.Close();
//查出该课程的课程号
strSQL.Format("select*fromcoursewhereactive_status='Y'andcourse_name='%s'",course);
m_recordSet.Open(CRecordset:
:
forwardOnly,strSQL);
m_recordSet.GetFieldValue("course_no",course_no);;
m_recordSet.Close();
BOOLCScoreAddDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
CRecordsetm_recordSet;
if(!
m_database.IsOpen())
{
m_database.Open(_T("student"));
m_recordSet.m_pDatabase=&m_database;
}
CStringstrSQL;
strSQL.Format("selectcourse_namefromcoursewhereactive_status='Y'");
m_recordSet.Open(CRecordset:
:
forwardOnly,strSQL);
for(inti=0;iCStringtemp;
m_recordSet.GetFieldValue("course_name",temp);
m_cCourse.AddString(temp);
m_recordSet.MoveNext();
}
m_recordSet.Close();
m_cCourse.SetCurSel
(1);
strSQL.Format("selectstudent_namefromstudentwhereactive_status='Y'");
m_recordSet.Open(CRecordset:
:
forwardOnly,strSQL);
for(intj=0;jCStringtemp;
m_recordSet.GetFieldValue("student_name",temp);
m_cStudent.AddString(temp);
m_recordSet.MoveNext();
}
m_recordSet.Close();
m_cStudent.SetCurSel
(1);
{
this->SetWindowText("成绩窗口");
}
returntrue;
}
voidCScoreAddDlg:
:
OnCancel()
{
//TODO:
Addextracleanuphere
CDialog:
:
OnCancel();
}
5.2部分操作截图:
下图显示了学生登陆系统进行查询时界面:
下图显示了进行课程查询时界面:
5.3数据操作
5.3.1.数据库查询操作
A.单表查询:
(1)查询sno为090261001学生的sname
selectsname
fromstudent1
wheresno='090261001'
(2)查询ssex为’女’并且sdept为’工商’的sname
selectsname
fromstudent
wheressex='女'and
sdept='工商'
(3)查询所有学生的姓名和系别。
selectsname,sdept
fromstudent
(4)查询系别为数学系的sname。
selectsname
fromstudent
wheresdept='数学系'
(5)查询所有学生所在院系名称
selectdistinctsdept
fromstudent
(6)查询学生信息表中年龄小于23和年龄大于21的学生的姓名和系别
selectsname,sdept
fromstudent
wheresage>21orsage<23
(7)查询所有学生的平均年龄
selectavg(sage)as平均年龄
fromStudent
B.连接查询
(1)学生的学号、姓名,所选课程的课程号、课程名和成绩、任课教师名
Selectstudent.sno,student.sname,o,ame,
course.score,teacher.tname
fromstudent,coure,grade,teacher
Wherestudent.sno=grade.snoando=oand
teacher.tno=course.tno
(2)找出教授数据库原理的老师的教师名
selectteacher.tname
fromcourse,teacher
Wherecourse.tno=teacher.tnoandame='数据库原理'
C.操作结果集查询
查询090261002号同学和090261003号同学共同选修的课程
Selectcno
Fromgrade
Wheresno='090261002'
Intersect
Selectcno
Fromgrade
Wheresno='090261003'
D.嵌套查询
查询选修了0306这门课的所有学生的学号、姓名、年龄、院系
Selectsno,sname,sage,sdept
Fromstudent
Wheresnoin
(selectsno
Fromgrade
Wherecno=