### 项目简介
[TOC=4,6]
所有的关于技术细节的讨论和实现都是基于一定的项目背景的,所以首先来介绍下我做的项目情况。这里要介绍的项目是一个**作业管理系统**。对你没看错,就是一个简单的学生交作业老师改作业然后给出评分的信息管理系统。说它简单,是因为它太平常,我们整个上学期间都在重复做这个事情,而细细想来它也很有代表性,所牵涉到的数据关系以及操作**完全可以满足入门学习实践任何一个框架的要求**。首先我们从用例的角度来看看它有哪些使用者。
#### 用例分析
该系统的使用者分为三种,分别是:
(1)学生
学生通过该系统定期查看老师布置的作业、完成它们、查看老师给出的评分。
(2)老师
老师通过使用该系统,布置作业给学生。当然,想的细一点就是首先要选择他所带的班级,然后给这些班级布置作业。
(3)管理员
管理员主要做一些信息维护工作,比如管理学生的信息,管理老师的信息,管理班级的信息等。
从用例的分析上来看,该系统的功能较简单,一目了然。
#### 系统牵涉到的关键元素
笔者并不打算按照传统的软件工程的文档来写项目的概述,而是想用自己的方式更快更直接的让您可以了解项目。通过上面的讲述,提取一下,该项目牵涉的关键元素主要有 **学生、教师、班级、作业(老师布置的作业和学生提交的作业)**。下面看看他们自己的关系是什么?
#### 各个元素间的关系
(1)学生和班级的关系
这个不用多说,学生和班级当然是**多对一**的关系,一个班级有多个学生,每个学生都属于某个班级。
(2)班级和教师的关系
这个需要想的细一些,一个老师可以带不同的班级,一个班级也可以由不同的老师带,所以它们是**多对多**的关系。**所有多对多的关系都可以拆分为两个一对多的关系**。而这时候需要一个第三方元素来保存班级和老师的对应关系。确定了教师带哪些班级后,在系统中老师就可以为这些班级布置作业了。
(3)教师和作业的关系
跟在学校学习期间的常识一样,教师可以布置多个作业,一个作业只能由一个老师来布置,所以是**一对多**的关系
(4)作业和班级的关系
每个班级的所有学生布置的作业都是一样的,一个班级可以被布置多个作业,所以是**多对一**的关系。
(5)学生提交的答案和学生、作业的关系
学生交作业后产生的答案需要记录在系统中,这个答案和学生是一对一的关系和作业也是一对一的关系,所以需要保留学生和作业的主键作为外键。(数据库层面)
#### 关系数据库建模
知道了哪些元素和关系后,那我们就可以进行数据库建模了,数据库关系图如下所示:
![](https://box.kancloud.cn/b83164064984e159102ef4e2a86a2695_918x545.png)
把表大概注解一下,以防英文不大好的童鞋搞不清楚:
**(1)tb_student——学生表**
主要字段包括:
* stu_id ——学生ID(主键、自动增长)
* stu_no——学号(学生使用学号作为用户名登陆本系统)
* stu_name——姓名
* password——登陆密码
* class_id——班级ID(外键,用于和班级建立多对一的关系)
* new_task_number——未完成作业的数目(用于提醒学生)
**(2)tb_clas——班级表**
主要字段包括:
* clas_id——班级ID(主键、自动增长)
* clas_name——班级名称
**(3)tb_teacher——教师表**
主要字段:
* teacher_id ——教师ID(主键、自动增长)
* user_name——用户名(教师使用工号作为用户名登陆本系统)
* realname——姓名
* password——登陆密码
**(4)tb_teacher_clas——教师班级关系表(存放教师和班级的对应关系)**
还记得我们前面讲过教师和班级是多对多的关系,所以需要一个关系表用来存放他们的关系。
主要字段:
* clas_id ——班级ID(外键)
* teacher_id ——教师ID(外键)
**(5)tb_task—— 作业表**
作业表中存放老师布置的作业,它需要弄清楚是哪个老师布置的,所以需要保留教师表的主键为它的外键
主要字段:
* task_id ——作业ID(主键、自动增长)
* task_title——作业标题
* task_content——作业内容
* submit_date——布置日期
* finish_date——截止日期
* teacher_id——教师ID(外键用于和教师表建立关系)
**(6)tb_task_class——作业班级关系表**
由于一个作业可以布置给不同的班级,一个班级也可以布置多个作业,因此作业和班级是多对多的关系,需要用一个关系表来保存对应关系:
* task_id——作业ID(外键)
* clas_id——班级ID(外键)
**(7)tb_submit——学生提交作业后将答案保存在本表中**
该表也是本系统中最重要的表,保存学生做作业的答案,并记录老师给学生的打分。该表需要明确是哪个学生提交的,提交的是哪个作业,所以需要保留学生表和作业表的主键作为外键:
* submit_id——提交ID(主键、自动增长)
* task_id——作业ID
* stu_id——学生ID
* submit_content——提交的内容
* score——作业得分
* attach_url——附件路径(如果有的话)
好了,有了我上述关于关键元素以及它们之间的关系,想必数据库关系图一定很好理解吧,如果有什么问题,欢迎大家在评论中给出,本节到此结束!