數據庫三大範式

數據庫三大範式

分類: 數據庫 593人閱讀 評論(0) 收藏 舉報
 

第一範式1NF):

是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。

第二範式2NF):

要求數據庫表中的每個實例或行必須可以被惟一地區分,數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴(部分函數依賴指的是存在組合關鍵字中的某些字段決定非關鍵字段的情況),也即所有非關鍵字段都完全依賴於任意一組候選關鍵字。

第三範式3NF):

要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息,在第二範式的基礎上,數據表中如果不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三範式。

上述三大範式說的有點官話,聽不太明白,下面我就簡單的說說這三大範式。

第一範式,確保每列的原子性。

例如,數據庫中的一列一般不能是地址姓名,而應該將其分成倆列,地址和姓名。再如,地址是國家和城市組成的話,一般應該將地址再細分爲,國家和地址,不能籠統的寫地址。

第二範式指的是,在滿足第一範式的條件下,並且除了主鍵以外的其他列,都依賴於該主鍵,也就是要求每個表中只描述一件事情。例如:

 

 如上圖所示,第一個Orders裏的四個字段,講述的是倆個事情(訂單和產品),也就是說,產品編號和產品價格並不依賴於訂單,所以應該分成倆個表,這樣就符合第二範式的要求。

第三範式要求:在滿足第二範式的條件下,並且除了主鍵以爲的其他列都不傳遞依賴於主鍵列

  

如上圖所示,第一個Orders裏的訂購日期和顧客編號依賴於主鍵訂單編號,但是顧客姓名卻是依賴於顧客編號然後再和訂單編號。所以應該改成第二個Orders的樣式,就滿足第三範式了。數據庫的三大範式,可以使數據庫的的設計更加規範,避免數據冗餘!

關於數據庫三大範式有兩種說法,一是:
1.字段不可分。
2.有主鍵,非主鍵字段依賴主鍵。
3.非主鍵字段不能相互依賴。
另外一種說法是:
第一範式: 
1、內容相似的數據列必須消除(消除的辦法就是再創建一個數據表來存放他們,建立關聯關係) 
2、必須爲每一組相關數據分別創建一個表 
3、每條數據記錄必須用一個主鍵來標示 
第二範式: 
1、只要數據列裏面的內容出現重複,就意味着應該把表拆分爲多個表 
2、拆分形成的表必須用外鍵關聯起來。 
第三範式: 
1、與主鍵沒有直接關係的數據列必須消除(消除的辦法就是再創建一個表來存放他們) 
◆ 第一範式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。 
考慮這樣一個表:【聯繫人】(姓名,性別,電話) 
如果在實際場景中,一個聯繫人有家庭電話和公司電話,那麼這種表結構設計就沒有達到 1NF。要符合 1NF 我們只需把列(電話)拆分,即:【聯繫人】(姓名,性別,家庭電話,公司電話)。1NF 很好辨別,但是 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。 
第二範式(2NF)和第三範式(3NF)的概念很容易混淆,區分它們的關鍵點在於,2NF:非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分;3NF:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。

發佈了41 篇原創文章 · 獲贊 0 · 訪問量 2155
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章