避免傳遞性依賴性來幫助確保標準化
數據庫中的傳遞依賴關係是同一個表中引起函數依賴關係的值之間的間接關係。 要達到第三範式(3NF)的標準化標準,您必須消除任何傳遞依賴。
就其性質而言,傳遞依賴需要三個或更多屬性(或數據庫列),它們之間具有函數依賴關係,這意味著表中的列A依賴於列B通過中間列C.
讓我們看看這可能如何工作。
傳遞依賴例子
作者
AUTHOR_ID | 作者 | 書 | Author_Nationality |
---|---|---|---|
Auth_001 | 奧森斯科特卡 | 安德的遊戲 | 美國 |
Auth_001 | 奧森斯科特卡 | 安德的遊戲 | 美國 |
Auth_002 | 瑪格麗特阿特伍德 | 婢女的故事 | 加拿大 |
在上面的AUTHORS示例中:
- Book → Author :這裡, Book屬性決定了Author屬性。 如果你知道書名,你可以學習作者的名字。 但是, 作者不確定Book ,因為作者可以寫多本書。 例如,僅僅因為我們知道作者的名字奧森斯科特卡,我們仍然不知道書名。
- Author → Author_Nationality :同樣, Author屬性決定了Author_Nationality ,但不是相反; 僅僅因為我們知道國籍並不意味著我們可以確定作者。
但是這張表引入了傳遞依賴:
- Book → Author_Nationality:如果我們知道書名,我們可以通過作者欄確定國籍。
避免傳遞性依賴
為了確保第三範式,我們刪除傳遞的依賴關係。
我們可以從Authors表中刪除Book列並創建一個單獨的Books表:
圖書
Book_ID | 書 | AUTHOR_ID |
---|---|---|
Book_001 | 安德的遊戲 | Auth_001 |
Book_001 | 心靈的孩子 | Auth_001 |
Book_002 | 婢女的故事 | Auth_002 |
作者
AUTHOR_ID | 作者 | Author_Nationality |
---|---|---|
Auth_001 | 奧森斯科特卡 | 美國 |
Auth_002 | 瑪格麗特阿特伍德 | 加拿大 |
這是否解決了它? 現在我們來看看我們的依賴關係:
書桌 :
- Book_ID → Book: Book取決於Book_ID 。
- 此表中沒有其他依賴關係存在,所以我們沒問題。 請注意,外鍵Author_ID通過其主鍵Author_ID將此錶鍊接到AUTHORS表。 我們創建了一種關係來避免傳遞依賴關係,這是關係數據庫的關鍵設計。
作者表 :
- Author_ID → 作者: 作者依賴於Author_ID 。
- 作者 → 作者 國籍:國籍可以由作者確定。
- Author_ID → Author_Nationality:通過Author屬性可以從Author_ID確定國籍。 我們仍然有傳遞依賴。
我們需要添加第三個表來規範化這些數據:
COUNTRIES
COUNTRY_ID | 國家 |
---|---|
Coun_001 | 美國 |
Coun_002 | 加拿大 |
作者
AUTHOR_ID | 作者 | COUNTRY_ID |
---|---|---|
Auth_001 | 奧森斯科特卡 | Coun_001 |
Auth_002 | 瑪格麗特阿特伍德 | Coun_002 |
現在我們有三個表格,利用外鍵來鏈接表格:
- BOOK表的外鍵Author_ID將一本書鏈接到AUTHORS表中的作者。
- AUTHORS表的外鍵Country_ID將作者鏈接到COUNTRIES表中的國家。
- COUNTRIES表沒有外鍵,因為它不需要鏈接到此設計中的另一個表。
為什麼傳遞依賴是數據庫設計不好的原因
避免傳遞依賴來幫助確保3NF的價值是什麼? 讓我們再次考慮我們的第一個表格,並查看它創建的問題:
作者
AUTHOR_ID | 作者 | 書 | Author_Nationality |
---|---|---|---|
Auth_001 | 奧森斯科特卡 | 安德的遊戲 | 美國 |
Auth_001 | 奧森斯科特卡 | 心靈的孩子 | 美國 |
Auth_002 | 瑪格麗特阿特伍德 | 婢女的故事 | 加拿大 |
這種設計可能會導致數據異常和不一致,例如:
- 如果您刪除了“Mind of Children”和“Ender's Game”這兩本書,您將從數據庫中完全刪除作者“Orson Scott Card”和他的國籍。
- 除非您還添加書籍,否則不能將新作者添加到數據庫; 如果作者尚未發布或者您不知道她撰寫的書籍的名稱,該怎麼辦?
- 如果“奧森斯科特卡”改變了他的國籍,你將不得不在他出現的所有記錄中改變它。 擁有同一作者的多條記錄可能會導致數據不准確:如果數據錄入人員沒有意識到他有多個記錄並且只將數據更改為一條記錄,該怎麼辦?
- 在不刪除作者的情況下,您不能刪除“女僕的故事”這樣的書。
這些只是正常化的一些原因,並且避免了傳遞依賴性,保護數據並確保一致性。