古詩詞大全網 - 成語故事 - 數據庫,不是第二範式可以是第三範式嗎?

數據庫,不是第二範式可以是第三範式嗎?

第二範式(2NF)和第三範式(3NF)的概念很容易混淆,區分它們的關鍵點在於,2NF:非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的壹部分;3NF:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。

第二範式(2NF):首先是 1NF,另外包含兩部分內容,壹是表必須有壹個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的壹部分。考慮壹個訂單明細表OrderDetail其屬性如下: ? (OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。

因為我們知道在壹個訂單中可以訂購多種產品,所以單單壹個OrderID 是不足以成為主鍵的,主鍵應該是(OrderID,ProductID)。顯而易見 Discount(折扣),Quantity(數量)完全依賴(取決)於主鍵(OderID,ProductID),而 UnitPrice,ProductName 只依賴於 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF的設計容易產生冗余數據。

可以把OrderDetail表拆分為:

OrderDetail(OrderID,ProductID,Discount,Quantity)

Product (ProductID,UnitPrice,ProductName)

來消除原訂單表中UnitPrice,ProductName多次重復的情況。

第三範式(3NF):首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。考慮壹個訂單表Order:? (OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主鍵是(OrderID)。

其中OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity

等非主鍵列都完全依賴於主鍵(OrderID),所以符合 2NF。

不過問題是CustomerName,CustomerAddr,CustomerCity 直接依賴的是

CustomerID(非主鍵列),而不是直接依賴於主鍵,它是通過傳遞才依賴於主鍵,所以不符合 3NF。

通過拆分Order為Order(OrderID,OrderDate,CustomerID)和Customer(CustomerID,CustomerName,CustomerAddr,CustomerCity)從而達到 3NF。

CVVDZVD