雖然伦意,不在專業(yè)的IT公司工作,但我因為我的專業(yè)背景而驕傲甚垦。其實,教育背景也只是半專業(yè)的帶有“師范”后綴的“計算機科學”涣雕,但我因為我的專業(yè)信仰而自豪艰亮。
Learnsite是在我的學校中每節(jié)信息技術(shù)課都要使用的在線學習系統(tǒng)。它很好用挣郭,但并不完美迄埃。同時,又為了在職讀研的畢業(yè)論文兑障,我決定再一次挑(折)戰(zhàn)(磨)自己——自己動手寫一個信息技術(shù)課在線學習系統(tǒng)调俘。
Learnsite中的數(shù)據(jù)庫設(shè)計有很大的問題。一張學生表旺垒,把年級彩库、班級、作業(yè)成績先蒋、表現(xiàn)成績等等全放進去骇钦,十分的冗余。所以自己設(shè)計的時候竞漾,就把它們分成了多個實體眯搭。今天窥翩,我又依稀地想起了這個術(shù)語“第三范式”。找到了理論依據(jù)(沒想到我也能說出這么“學術(shù)”的話)鳞仙,就可以更好的指導我的數(shù)據(jù)庫設(shè)計了寇蚊。
其實,我設(shè)計的數(shù)據(jù)庫也不一定符合那些理論棍好,但總感覺舒心了很多仗岸。各實體分得比較散,怎么輸出一張綜合統(tǒng)計表呢借笙?學過的東西在關(guān)鍵的時候還真是有用扒怖,若干年過去,心里就只剩下一個個一閃而過的關(guān)鍵詞——它也是決定人的專業(yè)方向的關(guān)鍵因素业稼。通過搜索盗痒,你就可以再次拾起這些知識。
今天就設(shè)計了這么幾個表:
把Learnsite中的一張大表拆分成這樣幾張小表低散,感覺清爽了很多俯邓。但是,如果想要查詢一年級一班(grade_num=1 & class_num=1)學生分表得分的匯總表怎么辦呢熔号?
我突然靈光一閃稽鞭,想起了使用JOIN關(guān)鍵詞連接學生信息表和表現(xiàn)得分表,再根據(jù)給出的年級班級號得出班級代碼跨嘉,最后使用班級代碼對前邊的結(jié)果進行篩選(快轉(zhuǎn)暈了)川慌。經(jīng)過一番努力吃嘿,得出了下邊的SQL:
SELECT
students.student_number, students.student_name, score
FROM
students
JOIN
(
SELECT
performance_score.student_number, SUM(performance_score.delta_score) AS score
FROM
performance_score
GROUP BY
performance_score.student_number
)
AS per_s
ON
students.student_number = per_s.student_number
WHERE
students.class_code IN
(
SELECT
grade_classes.class_code
FROM
grade_classes
WHERE
grade_classes.grade_num = 1
AND
grade_classes.class_num = 1
)
最后的匯總結(jié)果也符合預期:
這樣就可以放心大膽地拆分表了祠乃,因為學藝不精,也沒法說這么做是否合適兑燥,不斷努力吧!