鍍金池/ 問答/數(shù)據(jù)庫/ 數(shù)據(jù)庫設(shè)計,如何設(shè)計一個 班級學(xué)生表,實現(xiàn)班級學(xué)生的停課、復(fù)課、結(jié)課、轉(zhuǎn)班、考勤

數(shù)據(jù)庫設(shè)計,如何設(shè)計一個 班級學(xué)生表,實現(xiàn)班級學(xué)生的停課、復(fù)課、結(jié)課、轉(zhuǎn)班、考勤這些操作?

現(xiàn)在公司項目需要實現(xiàn)班級的學(xué)生的停課操作、復(fù)課操作、結(jié)課操作、轉(zhuǎn)班操作,后面可以根據(jù)考勤時間來查詢班級里面的學(xué)生來給他們考勤。這個數(shù)據(jù)表怎么設(shè)計呢?
現(xiàn)在的思路是3張表:
student學(xué)生版,
class班級表,
class_student班級學(xué)生表
class_studnet的字段:class_id,student_id,in_time(入班日期),out_time(轉(zhuǎn)班日期),stop_date(停課日期),recover_date(復(fù)課日期),is_close(是否結(jié)課), 然后根據(jù)日期來查詢給定日期當(dāng)天的班級學(xué)生列表。這樣有個問題:我要是修改停課日期或復(fù)課日期,就會出現(xiàn)混亂。
有沒有好的設(shè)計方案?

回答
編輯回答
逗婦乳

16:27 修改

[Student]
| student_id | name | ... |

[Class]
| class_id | ... |

[ClassAndStudent]
| cs_id | class_id | student_id | state | is_close |

[Status]
| cs_id | option | date |

[ClassAndStudent.state] 是每天系統(tǒng)自動根據(jù) [Status.date] 來刷新的:

// cs_id 為空時刷新整張表,不為空時即只刷新指定學(xué)生在指定班級的狀態(tài)
update_date(cs_id) {
    result = cs_id == null ? Status.selectAll().orderBy('date')
                           : Status.selectByCSID(cs_id);
    for (row : result) {
        if (row.date == current_date) {
            switch (row.option) {
                case 'in':
                    ClassAndStudent.selectBy(row.cs_id).setState('就讀');
                    ClassAndStudent.selectBy(row.cs_id).setClassId(new_class_id);
                    break;
                ...
            }
        }
    }
}

然后給 [Status] 表加個觸發(fā)器,或者直接每次前端提交新狀態(tài)時,后端代碼加入:

cs_id = Status.insert({class_id}, {student_id}, 'in', {date});
update_state(cs_id);

這樣 [ClassAndStudent.state] 就是該學(xué)生在該班的實時狀態(tài)了。


原答案:

因為不太清楚你所說的 "混亂" 是指什么,以下僅作討論:

[Student]
| student_id | name | ... | is_close

[Class]
| class_id | student_id | option | date |

option通過 in/out/stop/recover 來表示操作,date保存該操作的時間。
查詢時只需要判斷 [Student.is_close] ,然后對特定student_id的結(jié)果集通過 [Class.date] 按降序排序,即可知道該學(xué)生是否結(jié)課,未結(jié)課的話就能獲取該學(xué)生當(dāng)前所讀的班級以及當(dāng)前狀態(tài)(in/out/stop/recover)。

查詢考勤則是,對于日期早于query_dateoptionstop的,is_close也為假的,即為需要考勤的學(xué)生,此時group by一下就可以按班為單位查詢了。

2017年5月28日 14:54