### 項目簡介
[TOC=4,6]
所有的關于技術細節的討論和實現都是基于一定的項目背景的,所以首先來介紹下我做的項目情況。這里要介紹的項目是一個**作業管理系統**。對你沒看錯,就是一個簡單的學生交作業老師改作業然后給出評分的信息管理系統。說它簡單,是因為它太平常,我們整個上學期間都在重復做這個事情,而細細想來它也很有代表性,所牽涉到的數據關系以及操作**完全可以滿足入門學習實踐任何一個框架的要求**。首先我們從用例的角度來看看它有哪些使用者。
#### 用例分析
該系統的使用者分為三種,分別是:
(1)學生
學生通過該系統定期查看老師布置的作業、完成它們、查看老師給出的評分。
(2)老師
老師通過使用該系統,布置作業給學生。當然,想的細一點就是首先要選擇他所帶的班級,然后給這些班級布置作業。
(3)管理員
管理員主要做一些信息維護工作,比如管理學生的信息,管理老師的信息,管理班級的信息等。
從用例的分析上來看,該系統的功能較簡單,一目了然。
#### 系統牽涉到的關鍵元素
筆者并不打算按照傳統的軟件工程的文檔來寫項目的概述,而是想用自己的方式更快更直接的讓您可以了解項目。通過上面的講述,提取一下,該項目牽涉的關鍵元素主要有 **學生、教師、班級、作業(老師布置的作業和學生提交的作業)**。下面看看他們自己的關系是什么?
#### 各個元素間的關系
(1)學生和班級的關系
這個不用多說,學生和班級當然是**多對一**的關系,一個班級有多個學生,每個學生都屬于某個班級。
(2)班級和教師的關系
這個需要想的細一些,一個老師可以帶不同的班級,一個班級也可以由不同的老師帶,所以它們是**多對多**的關系。**所有多對多的關系都可以拆分為兩個一對多的關系**。而這時候需要一個第三方元素來保存班級和老師的對應關系。確定了教師帶哪些班級后,在系統中老師就可以為這些班級布置作業了。
(3)教師和作業的關系
跟在學校學習期間的常識一樣,教師可以布置多個作業,一個作業只能由一個老師來布置,所以是**一對多**的關系
(4)作業和班級的關系
每個班級的所有學生布置的作業都是一樣的,一個班級可以被布置多個作業,所以是**多對一**的關系。
(5)學生提交的答案和學生、作業的關系
學生交作業后產生的答案需要記錄在系統中,這個答案和學生是一對一的關系和作業也是一對一的關系,所以需要保留學生和作業的主鍵作為外鍵。(數據庫層面)
#### 關系數據庫建模
知道了哪些元素和關系后,那我們就可以進行數據庫建模了,數據庫關系圖如下所示:

把表大概注解一下,以防英文不大好的童鞋搞不清楚:
**(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——附件路徑(如果有的話)
好了,有了我上述關于關鍵元素以及它們之間的關系,想必數據庫關系圖一定很好理解吧,如果有什么問題,歡迎大家在評論中給出,本節到此結束!