歸一化是一種數據庫設計技術,旨在減少數據冗餘並改善數據完整性。有幾種正常形式定義了不同水平的歸一化。讓我們詳細探討它們:
1。第一種正常形式(1NF):
標準化數據庫的第一步是確保其處於第一種正常形式。如果滿足以下條件,則表格為1NF:
2。第二個正常形式(2NF):
如果表格為1NF,則表格為2NF,並且所有非鍵列在功能上完全取決於表的主鍵。這意味著,如果表的主鍵由多個列組成,則不應僅取決於鍵的一部分,而應取決於整個密鑰。
3。第三正常形式(3NF):
如果在2NF中,則在3NF中有一個表格,並且沒有傳遞依賴性。這意味著,如果非鍵列取決於另一個非鍵列,則應將其移至單獨的表。換句話說,每個非鑰匙列都必須提供有關鑰匙,整個密鑰的事實,除了密鑰外。
4。Boyce-CODD正常形式(BCNF):
BCNF是3NF的更嚴格版本。如果該表在3NF中,則在BCNF中,並且其非平凡的功能依賴項x-> y,x是超鍵,也就是說,x是候選鍵,或者是超級鍵。 BCNF旨在消除由於某些類型的功能依賴性而導致在3NF表中仍可能出現的異常的可能性。
1NF和2NF之間的關鍵差異在於表中依賴關係的性質。
為了說明,請考慮使用複合主鍵在1NF中的表。如果非鑰匙列僅取決於主鍵的一部分,則違反2NF。例如,如果表跟踪訂單具有復合主鍵(OrderID,ProductID)和ProductPrice的列僅取決於ProductID,則將productPrice移至單獨的表(使用ProductID作為主鍵)將原始表格帶入2NF。
第三正常形式(3NF)通過消除及物依賴性來降低數據冗餘性起著至關重要的作用。當非鍵列取決於另一個非鍵列時,會發生及依賴性,這又取決於主鍵。
例如,考慮一個2NF中的表,其中包括員工ID(主要密鑰),deconcoldID和DepartmentName的列。如果部門名稱依賴於部門ID,而部門又取決於員工,則部門名稱通過dectionsID對員工ID具有傳遞性依賴性。此設置可以導致數據冗餘,因為表中可以多次重複相同的部門名稱。
為了解決這個問題,3NF將需要將部門名稱轉移到單獨的部門表(以部門為主要鍵),從而消除了傳遞性依賴性。該歸一化步驟可確保部門名稱僅存儲一次,從而減少冗餘並提高數據完整性。當需要更新時,必須僅在一個地方進行,以最大程度地減少矛盾的風險。
當存在功能依賴性時,Boyce-CODD正常形式(BCNF)比第三正常形式(3NF)優選,而確定依賴性(依賴的左側)不是超級鑰匙。 BCNF提供了更嚴格的標準,以消除可以在3NF表中持續存在的異常。
考慮一個涉及大學課程註冊系統的示例:
表:CoursereGistration
功能依賴性:
在這種情況下,表格為3NF,因為沒有傳遞依賴性。但是,它違反了BCNF,因為教師 - > courseId意味著不是超級關鍵的教師,它決定了另一個非關鍵列,課程ID。
為了滿足BCNF,我們需要將表分為兩者:
Table1:CoursereGistration
Table2:教師
通過這樣做,我們確保功能依賴性中的每個決定因素都是超鍵,從而滿足BCNF標準。這種分離消除了潛在的異常情況,例如插入,刪除和更新如果表保留在3NF中,可能會發生的異常。
以上是解釋不同的正常形式(1NF,2NF,3NF,BCNF)。的詳細內容。更多資訊請關注PHP中文網其他相關文章!