第三範式(3NF)是一種數據庫原理,它通過建立在第一範式(1NF)和第二範式(2NF)提供的數據庫規範化原則上來支持數據的完整性。
第三範式要求
數據庫處於第三範式有兩個基本要求:
關於主鍵的依賴
讓我們進一步探討所有列必須依賴主鍵的事實。
如果列的值可以從表中的主鍵和另一列導出,則它違反了3NF。 考慮帶有這些列的Employees表:
- 員工ID
- 名字
- 姓
LastName和FirstName都只依賴於EmployeeID的值嗎? 那麼,LastName可能取決於名字? 不,因為LastName中固有的東西不會建議FirstName的值。 FirstName可能取決於姓氏嗎? 沒有,因為同樣是真的:無論LastName是什麼,它都不能提供關於FirstName值的提示。 因此,該表是3NF兼容的。
但考慮一下這輛車錶格:
- VehicleID
- 生產廠家
- 模型
製造商和模型可以從VehicleID派生 - 但是模型也可以從製造商派生,因為車輛模型僅由特定製造商製造。 此表設計不符合3NF標準,因此可能導致數據異常。 例如,您可能在不更新模型的情況下更新製造商,導致不准確。
為了使它符合標準,我們需要將附加依賴列移動到另一個表中,並使用外鍵引用它。 這將導致兩個表格:
車輛表
在下表中,ModelID是Models表的外鍵:
- VehicleID
- 生產廠家
- ModelID
模型表
這張新表格將模型映射到製造商。 如果您想要更新特定於某個模型的任何車輛信息,您可以在此表格中執行此操作,而不是在車輛表格中。
- ModelID
- 生產廠家
- 模型
3NF模型中的派生字段
表可能包含派生字段 - 根據表中的其他列計算的字段。 例如,請考慮下面這個小部件訂單表:
- 訂單號
- 顧客號碼
- 單價
- 數量
- 總
總數可以打破3NF合規性,因為它可以通過將單位價格乘以數量而得出,而不是完全依賴主鍵。 我們必須將其從桌面上移除以符合第三種正常形式。
實際上,因為它是派生的,所以最好不要將它存儲在數據庫中。
當執行數據庫查詢時,我們可以簡單地計算它“實時”。 例如,我們以前可能使用此查詢來檢索訂單號和總計:
SELECT OrderNumber,Total FROM WidgetOrders我們現在可以使用以下查詢:
SELECT OrderNumber,UnitPrice * Quantity AS總數FROM WidgetOrders在不違反規範化規則的情況下達到相同的結果。