關聯式資料庫設計是有效資料庫系統的基石,專注於有效組織數據,同時減少冗餘並保持資料完整性。本文對分解、規範化、函數依賴和鍵進行了徹底的探索,確保您完全理解關聯式資料庫設計原則。
分解是將一個大的關係(表)分解成更小的、有意義的關係,以消除冗餘、提高一致性並優化效能的過程。這是正常化的關鍵面向。
有損分解:
EmployeeID | ProjectID | ProjectManager --------------------------------------- E1 | P1 | M1 E2 | P1 | M1
如果將其分解為:
無損分解:
函數依賴 (FD) 描述關係中兩個屬性之間的關係,其中一個屬性(或屬性集)的值決定另一個屬性(或屬性集)的值。它是關係資料庫設計和規範化中的基本概念。
定義:X → Y 表示對於 R 中的任兩個元組(行),如果元組在 X 的值上一致,他們也必須就 Y 的值達成一致。
StudentID | Name | Major ---------------------------- S1 | Alice | CS S2 | Bob | EE S3 | Alice | CS
鍵對於唯一識別表中的記錄和強制資料完整性至關重要。
超級鍵:
候選金鑰:
主鍵:
外鍵:
複合鍵:
唯一密鑰:
標準化是組織屬性和關係以減少冗餘和依賴性、確保資料完整性的過程。這是透過逐步滿足連續範式的標準來實現的。
定義:
若關係符合以下條件,則稱為 第一範式 (1NF):
說明:
範例:
EmployeeID | ProjectID | ProjectManager --------------------------------------- E1 | P1 | M1 E2 | P1 | M1
StudentID | Name | Major ---------------------------- S1 | Alice | CS S2 | Bob | EE S3 | Alice | CS
定義:
若滿足下列條件,則關係為 第二範式 (2NF):
說明:
這一步減少了部分依賴造成的冗餘,更好地組織資料。
範例:
考慮一個儲存學生課程資訊的表格:
EmployeeID | ProjectID | ProjectManager --------------------------------------- E1 | P1 | M1 E2 | P1 | M1
這違反了 2NF,因為非主屬性(講師和部門)部分依賴組合鍵。
要刪除部分依賴關係,請將表分解為兩個關係:
StudentID | Name | Major ---------------------------- S1 | Alice | CS S2 | Bob | EE S3 | Alice | CS
OrderID | Items ------------------- 1 | Pen, Notebook 2 | Pencil
定義:
若滿足下列條件,則關係為 第三範式 (3NF):
說明:
在 3NF 中,我們消除傳遞依賴以減少冗餘並提高資料一致性。
範例:
OrderID | Item --------------- 1 | Pen 1 | Notebook 2 | Pencil
候選鍵:StudentID 唯一標識每一行。
這種結構會導致冗餘:如果 CS 部門的 HOD 發生變化,則需要更新多行。
要解決傳遞依賴關係,請將表分解為兩個關係:
EmployeeID | ProjectID | ProjectManager --------------------------------------- E1 | P1 | M1 E2 | P1 | M1
StudentID | Name | Major ---------------------------- S1 | Alice | CS S2 | Bob | EE S3 | Alice | CS
定義:
若符合下列條件,則關係為 Boyce-Codd 範式 (BCNF):
3NF 和 BCNF 之間的主要差異:
說明:
BCNF 比 3NF 更嚴格,解決了關係可能滿足 3NF 但仍然具有由於違反 BCNF 的依賴關係而導致的冗餘的情況。
何時需要 BCNF:
範例:
OrderID | Items ------------------- 1 | Pen, Notebook 2 | Pencil
函數依賴:
候選鍵:課程ID
問題:
要實現 BCNF,請將表分解為兩個關係式:
OrderID | Item --------------- 1 | Pen 1 | Notebook 2 | Pencil
StudentID | CourseID | Instructor | Department ---------------------------------------------- S1 | C1 | Dr. Smith | CS S2 | C2 | Dr. Jones | EE S1 | C2 | Dr. Jones | EE
定義:
若符合下列條件,則關係屬於 第四範式 (4NF):
說明:
在4NF 中,主要目標是消除多值依賴,當記錄包含兩個或多個不直接相關但由於依賴於同一鍵而出現在一起的獨立屬性時,就會發生這種情況。
關鍵概念:
範例:
考慮一個儲存有關學生、他們參加的課程以及他們參與的俱樂部的資訊的表:
EmployeeID | ProjectID | ProjectManager --------------------------------------- E1 | P1 | M1 E2 | P1 | M1
候選鍵:StudentID
多值依賴:
表格違反了 4NF,因為 StudentID 獨立確定課程和俱樂部。這會導致冗餘,因為同一學生 ID 在不同的課程和俱樂部組合中重複多次。
為了使表符合4NF,我們必須透過將其分解為兩個表來消除多值依賴:
StudentID | Name | Major ---------------------------- S1 | Alice | CS S2 | Bob | EE S3 | Alice | CS
OrderID | Items ------------------- 1 | Pen, Notebook 2 | Pencil
現在,兩個多值依賴項是分開處理的:
定義:
關係採用 第五範式 (5NF),也稱為 投影連結範式 (PJNF),如果:
說明:
5NF 處理連接依賴,它確保資料以這樣的方式分解,即所有資訊都可以從分解的部分重建,而不會丟失任何資料。 5NF 中的關係的設計方式是,其所有重要的連接依賴關係都由其候選鍵隱含。
簡單來說,5NF 關注的是確保不存在因分解不當而導致的冗餘。它保證當關係被分解並隨後連接回來時,所有原始數據仍然可用,沒有任何丟失或歧義。
範例:
考慮一個表,儲存哪些供應商為不同項目提供哪些零件的資訊:
EmployeeID | ProjectID | ProjectManager --------------------------------------- E1 | P1 | M1 E2 | P1 | M1
候選鍵:(供應商、零件、項目)
加入依賴:
上面的關係具有連接依賴性,因為它可以分解為更小的關係而不丟失資訊。例如,表格可以分解為三個子關係:
EmployeeID | ProjectID | ProjectManager --------------------------------------- E1 | P1 | M1 E2 | P1 | M1
StudentID | Name | Major ---------------------------- S1 | Alice | CS S2 | Bob | EE S3 | Alice | CS
OrderID | Items ------------------- 1 | Pen, Notebook 2 | Pencil
透過將表分解為這些較小的關係,我們仍然可以透過對這三個較小的關係執行自然連接來重新建立原始表。
但是,由於這種分解是可能的,所以它違反了 5NF。它違反 5NF 的原因是,關於哪個供應商為給定項目提供哪個部件的資訊被冗餘地儲存在多行中。我們多次儲存相同的事實,這是不必要的,並且可能會導致不一致。
為了實現 5NF,我們分解表,以便在不丟失資訊的情況下無法進一步分解關係:
OrderID | Item --------------- 1 | Pen 1 | Notebook 2 | Pencil
在這種形式中,關係現在處於 5NF 狀態,因為它無法在不丟失資料的情況下進一步分解。該表表示與原始表相同的信息,但以更規範的形式表示,其中每個屬性完全依賴候選鍵,並且不存在由於分解不當而導致的冗餘。
這份綜合指南使您能夠掌握關聯式資料庫設計,確保資料庫系統有效率、一致且無異常。
以上是關係型資料庫設計:DBMS的詳細內容。更多資訊請關注PHP中文網其他相關文章!