MySQL 三大正規化

2022-07-02 15:18:10 字數 1925 閱讀 3063

設計資料庫時,通常需要遵從不同的規範,設計出合理的資料庫,減少資料冗餘,而這些規範稱為資料庫正規化,一般來說,只需要實現前三大正規化即可

下面說說我對這三大正規化的理解:

以下表為例:

別小看這個表,這個表就其實已經算是符合了三大正規化哦。

第一正規化,是針對於資料表的列的規範,即資料表的每一列都是不可分割的原子資料項,而不能是陣列,集合,記錄等非原子資料項,說白了就是,不能把好幾列的資料合在一起,且每一列的資料都是不可分割的,看看兩個錯誤的例子:

將幾列資料合在一起=>錯誤

原子資料項被分割=>錯誤

第二正規化,基於第一正規化,非碼屬性必須完全依賴碼,即非主鍵資料必須依賴主鍵資料

「碼」(主鍵)是資料表用來唯一區分例項或記錄的資料項,若沒有,可人為新增。

對於第一正規化針對列來說,第二正規化則是針對於行的規範。先說說他的作用吧,從作用反推他的實現。

他的作用就是讓表的每一行都不會一樣,以便我們可以識別任何一行記錄。那怎麼實現這個作用呢?答案是給每一行分配乙個序號,或者以每一行裡肯定不會和其它行一樣的資料項來識別,這就要求其它「可能「會一樣的資料完全依賴於此序號(資料項)。

看看錯誤例項:

第三正規化,其實是第二正規化的子集,也是基於第一正規化,任何非碼屬性不依賴其他非碼屬性

這個比較抽象,還是看圖說話好了,下圖是錯誤示例

咳咳,其實我還是只單身狗,沒有交過這麼多女票的,美女快來把我領回家。

回歸主題,這個表有沒有違反第二正規化呢?沒有,( ⊙ o ⊙ )是的,並沒有。

這個表其實存在著一種依賴關係—「傳遞依賴「,girlfriend依賴著girlfriend_id,,而girlfriend_id依賴著id,如此即沒有違反第二正規化了。

但是,他就違反了第三正規化,任何非碼屬性不依賴其他非碼屬性,通俗地講,就是不能存在這種傳遞依賴關係,規範要我們怎麼做呢?將上表拆分成兩個表,如下:

表一

表二兩表之間通過grilfriend_id進行關聯

如此,便符合第三正規化了。

MYSQL三大正規化

第一正規化 確保每列的原子性.如果每列 或者每個屬性 都是不可再分的最小資料單元 也稱為最小的原子單元 則滿足第一正規化.例如 顧客表 姓名 編號 位址 其中 位址 列還可以細分為國家 省 市 區等。第二正規化 在第一正規化的基礎上更進一層,目標是確保表中的每列都和主鍵相關.如果乙個關係滿足第一正規...

MySQL三大正規化

資料庫 的三個正規化 指的是什麼呢?即 屬性唯一,記錄唯一,表唯一。下面我們用一張關係圖來三者之間的關係。第一正規化 1nf 資料庫表中的字段的 屬性都是單一的,不可再分。這個單一屬性由哪些型別組成呢?主要是基本型別構成,包括整型 實數 字元型 邏輯型 日期型等。第二正規化 2nf 資料庫表 中不存...

mysql三大正規化

1.第一正規化 確保資料表中每列 字段 的原子性。如果資料表中每個欄位都是不可再分的最小資料單元,則滿足第一正規化。例如 user使用者表,包含欄位id,username,password 2.第二正規化 在第一正規化的基礎上更進一步,目標是確保表中的每列都和主鍵相關。如果乙個關係滿足第一正規化,並...