資料庫三正規化
(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 表中的每個域值只能是實體的...