關係資料庫中函式依賴和規範化的基礎
介紹
函式依賴和規範化是關係資料庫設計中的重要概念。函式依賴是指一個屬性的值決定另一個屬性的值。規範化是組織資料庫以減少冗餘和依賴性的過程。它是設計高效和有效資料庫結構的關鍵步驟。
什麼是函式依賴?
函式依賴是資料庫中屬性之間的關係。它們描述了一個屬性如何依賴於另一個屬性。例如,考慮一個員工記錄資料庫。員工的 ID 號碼可能函式依賴於他們的姓名,因為姓名決定了 ID 號碼。在這種情況下,我們會說 ID 號碼函式依賴於姓名。
函式依賴可以用來設計一個消除冗餘並確保資料完整性的資料庫。例如,考慮一個儲存員工記錄及其工作部門的資料庫。如果我們為每個員工儲存部門名稱,我們可能會最終得到多個相同部門名稱的副本。
這將是冗餘的,並將佔用資料庫中不必要的空間。相反,我們可以使用函式依賴只儲存部門名稱一次,並使用員工的 ID 號碼來確定他們工作的部門。這減少了冗餘,並使資料庫更高效。
為什麼規範化很重要?
規範化是組織資料庫以減少冗餘和依賴性的過程。它很重要,因為它有助於消除資料不一致性,並確保資料以邏輯和組織化的方式儲存。
例如,考慮一個儲存客戶資訊及其購買產品的資料庫。如果我們為每個客戶記錄儲存產品名稱,我們可能會最終得到多個相同產品名稱的副本。這將是冗餘的,並將佔用資料庫中不必要的空間。相反,我們可以使用規範化來為產品建立一個單獨的表,並只儲存產品名稱一次。這減少了冗餘,並使資料庫更高效。
有幾種正規化可以用來規範化資料庫。最常見的正規化是一正規化、二正規化和三正規化。
第一正規化 (1NF)
第一正規化 (1NF) 是規範化的基本級別。要處於 1NF,一個表必須滿足以下條件:
它必須只包含原子值。原子值是一個不能進一步分解的單個值。例如,姓名是原子值,但地址不是,因為它可以分解成街道、城市、州和郵政編碼的單獨值。
它不能包含重複組。重複組是在單個記錄中重複的一組值。例如,如果一個表包含電話號碼欄位,它不應該在同一個欄位中包含多個電話號碼。相反,應該為每個電話號碼設定單獨的欄位。
第二正規化 (2NF)
第二正規化 (2NF) 是更高一級的規範化。要處於 2NF,一個表必須滿足以下條件:
它必須處於 1NF。
它不能有任何部分依賴。部分依賴是指非鍵屬性僅依賴於主鍵的一部分。例如,考慮一個具有以下屬性的表:EmployeeID(主鍵)、EmployeeName 和 DepartmentID。如果 DepartmentID 依賴於 EmployeeID,但不依賴於 EmployeeName,則存在部分依賴。為了消除這種依賴性,我們將為部門建立一個單獨的表,並將 DepartmentID 和 DepartmentName 儲存在該表中。
第三正規化 (3NF)
第三正規化 (3NF) 是更高一級的規範化。要處於 3NF,一個表必須滿足以下條件:
它必須處於 2NF。
它不能有任何傳遞依賴。傳遞依賴是指一個屬性依賴於另一個不是主鍵的屬性。例如,考慮一個具有以下屬性的表:EmployeeID(主鍵)、EmployeeName 和 ManagerID。如果 ManagerID 依賴於 EmployeeID(主鍵),則不存在傳遞依賴。但是,如果 ManagerID 依賴於 EmployeeName(不是主鍵),則存在傳遞依賴。為了消除這種依賴性,我們將為經理建立一個單獨的表,並將 ManagerID 和 ManagerName 儲存在該表中。
現實生活中的例子
為了更好地理解這些概念,讓我們來看一些函式依賴和規範化的現實生活中的例子。
例子 1
考慮一個線上商店的客戶訂單資料庫。下表儲存有關每個訂單的資訊:
訂單ID |
客戶ID |
產品ID |
數量 |
---|---|---|---|
1 |
1 |
10 |
2 |
2 |
1 |
11 |
1 |
3 |
2 |
10 |
3 |
在此表中,OrderID 是主鍵,CustomerID 和 ProductID 是外部索引鍵。數量屬性依賴於 OrderID,因為它決定了訂單中每種產品的數量。
此表處於 1NF,因為它只包含原子值並且沒有任何重複組。但是,它不處於 2NF,因為數量屬性依賴於 OrderID,而 OrderID 只是主鍵 (OrderID,ProductID) 的一部分。為了消除這種部分依賴性,我們可以為訂單詳細資訊建立一個單獨的表,並將 OrderID、ProductID 和數量儲存在該表中。
訂單ID |
產品ID |
數量 |
---|---|---|
1 |
10 |
2 |
1 |
11 |
1 |
3 |
10 |
3 |
例子 2
考慮一個公司的員工記錄資料庫。下表儲存有關每個員工的資訊:
員工ID |
員工姓名 |
經理ID |
部門ID |
---|---|---|---|
1 |
John Smith |
3 |
1 |
2 |
Jane Doe |
3 |
1 |
3 |
Bob Johnson |
4 |
2 |
4 |
Mary Williams |
NULL |
2 |
在此表中,EmployeeID 是主鍵,ManagerID 和 DepartmentID 是外部索引鍵。ManagerID 依賴於 EmployeeID,因為它決定了員工的經理。DepartmentID 依賴於 ManagerID,因為它決定了員工工作的部門。
此表處於 2NF,因為它處於 1NF 並且沒有任何部分依賴。但是,它不處於 3NF,因為 DepartmentID 依賴於 ManagerID,而 ManagerID 不是主鍵。為了消除這種傳遞依賴性,我們可以為部門建立一個單獨的表,並將 DepartmentID 和 DepartmentName 儲存在該表中。然後,我們可以更新員工表以將 DepartmentID 作為外部索引鍵儲存。
員工ID |
員工姓名 |
經理ID |
部門ID |
---|---|---|---|
1 |
John Smith |
3 |
1 |
2 |
Jane Doe |
3 |
1 |
3 |
Bob Johnson |
4 |
2 |
4 |
Mary Williams |
NULL |
2 |
部門ID |
部門名稱 |
---|---|
1 |
銷售部 |
2 |
市場部 |
結論
函式依賴和規範化是關係資料庫設計中的重要概念。它們透過以邏輯和有效的方式組織資料庫來幫助消除冗餘並確保資料完整性。透過理解這些概念並將它們應用於您的資料庫設計,您可以建立一個高效、有效且易於維護的資料庫。