標準化 - 2NF 和 3NF
我已經經歷了幾個問題和 youtube 教程,我知道 2NF 正在刪除部分依賴項,而 3NF 是傳遞的,但我無法理解以下範例在 2NF 中應該是什麼樣子。
學生證 | 學生姓名 | 課程程式碼 | 課程名稱 | 模組程式碼 | 模組標題 | 學分 | 結果程式碼
對於 2NF,我的嘗試如下:
學生
學生證 | 學生姓名 | 課程程式碼 | 模組程式碼 | 結果程式碼
課程
課程程式碼 | 課程名稱
模組
模組程式碼 | 模組標題 | 學分
它是否正確?如果不是我哪裡錯了,為什麼。
以下是3NF:
學生
學生證 | 學生姓名 | 課程程式碼
課程
課程程式碼 | 課程名稱
模組
模組程式碼 | 模組標題 | 學分 | 課程程式碼
結果
學生證 | 模組程式碼 | 結果程式碼
這也是一樣,這是正確的 - 如果不是,為什麼?
任何幫助都會很棒,因為我已經討論這個話題好幾天了,但仍然不太確定!謝謝你。
從我對堆棧溢出的回答:https ://stackoverflow.com/a/29772759/2534472
好的,讓我們看看你的 2NF 嘗試:
學生
學生證 | 學生姓名 | 課程程式碼 | 模組程式碼 | 結果程式碼
課程
課程程式碼 | 課程名稱
模組
模組程式碼 | 模組標題 | 學分
讓我們先談談學生。
您的鍵不能是 studentID,因為 resultCode 取決於 studentID 和 courseCode(每門課程都有一個結果)。但是您的 studentName 僅取決於 studentID,因此是鍵的一部分(studentID,courseCode)。所以違反了2NF。你需要做這樣的事情:
學生
學生證 | 學生姓名 | 課程程式碼 | 模組程式碼
課程
課程程式碼 | 課程名稱
模組
模組程式碼 | 模組標題 | 學分
結果
學生證 | 課程程式碼 | 結果程式碼
但請記住,這尊重 2NF,但似乎仍然不正確,因為模組和課程現在完全不相關。所以試試這個:
學生
學生證 | 學生姓名 | 模組程式碼
模組
模組程式碼 | 模組標題 | 學分
課程
課程程式碼 | 課程名稱 | 模組程式碼
結果
學生證 | 課程程式碼 | 結果程式碼
從我的角度來看,課程屬於一個模組(一個模組有很多課程)。這在 2NF 中是自動的(因為鍵始終只是一個屬性(結果除外,但只有一個非鍵屬性始終取決於兩個鍵屬性),因此沒有什麼可以依賴於鍵的“部分” )。它也在 3NF 中,因為每個“物理”實體在數據模型中都有它的邏輯表示(更多的是經驗法則而不是形式主義)。
現在讓我們看看你的 3NF 嘗試。我認為你的模組<->課程依賴是錯誤的,但讓我們專注於規範化。
學生
學生證 | 學生姓名 | 課程程式碼
課程
課程程式碼 | 課程名稱
模組
模組程式碼 | 模組標題 | 學分 | 課程程式碼
結果
學生證 | 模組程式碼 | 結果程式碼
這是正確的 3NF,因為除了密鑰本身之外沒有其他候選密鑰。所以不能有任何傳遞依賴。
為了澄清這一點:關鍵候選者是許多最小的可能密鑰集之一。在您的關係中,您至少找到了一個具有一個元素的關鍵候選對象(結果關係除外)。因此,任何其他關鍵候選人都不能有多個元素。這意味著,您可以簡單地查看每個屬性並決定“這是否可以是鍵?” 在您的範例中,您發現沒有其他屬性可以成為鍵-因此它自動出現在 2NF 和 3NF 中。