Normalization

與基本數據庫規範化相關的“依賴”的含義

  • September 14, 2020

在試圖弄清楚為什麼以下關於醫院病房護士的教科書練習中的表格定義不在 2NF 中:

病房(WName,位置,WType)

病房護士(WName(fk)、NurseID、NurseName、TeamCode、TeamSkill、Shift)

在描述某些屬性如何不“依賴”整個鍵時,“依賴”是什麼意思?例如“你不需要知道病房名稱就可以知道護士在哪個班次”之類的東西?

很明顯,要使該數據庫處於 2NF 中,我需要將定義更改為

病房(WName,位置,WType)

病房護士(WName(fk)、NurseID(fk)、Shift)

護士 ( NurseID、 NurseName 、 TeamCode 、 TeamSkill )

同樣對於 3NF,“取決於”一詞的解釋及其對上面表格定義的應用讓我知道 3NF 的解決方案是

病房(WName,位置,WType)

病房護士(WName(fk)、NurseID(fk)、Shift)

護士 ( NurseID , NurseName, TeamCode(fk))

團隊(團隊程式碼,團隊技能)

以上所有內容均來自教科書練習,其中除了建議的表格定義之外沒有給出任何解釋。

在這種情況下,“取決於”意味著“由”或“由”決定。知道一個人的身份證,我們可以查出他們的出生日期。給定第二個 ID,我們通常會得到不同的出生日期。(當然它們可能偶然是相同的日期,但這不是由表定義決定的,只是一個意外,因為只有有限數量的日期可供使用。)所以要知道一個人的出生日期,我們必須知道身份證號碼. 我們說出生日期取決於身份證。

要確定一個表是否為 2NF,我會想“給定一行,如果我只更改了部分鍵,我是否仍能確定非鍵列的值是什麼?” 對於建議的表 Ward-Nurse ( WName (fk), NurseID , NurseName, ..),如果我更改了 WName 但保持 NurseID 不變,我還能確定 NurseName 是什麼嗎?答案是肯定的,因為 NurseName 僅取決於(由/決定)NurseID 並且不以任何方式由 WName 確定。與 TeamCode 和 TeamSkill 類似。

2NF 和 3NF 的區別在於 2NF 談論密鑰,而 3NF 談論非密鑰。給定 2NF 表 Nurse (NurseID、 NurseName 、 TeamCode 、 TeamSkill )中的一行,如果我更改了任何非鍵列,其他所有內容是否仍一定相同?如果我更改 NurseName 的值,TeamCode 或 TeamSkill 會保持不變嗎?是他們會。如果我更改 TeamCode,TeamSkill 和 NurseName 會保持原樣嗎?不,TeamSkill 必須改變;TeamSkill 必須在 TeamCode 更改時更改,因此其值取決於 TeamCode 的值。因此 (TeamCode, TeamSkill) 在 3NF 中成為它自己的表。

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