數據庫設計——向著第三范式努力

雖然,不在專業的IT公司工作,但我因為我的專業背景而驕傲。其實,教育背景也只是半專業的帶有“師范”后綴的“計算機科學”,但我因為我的專業信仰而自豪。

Learnsite是在我的學校中每節信息技術課都要使用的在線學習系統。它很好用,但并不完美。同時,又為了在職讀研的畢業論文,我決定再一次挑(折)戰(磨)自己——自己動手寫一個信息技術課在線學習系統。

Learnsite中的數據庫設計有很大的問題。一張學生表,把年級、班級、作業成績、表現成績等等全放進去,十分的冗余。所以自己設計的時候,就把它們分成了多個實體。今天,我又依稀地想起了這個術語“第三范式”。找到了理論依據(沒想到我也能說出這么“學術”的話),就可以更好的指導我的數據庫設計了。

其實,我設計的數據庫也不一定符合那些理論,但總感覺舒心了很多。各實體分得比較散,怎么輸出一張綜合統計表呢?學過的東西在關鍵的時候還真是有用,若干年過去,心里就只剩下一個個一閃而過的關鍵詞——它也是決定人的專業方向的關鍵因素。通過搜索,你就可以再次拾起這些知識。

今天就設計了這么幾個表:

年級班級表:grade_classes
學生信息表:students
表現得分表:performance_score

把Learnsite中的一張大表拆分成這樣幾張小表,感覺清爽了很多。但是,如果想要查詢一年級一班(grade_num=1 & class_num=1)學生分表得分的匯總表怎么辦呢?

我突然靈光一閃,想起了使用JOIN關鍵詞連接學生信息表和表現得分表,再根據給出的年級班級號得出班級代碼,最后使用班級代碼對前邊的結果進行篩選(快轉暈了)。經過一番努力,得出了下邊的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
)

最后的匯總結果也符合預期:


一年級一班學生表現得分匯總表

這樣就可以放心大膽地拆分表了,因為學藝不精,也沒法說這么做是否合適,不斷努力吧!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容