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

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

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

回答
編輯回答
逗婦乳

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)自動(dòng)根據(jù) [Status.date] 來(lái)刷新的:

// cs_id 為空時(shí)刷新整張表,不為空時(shí)即只刷新指定學(xué)生在指定班級(jí)的狀態(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] 表加個(gè)觸發(fā)器,或者直接每次前端提交新?tīng)顟B(tài)時(shí),后端代碼加入:

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

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


原答案:

因?yàn)椴惶宄闼f(shuō)的 "混亂" 是指什么,以下僅作討論:

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

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

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

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

2017年5月28日 14:54