正規化:normal format,它是英國人 e.f.codd(關聯式資料庫的老祖宗)在上個世紀70年代提出關聯式資料庫模型後總結出來的,正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。
正規化是一種離散數學知識,目的是為了解決一種資料的儲存與優化的問題—儲存資料的儲存之後,凡是能夠通過關係尋找出來的資料,堅決不再重複儲存。終極目標是為了減少資料的冗餘。
目前有跡可尋的8種正規化,依次是:1nf,2nf,3nf,bcnf,4nf,5nf,dknf,6nf,1nf(第一正規化)要求最低,6nf要求最高。
mysql屬於關係型資料庫,存在較大的空間浪費,為了減少空間浪費,需要用到正規化。
但是磁碟空間與效率是相悖的,所以不可能完全依據正規化。故資料庫設計中,常用到前三個正規化:1nf , 2nf , 3nf,其在資料庫設計中有指導意義!
下面所講述的主鍵,可以理解為業務主鍵,而非邏輯主鍵。
在設計表儲存資料的時候,如果表中設計的字段儲存的資料,在取出來使用之前還需要額外的處理(拆分),那麼說表的設計不滿足第一正規化。
第一正規化要求欄位的資料具有原子性。
考慮這樣乙個表:【聯絡人】(姓名,性別,**) ;
如果在實際場景中,乙個聯絡人有家庭**和公司**,那麼這種表結構設計就沒有達到 1nf。
要符合 1nf 我們只需把列(**)拆分,即:【聯絡人】(姓名,性別,家庭**,公司**)。
第二正規化解決部分依賴。
首先前提是 1nf,另外包含兩部分內容,一是表必須有乙個主鍵;二是沒有包含在復合主鍵中的列必須完全依賴於復合主鍵,而不能只依賴於主鍵的一部分–部分依賴。
如 primary key na_nu_pk (name,number) , 那麼表中其他字段完全依賴於na_nu_pk ,不能單獨依賴於name或者number!!
示例如下:
我們知道訂單和產品是多對多的關係,所以單獨乙個order_id or product_id都不足以成為主鍵,選擇復合主鍵(order_id , product_id)。
這裡我們需要注意的是,其他欄位中 discount and amount唯一依賴於order_id ; 而 price and product_name 又唯一依賴於product_id。故,不滿足第二正規化。
可拆分表如下:
另外一種解決思路,可以新增邏輯主鍵 id,唯一標識一行記錄。這樣雖然業務上使用product_id and order_id ,但是資料庫設計上使用 id 作為主鍵。
前提必須滿足第二正規化,另外非主鍵列必須直接依賴於主鍵(注意是業務主鍵),不能存在傳遞依賴。即不能存在:非主鍵列 a 依賴於非主鍵列 b,非主鍵列 b 依賴於主鍵的情況。
第三正規化解決傳遞依賴。
示例如下:
這裡訂單和使用者是多對一的關係,所以 order_id可以唯一確定一條記錄,order_id為主鍵,其他欄位都完全依賴於主鍵,復合2nf。
但是需要注意的是 customer_name 依賴於customer_id , 然後才依賴於order_id ,屬於傳遞依賴,不符合3nf。
可拆分表如下:
第二正規化(2nf)和第三正規化(3nf)的概念很容易混淆,區分它們的關鍵點在於:
2nf:非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分(部分依賴);
3nf:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列(傳遞依賴)。
有時候在設計表的時候,如果一張表有幾個字段是從另外的表中查詢得到,那麼可以獲取想要的資料,但是效率會相應的降低。
這時候,會刻意的在某些表中,不去儲存另外表的主鍵(邏輯主鍵),而是直接儲存想要的資料資訊。這樣就可以在一張表中獲取想要的資料 — 這稱為正規化的逆規範化。
逆規範化會導致資料冗餘,降低了磁碟的利用率。
mysql 反正規化 mysql 正規化和反正規化
第一正規化 1nf 強調的是列的原子性,即列不能夠再分成其他幾列。第二正規化 2nf 首先是 2nf,另外包含兩部分內容一是表必須有乙個主鍵 二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。第三正規化 3nf 首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。...
mysql 正規化化 MySQL 正規化和反正規化
1.第一正規化 1nf 列不能再拆分 原子性,字段不可分 列的資訊 只要是關係型資料庫,就自動滿足1nf 2.第二正規化 2nf 主鍵唯一,且被依賴 在第一正規化基礎上建立的,即滿足第二正規化的必須先滿足第一正規化。要求db表中的每個例項或行必須可以被唯一區分,通常設計乙個主鍵來實現,其他屬性完全依...
mysql的正規化 Mysql正規化與反正規化的利弊
mysql正規化與反正規化的利弊 一 三大正規化 第一正規化 1nf是對屬性的原子性,要求屬性具有原子性,不可再分解 第一正規化是最基本的正規化。如果資料庫表中的所有字段值都是不可分解的原子值,就說明該資料庫表滿足了第一正規化。資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原...