MySQL 資料庫三正規化

2022-04-10 01:43:18 字數 1653 閱讀 8776

資料庫三正規化

(1)第一正規化(1nf):

定義:每一列都是不可分割的原子資料項(強調的是列的原子性);

例:乙個表:【聯絡人】(姓名,性別,**)

如果在實際場景中,乙個聯絡人有家庭**和公司**,那麼這種表結構設計就沒有達到1nf。

解決方案:

要符合1nf我們只需把列(**)拆分,即:【聯絡人】(姓名,性別,家庭**,公司**)。1nf很好辨別,但是2nf和3nf就容易搞混淆。

(2)第二正規化(2nf):

定義:有主鍵,要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性;(強調的是唯一性)

例:乙個訂單明細表:【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多次重複的情況。

(3)第三正規化(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:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。

mysql三正規化 MySQL資料庫三正規化

設計關係型資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。目前關係型資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴斯 科德正規化 bcnf 第四正規化 4nf 和第五正...

MySQL資料庫三正規化

設計關係型資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。目前關係型資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴斯 科德正規化 bcnf 第四正規化 4nf 和第五正...

mysql資料庫的正規化 MySQL資料庫三大正規化

第一正規化 1nf 所謂第一正規化 1nf 是指在關係模型中,對域新增的乙個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化 1nf 表中的每個域值只能是實體的...