作业要求
登录管理模块:
- 权限控制:学生不能访问系统管理模块。
- 登录错误信息提示。
系统管理模块:
- 系统管理员登录系统后,可以维护课程基础信息,如课程名字、开课时间(学期)等,对课程信息进行增、删、改、查。
- 以设定课程的考试成绩的计算方法:能够在页面上对某课程动态增加考核点,并填入该考核点的分值比例。(**如:**对J2EE课程,可新增3个考核点,考核点1为到课情况,分值比例为20%;考核点2为作业,分值比例为20%;考核点3为考试,分值比例为60%。能够验证分值比例之和是否等于100%。)
- 维护某门课程每次开课的信息,包括开课时间(具体的学年度)、任课教师、选修人数统计等。
- 对学生基础信息进行管理,学生信息的增、删、改、查。
- 以列表的方式填入选修某门课程的每个学生的成绩,需要针对每个考核点填写,并计算出总成绩。只有选修了该门课的学生才显示。
- 能够对管理帐号进行管理,如增、删、改、查,修改密码等。
学生模块:
- 可以修改自己的基本信息。
- 可以察看每个学年度每个学期开的课程,并选修。
- 可查询自己选修的所有课程的成绩。
注意:不考虑学生年级因素。
本阶段的成果的内容形式主要包括数据流图(Data Flow Diagram)和数据字典(DataDictionary)。
数据流图和数据字典是描述用户需求的重要工具以及阶段成果表达形式。它作为需求分析的成果和用户交流的主要手段和依据,是后续数据库设计的前提。
设计人员从数据流图中可以比较充分地了解软件的结构,所以也是软件设计的重要依据。
作业要求中,把系统分为了三个模块,即登入管理模块、系统管理模块、学生模块。
对这三个模块的内容进行分析之后,可以得知学生考试管理系统主要满足来自三方面的需求,这三个方面分别是学生用户、教师用户和管理员用户。
因此,从原先的三个模块分解为如下四个模块:
系统的全局数据流图,也称为顶层数据流图,主要是从整体上描述系统的数据流,反映系统中数据的整体流向,是设计者针对用户和开发者表达出的一个总体描述。
第0层数据流图是对顶层数据流图的细化,它的每一处理还可能继续细化,形成子图。
根据需求可将顶层数据流程图作细化,画出第0层数据流程图,如下图所示。
根据需求分析结果,明确了该系统的主要功能,分别为:
数据流图表达了数据与处理的关系,数据流图作为直观的了解系统运行机理的手段,并没有具体描述各类数据的细节,只有通过数据字典进一步细化才能对系统的需求得到具体而确切的了解。数据字典用来说明数据流图中出现的所有元素的详细的定义和描述,包括数据流、加工处理、数据存储、数据的起点和终点或外部实体等。
数据字典包括的项目有:数据项、数据结构、数据流、数据存储、加工逻辑和外部实体。
序号 | 数据流名 | 来源 | 流向 | 组成 | 备注 |
---|---|---|---|---|---|
F1 | 课程信息 | 管理员 | P2课程信息处理 | 课程号+课程名称+任课老师工号+开课时间 | |
F2 | 教师信息 | 管理员 | P3教师信息处理 | 工号+姓名+性别+登入密码+电子邮箱+电话号码 | |
F3 | 学生信息 | 管理员 | P4学生信息处理 | 学号+姓名+性别+登入密码+电子邮箱+电话号码 | |
F4 | 登入信息 | 管理员 | P1登入系统 | 账号+密码+账户类别 | |
F5 | 管理员信息 | P5显示个人信息 | 管理员 | 账号+姓名+性别+登入密码+电子邮箱+电话号码 | |
F6 | 登入信息 | 学生 | P1登入系统 | 账号(学号)+密码+账户类别 | |
F7 | 账户信息 | P1登入系统 | P5显示个人信息 | 账号(学、工号)+姓名+性别+登入密码+电子邮箱+电话号码 | |
F8 | 已处理的课程信息 | P2课程信息处理 | S1课程信息 | 课程号+课程名称+开课时间 | |
F9 | 任课教师 | P2课程信息处理 | S6教师任课信息 | 课程号+教师工号 | |
F10 | 已处理的教师信息 | P3教师信息处理 | S2教师信息 | 工号+姓名+性别+登入密码+电子邮箱+电话号码 | |
F11 | 已处理的学生信息 | P4学生信息处理 | S3学生信息 | 学号+姓名+性别+登入密码+电子邮箱+电话号码 | |
F12 | 课程信息 | P6显示课程信息 | 学生 | 课程号+课程名称+任课老师工号+任课老师名称+开课时间 | |
F13 | 选课信息 | 学生 | P7选课 | 学号 | |
F14 | 退课信息 | 学生 | P8退课 | 学号 | |
F15 | 成绩信息 | P11显示学生成绩 | 学生 | 学号+课程号+考核点名称+考核点分数+总成绩 | |
F16 | 学生个人信息 | P5显示个人信息 | 学生 | 学号+姓名+性别+登入密码+电子邮箱+电话号码 | |
F17 | 登入信息 | 教师 | P1登入系统 | 账号(工号)+密码+账号类别 | |
F18 | 教师个人信息 | P5显示个人信息 | 教师 | 工号+姓名+性别+登入密码+电子邮箱+电话号码 | |
F19 | 考核点信息 | 教师 | P9设置考核点信息 | 考核点名称+考核点占分 | |
F20 | 选课结果 | P7选课 | S7学生选课信息 | 课程号+学号 | |
F21 | 退课结果 | P8退课 | S7学生选课信息 | 课程号+学号 | |
F22 | 学生考核点成绩 | 教师 | P10计算学生成绩 | 考核点分数 | |
F23 | 学生成绩 | P10计算学生成绩 | S8学生成绩 | 学号+课程号+考核点名称+考核点分数 | |
F24 | 任课课程信息 | P12显示任课信息 | 教师 | 课程号+课程名称+任课老师工号+开课时间 | |
F25 | 课程考核点信息 | P9设置课程考核点 | S5课程考核点信息 | 课程号+考核点名称+考核点占分 | |
F26 | 选课学生信息 | P13显示选课学生信息 | 教师 | 学号+姓名+性别+登入密码+电子邮箱+电话号码 |
序号 | 数据文件 | 文件组成 | 关键标识 |
---|---|---|---|
S1 | 课程信息 | 课程号+课程名称+开课时间 | 课程号 |
S2 | 教师信息 | 工号+姓名+性别+登入密码+电子邮箱+电话号码 | 工号 |
S3 | 学生信息 | 学号+姓名+性别+登入密码+电子邮箱+电话号码 | 学号 |
S4 | 登入账户信息 | 账号(学、工号)+密码 | 全部 |
S5 | 课程考核点信息 | 课程号+考核点名称+考核点占分 | 全部 |
S6 | 教师任课信息 | 课程号+教师工号 | 全部 |
S7 | 学生选课信息 | 课程号+学号 | 全部 |
S8 | 学生成绩 | 学号+课程号+考核点名称+考核点分数 | 全部 |
序号 | 处理过程 | 输入 | 输出 | 处理逻辑 |
---|---|---|---|---|
P1 | 登入系统 | 账号和密码以及用户类型 | 账户信息 | 检验登入账户的正确性 |
P2 | 课程信息处理 | 课程信息 | 处理之后的课程信息 | 检验课程信息的正确性以及增删改查操作 |
P3 | 教师信息处理 | 教师信息 | 处理后的教师信息 | 检验教师信息的正确性以及增删改查操作 |
P4 | 学生信息处理 | 学生信息 | 处理后的学生信息 | 检验学生信息的正确性以及增删改查操作 |
P5 | 显示个人信息 | 账户信息 | 用户的个人信息 | 根据登入账户不同显示不同的用户个人信息 |
P6 | 显示课程信息 | 教师任课信息和课程信息 | 详细的课程信息 | 显示课程信息以及任课教师 |
P7 | 选课 | 学生选课信息和课程信息 | 选课结果 | 处理学生选课 |
P8 | 退课 | 退课信息和学生选课信息 | 退课结果 | 处理学生退课 |
P9 | 设置考核点信息 | 考核点信息和课程信息 | 课程考核点信息 | 对课程设置考核点信息 |
P10 | 录入学生成绩 | 学生考核点成绩、课程考核点信息和学生选课信息 | 学生成绩 | 对学生所选的课程的考核点进行评分 |
P11 | 显示学生成绩 | 学生成绩 | 成绩信息 | 计算总成绩并显示学生考核点成绩以及总成绩 |
P12 | 显示任课信息 | 教师任课信息和课程信息 | 任课课程信息 | 显示老师所任课程的详细信息 |
P13 | 显示选课学生信息 | 学生选课信息、教师任课信息、学生信息 | 选课学生信息 | 显示选择某门课程的所有学生信息 |
上述的数据流图和数据字典共同构成了对用户需求的表达,它们是系统分析员(数据库管理员)在需求调查过程中和用户反复交互得到的。
建设系统实际要处理的数据基本上已经在数据流图中得到体现,整个设计过程的后续步骤提供基础和依据。
在概念设计阶段,主要采用的设计手段目前还是实体联系模型(E-R Model)。绘制E-R图的关键是确定E-R图的各种结构,包括实体、属性和联系。
要建立系统的E-R模型的描述,需进一步从数据流图和数据字典中提取系统所有的实体及其属性。为了简化E-R图的处置,现实世界的事物能作为属性对待的尽量作为属性对待,实体的指导原则如下:
由前面分析得到的数据流图和数据字典,可以抽象得到实体主要有3个:管理员、教师、学生、课程、考核点。其中,
在需求分析阶段我们采用的是自上而下的分析方法,那么要在其基础上进一步作概念设计我们面临的是细化的分析数据流图以及数据字典,分析得到实体及其属性后,进一步可分析各实体之间的联系。
一名教师可以讲授多门课程,而每门课只能被一名教师讲授,所以它们之间是一对多的联系(1:n)。
每门课程可以包含多个考核点,而一个考核点只能属于一门课程,所以它们之间的联系是一对多的(1:n)。
一个学生可以选修多个课程,而每一个课程都能够被多个学生选修,因此,它们之间也属于一对多的关系。当学生实体与课程实体联系之后,产生考核点成绩属性。
系统的局部E-R图,仅反映系统局部实体之间的联系,但无法反映系统在整体上实体间的相互联系。而对于一个比较复杂的应用系统来说,这些局部的E-R图往往有多人各自分析完成的,只反映局部的独立应用的状况,在系统整体的运作需要时,他们之间有可能存在重复的部分或冲突的情况,如实体的划分、实体或属性的命名不一致等,属性的具体含义(包括数据类型以及取值范围等不一致)问题,都可能造成上述提到的现象。
为解决这些问题,必须理清系统在应用环境中的具体语义,进行综合统一,通过调整消除那些问题,得到系统的全局E-R图。
逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R图转换为与选用数据库管理系统产品所支持的数据模型相符合的逻辑结构。
首先,课程实体以及它们的联系。任课教师与课程之间是一对多的联系类型,因此,将任课教师和课程分别设计成如下的关系模式:
学生与课程之间是多对多的联系类型,所以将学生和选修分别设计成如下的关系模式:
将管理员的关系模式设计为:
对于考核点、课程和学生,由于课程与考核点是一对多的关系,学生选修课程之后能够拥有考核点成绩。
首先,需要我们确定上面建立的关系模式中的函数依赖,一般在作需求分析时就了解到一些数据项的依赖关系,如教师的编号决定了教师的姓名和其它的数据项信息,而实体间的联系本身也是反映了一种函数依赖关系,但是这不是研究的对象,我们针对的是在一个关系模式中的函数依赖对象。
其次,对上一步确立的所有函数依赖进行检查,判别是否存在部分函数依赖以及传递函数依赖,针对有的依赖通过投影分解,消除在一个关系模式中存在的部分函数依赖和传递函数依赖。
对以上八个关系模式进行检查发现,在“课程”中存在部分函数依赖,即工号不依赖于主键课程号,因此对此进行投影分解,增加新的关系模式“授课”。
最终得到的关系模式如下,均已符合第三范式:
在上述经由E-R模型得到关系模式并且得到适当的调整后,我们可以结合在需求表述中数据字典包含的数据项信息,得到数据库的表结构。
我们应该根据3.1节的内容,具体设计各个数据表的表结构,包括表名,表中各列的字段名、数据类型、数据长度和表的主键和外键;还要考虑应该建立哪些索引以及索引的类型。
数据库表名 | 关系模式名称 | 备注 |
---|---|---|
Admin | 管理员 | 管理员信息表 |
Teacher | 教师 | 教师信息表 |
Student | 学生 | 学生信息表 |
Course | 课程 | 课程信息表 |
TeaCourse | 授课 | 教师授课表 |
StuCourse | 选修 | 学生选课表 |
ScorePoint | 考核点 | 考核点信息表 |
Score | 考核点成绩 | 考核点成绩信息 |
字段名称 | 含义属性 | 类型 | 长度 | 备注 |
---|---|---|---|---|
teacherid | 工号 | char | 10 | 主键,也可作为登录标识 |
tname | 姓名 | varchar | 6 | 非空 |
tsex | 性别 | varchar | 2 | 男、女 |
tpassword | 登入密码 | varchar | 20 | 可以是数字、英文以及符号等 |
temail | 电子邮箱 | varchar | 40 | |
tphone | 电话号码 | varchar | 15 |
字段名称 | 含义属性 | 类型 | 长度 | 备注 |
---|---|---|---|---|
aid | 账号 | char | 10 | 主键,也可作为登录标识 |
aname | 姓名 | varchar | 6 | 非空 |
asex | 性别 | varchar | 2 | 男、女 |
apassword | 登入密码 | varchar | 20 | 可以是数字、英文以及符号等 |
aemail | 电子邮箱 | varchar | 40 | |
aphone | 电话号码 | varchar | 15 |
字段名称 | 含义属性 | 类型 | 长度 | 备注 |
---|---|---|---|---|
studentid | 学号 | varchar | 10 | 主键,也可作为登录标识 |
sname | 姓名 | varchar | 6 | 非空 |
ssex | 性别 | varchar | 2 | 男、女 |
spassword | 登入密码 | varchar | 20 | 可以是数字、英文以及符号等 |
semail | 电子邮箱 | varchar | 40 | |
sphone | 电话号码 | varchar | 15 |
字段名称 | 含义属性 | 类型 | 长度 | 备注 |
---|---|---|---|---|
courseid | 课程号 | varchar | 10 | 主键 |
cname | 课程名称 | varchar | 20 | 非空 |
ctime | 课程时间 | int | 5 | 如20201 |
字段名称 | 含义属性 | 类型 | 长度 | 备注 |
---|---|---|---|---|
teacherid | 工号 | varchar | 10 | 外键(Teacher.teacherid) |
courseid | 课程号 | varchar | 10 | 外键(Course.courseid) |
字段名称 | 含义属性 | 类型 | 长度 | 备注 |
---|---|---|---|---|
studentid | 学号 | varchar | 10 | 外键(Student.studentid) |
courseid | 课程号 | varchar | 10 | 外键(Course.courseid) |
字段名称 | 含义属性 | 类型 | 长度 | 备注 |
---|---|---|---|---|
courseid | 课程号 | varchar | 10 | 外键(Course.courseid) |
pname | 考核点名称 | varchar | 20 | 非空 |
ppercent | 考核点占比 | int | 3 | (1…100)表示所占百分比 |
字段名称 | 含义属性 | 类型 | 长度 | 备注 |
---|---|---|---|---|
studentid | 学号 | varchar | 10 | 外键(Student.studentid) |
courseid | 课程号 | varchar | 10 | 外键(Course.courseid) |
pname | 考核点名称 | varchar | 20 | 非空 |
pscore | 分数 | int | 3 | (1…100)表示分值 |