將數據庫放入第三範式(3NF)

第三範式(3NF)是一種數據庫原理,它通過建立在第一範式(1NF)和第二範式(2NF)提供的數據庫規範化原則上來支持數據的完整性。

第三範式要求

數據庫處於第三範式有兩個基本要求:

關於主鍵的依賴

讓我們進一步探討所有列必須依賴主鍵的事實。

如果列的值可以從表中的主鍵和另一列導出,則它違反了3NF。 考慮帶有這些列的Employees表:

LastName和FirstName都只依賴於EmployeeID的值嗎? 那麼,LastName可能取決於名字? 不,因為LastName中固有的東西不會建議FirstName的值。 FirstName可能取決於姓氏嗎? 沒有,因為同樣是真的:無論LastName是什麼,它都不能提供關於FirstName值的提示。 因此,該表是3NF兼容的。

但考慮一下這輛車錶格:

製造商和模型可以從VehicleID派生 - 但是模型也可以從製造商派生,因為車輛模型僅由特定製造商製造。 此表設計不符合3NF標準,因此可能導致數據異常。 例如,您可能在不更新模型的情況下更新製造商,導致不准確。

為了使它符合標準,我們需要將附加依賴列移動到另一個表中,並使用外鍵引用它。 這將導致兩個表格:

車輛表

在下表中,ModelID是Models表的外鍵:

模型表

這張新表格將模型映射到製造商。 如果您想要更新特定於某個模型的任何車輛信息,您可以在此表格中執行此操作,而不是在車輛表格中。

3NF模型中的派生字段

表可能包含派生字段 - 根據表中的其他列計算的字段。 例如,請考慮下面這個小部件訂單表:

總數可以打破3NF合規性,因為它可以通過將單位價格乘以數量而得出,而不是完全依賴主鍵。 我們必須將其從桌面上移除以符合第三種正常形式。

實際上,因為它是派生的,所以最好不要將它存儲在數據庫中。

當執行數據庫查詢時,我們可以簡單地計算它“實時”。 例如,我們以前可能使用此查詢來檢索訂單號和總計:

SELECT OrderNumber,Total FROM WidgetOrders

我們現在可以使用以下查詢:

SELECT OrderNumber,UnitPrice * Quantity AS總數FROM WidgetOrders

在不違反規範化規則的情況下達到相同的結果。