前言
在软件编程的学习过程中,笔者始终秉承着以项目驱动学习的思路,在实际遇到问题再取学会分析问题,解决问题这个思路的过程很重要。软件只有在不使用的时候没有bug,在使用后会发现有着许多意想不到的问题,这个时候我们分析问题,解决问题的思路就异常重要。本系列文章将从学生成绩管理系统入手,带大家去了解并学习一个完成软件开发的流程,以及分析相关开发时候遇到问题,如何去思考以及解决相关的问题的。本文将从项目的开始需求分析一点点的去剖析整个项目。
1. 角色分析
现在基本上所有的系统都有一个权限管理来划分各个用户的权限,如商城系统,有着买家和卖家,还有内容审核者。在如OA审批流,有着申请人,审批人…等等系统。在学生成绩管理系统,也有五种角色如下:
角色名称 | 功能权限 |
---|---|
学生 | 查看各科成绩,本班成绩,查看年级成绩 |
老师 | 查看学生成绩,修改本科成绩,查询所教班级成绩 |
班主任 | 查看学生成绩,修改本科成绩,修改各科成绩,查询所教班级成绩 |
教导员 | 查看学生成绩,查看各班成绩,修改学生各科成绩 |
家长 | 查看孩子成绩,查看班级成绩,查看年级成绩 |
如上述表格,不同的角色有着不同的功能,根据不同的角色有着不同的分类。而且需要找出关联性性最大的那个对象,在这里,核心对象是学生,因为学生和其他对象都有所关联。
其中仅仅每个角色只有一些基本的属性,如姓名,编号等等,还没有涉及相关的关联关系。
2. 成绩管理
如上的功能描述,学生的成绩是本系统的核心,在设计中,成绩因为不同角色的权限,导致不同的角色所看到的成绩不一样,同时操作到的成绩也不一样。在这里就不仅仅只是将单个成绩插入数据库即可,还涉及到成绩的所属的问题,但是每个成绩所属的还是可以归集到学生身上,在通过学生相关的权限将成绩展示或者修改相关成绩内容。因此可以建立成绩表,使之一对一的对应关系,添加相应的成绩表。如下图:
3.班级管理
由于每个学生所述为一个班级,班级有被一个班主任所管理,以及被几个老师所管理。因此对于学生和班级的关系是一对一的关系,即在学生表里面加一个class_id字段来表明所述班级。而每个班级和老师的关系是多对多的关系,因为老师不会只交这一届班级,还有其他的班级,在此处设计为多对多的关系。因此添加一个新的表class_teacher_relation的关系表来表明所述的关系。同理,教导主任和班级的关系也是多对多的关系,只不过教导主任的权限可以扩充为整个年级,对整个年级的同学的成绩都有操作权限。而教导主任的权限也应该是多对多的关系,因为有着历史年级的问题。从上述分析可知,其关联关系图为:
4. 数据库结构
通过对上述功能分析,总结得出其对整个项目需要搭建什么样的效果,以及相关的功能进行分析,其整体的数据结构关系如下:
相应的导出为建表语句为:
-- -----------------------------------------------------
-- Schema score
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `score` ;
-- -----------------------------------------------------
-- Schema score
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `score` DEFAULT CHARACTER SET utf8 ;
USE `score` ;
-- -----------------------------------------------------
-- Table `score`.`student`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`student` ;
CREATE TABLE IF NOT EXISTS `score`.`student` (
`id` INT NOT NULL auto_increment,
`name` VARCHAR(45) NULL COMMENT '学生名字',
`class_id` INT(11) NULL COMMENT '所属班级',
`student_no` VARCHAR(45) NULL COMMENT '学号\n',
`is_deleted` INT NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建用户',
`create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
`modify_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '修改用户',
`modify_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '学生';
-- -----------------------------------------------------
-- Table `score`.`class_grade`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`class_grade` ;
CREATE TABLE IF NOT EXISTS `score`.`class_grade` (
`id` INT NOT NULL auto_increment,
`grade` VARCHAR(45) NULL,
`name` VARCHAR(45) NULL COMMENT '班级名称',
`teacher_id` VARCHAR(45) NULL COMMENT '班主任',
`year` VARCHAR(45) NULL COMMENT '入学年份\n',
`is_deleted` INT NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建用户',
`create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
`modify_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '修改用户',
`modify_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '班级';
-- -----------------------------------------------------
-- Table `score`.`teacher`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`teacher` ;
CREATE TABLE IF NOT EXISTS `score`.`teacher` (
`id` INT NOT NULL auto_increment,
`name` VARCHAR(45) NULL COMMENT '名称',
`teacher_no` VARCHAR(45) NULL COMMENT '老师编号',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '老师';
-- -----------------------------------------------------
-- Table `score`.`instructor`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`instructor` ;
CREATE TABLE IF NOT EXISTS `score`.`instructor` (
`id` INT NOT NULL auto_increment,
`name` VARCHAR(45) NULL,
`instructor_no` VARCHAR(45) NULL,
`is_deleted` INT NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建用户',
`create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
`modify_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '修改用户',
`modify_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '教导主任';
-- -----------------------------------------------------
-- Table `score`.`student_parent`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`student_parent` ;
CREATE TABLE IF NOT EXISTS `score`.`student_parent` (
`id` INT NOT NULL auto_increment,
`name` VARCHAR(45) NULL COMMENT '名字',
`student_id` VARCHAR(45) NULL COMMENT '学生',
`is_deleted` INT NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建用户',
`create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
`modify_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '修改用户',
`modify_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '学生家长';
-- -----------------------------------------------------
-- Table `score`.`achievement`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`achievement` ;
CREATE TABLE IF NOT EXISTS `score`.`achievement` (
`id` INT NOT NULL auto_increment,
`subject` VARCHAR(45) NULL COMMENT '科目',
`student_id` INT NULL COMMENT '学生',
`exam_id` INT NULL,
`is_deleted` INT NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建用户',
`create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
`modify_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '修改用户',
`modify_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '成绩表';
-- -----------------------------------------------------
-- Table `score`.`exam`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`exam` ;
CREATE TABLE IF NOT EXISTS `score`.`exam` (
`id` INT NOT NULL auto_increment,
`name` VARCHAR(45) NULL COMMENT '考试名称',
`describe` TEXT NULL COMMENT '描述',
`exam_start_time` DATETIME NULL COMMENT '考试开始时间',
`exam_end_time` DATETIME NULL COMMENT '考试结束时间',
`subject_ids` VARCHAR(45) NULL COMMENT '考试科目',
`is_deleted` INT NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建用户',
`create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
`modify_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '修改用户',
`modify_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '考试表';
-- -----------------------------------------------------
-- Table `score`.`class_teacher_relation`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`class_teacher_relation` ;
CREATE TABLE IF NOT EXISTS `score`.`class_teacher_relation` (
`id` INT NOT NULL auto_increment,
`class_id` VARCHAR(45) NULL COMMENT '班级',
`teacher_id` VARCHAR(45) NULL COMMENT '老师',
`is_deleted` INT NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建用户',
`create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
`modify_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '修改用户',
`modify_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '班级老师关系表';
-- -----------------------------------------------------
-- Table `score`.`grade_instructor_relation`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `score`.`grade_instructor_relation` ;
CREATE TABLE IF NOT EXISTS `score`.`grade_instructor_relation` (
`id` INT NOT NULL auto_increment,
`instructor_id` INT NULL COMMENT '教导主任',
`grade` VARCHAR(45) NULL COMMENT '年纪',
`is_deleted` INT NOT NULL DEFAULT '0' COMMENT '是否删除',
`create_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建用户',
`create_time` DATETIME NULL DEFAULT NULL COMMENT '创建时间',
`modify_user` VARCHAR(64) NULL DEFAULT NULL COMMENT '修改用户',
`modify_time` DATETIME NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
COMMENT = '年纪教导主任关系';
5.总结
通过上面的分析,我们得到相应的数据库ER图以及建表语句。上述的数据表结构或许还不完整,但针对目前来说的问题已经足够解决了,切勿在开始设计的时候就尽善尽美。软件在编写的过程中,随着我们思考的加深会进行一步步的修正相应的数据结构,但只要最核心的基本逻辑不变这个改动不会太大,如果要改核心逻辑时候,估计整个系统的数据结构又将发生大改。在下一篇中,将进行相应环境的搭建,以及相关数据库文件导入。