數據庫範式

cpp軟件架構獅 2018-12-08

為什麼要用範式

我們在學習關係型數據庫的時候一定有感覺,關係數據庫不就是一個二維表格嗎,那麼數據庫有什麼用?

數據庫看上去像一個表格,其實不然,比如如下的訂單表,一個訂單號X2001對應一個用戶,但是還對應了兩行產品,非常不規範。

數據庫範式

要想把這個表規範化,可以使用範式。引入範式的主要目的在於:解決冗餘的問題

第一範式

那麼如何規範化呢?可以拆分成兩個表格。

一個是訂單表

數據庫範式

一個訂單號可以唯一的確定一行

一個是細節表,一個訂單號+產品編碼才可以唯一的確定一行。

數據庫範式

拆分以後就可以保證一個單元格只有一個值了

所以我們說訂單表的主鍵是 (訂單號), 細節表的主鍵是(訂單號,產品編碼), 這是一個複合主鍵

第二範式

再看看訂單細節表, 產品名稱和單價 實際上並不依賴於 訂單號。

如果想添加一個新的產品, 你會發現沒法放入這張表, 因為沒有訂單號!

數據庫範式

所以還需要再次拆分。

數據庫範式

拆分以後,表4.1訂單細節表的主鍵還是(訂單號,產品編碼),但是剩下的屬性(數量)肯定是完全依賴於主鍵的。

表4.2產品表也類似,主鍵是產品編碼,剩下的屬性都依賴於產品編碼

所有屬性都依賴於主鍵的情況就是第二範式

第三範式

我們再回過頭來看一下表格3 訂單表,它的主鍵是訂單號,所有的屬性都依賴於主鍵,已經是第二範式。 但是我們發現,訂單號能決定用戶ID,用戶ID能決定用戶名稱,這就出現了依賴傳遞:訂單號->用戶ID->用戶名稱

數據庫範式

那麼可以再拆分

數據庫範式

沒有傳遞依賴了, 我們可以稱之為 第三範式

為了滿足範式要求,需要把一張大表拆分開,到時候查詢豈不是非常麻煩?是的,需要將這些表Join起來,如果數據量大的時候,連接非常耗時。有時我們需要違反範式,做點數據冗餘。

總結

總結一下:

  • 第一範式:字段是不可再分的,也就是不存在一個字段中存在兩個及以上的情況。
  • 第二範式:所有屬性都依賴於主鍵,其他不相關的都拆分出去了。
  • 第三範式:不存在某個列不依賴於非主鍵的列,沒有依賴傳遞了

參考

主要改編自張大胖學數據庫

相關推薦

推薦中...