第一范式( 1NF ):在關系模式 R 中的每一個具體關系 r 中,如果每個屬性值都是不可再分的最小數據單位,則稱 R 是屬于第一范式的關系。

第二范式( 2NF ):如果關系模式 R U F )中的所有非主屬性都完全依賴于任意一個候選關鍵字,則稱 R 是屬于第二范式的。

第三范式( 3NF ):如果關系模式 R U F )中的所有非主屬性對任何候選關鍵字都不存在傳遞信賴,則稱 R 是屬于第三范式的。



第一范式是關系數據庫的最小要求

比如

?

姓名 ??????????????????? 性別 ?????????? ???????? 身高

Billy?????????? ???????? Male? ???????????? 180CM

這就是第一范式 .

如果改成

??????????????????????????????????????????????????????? ???? ???????? ?????????????????? ????

姓名 ??????????????????? 性別 ??????????????????? 胸圍 ???????? 臀圍 ???????? 腰圍

這個就不是第一范式了 .

?

第二范式說通俗一點就是不存在部分依賴 , 舉例如下 :

促銷員的銷量表 , 字段為促銷員 OID, 產品 OID, 產品顏色 , 產品重量

業務上主鍵應該為 促銷員 OID 和產品 OID

但是產品顏色和產品重量顯然依賴于產品 OID, 不能因為某個促銷員長得漂亮產品顏色就艷麗一些 .

所以產品顏色和產品重量就部分依賴于候選主鍵促銷員 OID 和產品 OID, 這樣就滿足第二范式 .

?

?

第三范式說通俗一點就是不存在傳遞依賴 . 舉例如下 :

促銷員表 , 字段為促銷員 OID, 所屬銷售部 OID, 銷售部地址 .

那么促銷員 OID 是業務主鍵 , 由于只有一個字段做主鍵 , 所以肯定不存在部分依賴

但是這個存在傳遞依賴

促銷員 OID 決定了所屬銷售部 OID, 而所屬銷售部又能決定銷售部地址 .

所以銷售部地址間接依賴于銷售部 OID

于是存在傳遞依賴 .

?

?

由于我們采用 OID 一個字段做表的主鍵 , 所以肯定滿足第二范式 . 至于滿不滿足第三范式就要分析一下了 .

但是有些情況下是需要保存歷史信息的

比如銷售部的地址變動了

這些另當別論 , 打破第三范式就好了

另外聯合查詢的性能損失很大 , 有時候破壞范式來換取報表的運行效率也是值得的 .