Schema

標準化 - 2NF 和 3NF

  • April 21, 2015

我已經經歷了幾個問題和 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 中。

引用自:https://dba.stackexchange.com/questions/98427