設計關係型資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。
目前關係型資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。一般來說,資料庫只需要滿足第三正規化就行了。
第一正規化:保證每列的原子性
第一正規化是最基本的正規化。如果資料庫表中的所有字段值都是不可分解的原子值,就說明該資料庫滿足了第一正規化。
第一正規化需要根據系統的實際需求來定,比如有一張使用者資訊表:
一般來說"住址"設計成乙個欄位就行,但是如果經常訪問"住址"中城市的部分,那麼就非要將"住址"這個屬性重新拆分為"省份"、"城市"、"位址"等多個部分進行儲存,這樣在對"住址"中某一部分進行操作的時候將非常方便。這麼設計才算滿足了資料庫的第一正規化,修改之後的表結構如圖:
第二正規化:保證一張表只描述一件事情
這是通俗的說法,用第二正規化的定義描述第二正規化,說的是在滿足第一正規化的基礎上,資料庫表中不存在非關鍵字段對任一候選關鍵字段的部分函式依賴,也即所有非關鍵字段都完全依賴於任一組候選關鍵字。
看不懂是嗎,沒關係,我也看不懂,下面舉乙個例子,有一張表如下圖:
上表滿足第一正規化,即每個字段不可再分,但是這張表設計得並不好,或者說,這張表的設計並不滿足第二正規化。因為這張表裡面描述了兩件事情:學生資訊、課程資訊,"學分"完全依賴於"課程名稱"、"姓名"與"年齡"完全依賴於"學號"。這麼做的後果是:
1、資料冗餘:同一門課程由n個學生選修,"學分"重複n-1次;同乙個學生選修了m門課程,姓名和年齡重複m-1次
2、更新異常:若調整了某門課程的學分,資料表中所有行的"學分"值都需要更新,否則會出現同一門課程學分不同的情況
3、插入異常:假設要開一門新課程,暫時沒有人選修,那麼由於沒有"學號"關鍵字,"課程"與"學分"也無法記錄入資料庫
4、刪除異常:假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,"課程"和"學分"也被刪除了,顯然,這最終可能會導致插入異常
所以,此表的結構必須修改,修改後如下:
增加了表,將學生資訊與課程資訊通過一張中間表關聯,很好地解決了上面的幾個問題,這就是第二正規化的中心----保證一張表只講一件事情。
第三正規化----保證每列都和主鍵直接相關
第三正規化又和第二正規化相關,用第三正規化的定義描述第三正規化就是,資料庫表中如果不存在非關鍵字段任一候選關鍵字段的傳遞函式依賴則符合第三正規化,所謂傳遞函式依賴指的是如果存在"a-->b-->c"的決定關係,則c傳遞函式依賴於a。也就是說表中的字段和主鍵直接對應不依靠其他中間字段,說白了就是,決定某字段值的必須是主鍵。
舉個例子,看一下如下的表結構:
第三正規化和第二正規化有點像,從這張資料庫表結構中可以看出,"姓名"、"年齡"、"學院"和主鍵"學號"直接關聯,但是"學院地點"、"學院**"卻不直接和主鍵"學號"相關聯,和"學院**"直接相關聯的是"學院",如果表結構這麼設計,同樣會造成和第二正規化一樣的資料冗餘、更新異常、插入異常、刪除異常的問題。
修改之後的表結構如下圖:
同樣,這麼設計表結構將合理地多,也解決了前面的四個問題。
後記
定理是死的,人是活的,在前人給我們總結出這些正規化的前提下,使用這些正規化靈活地應用到實際需求中,才是最重要的。
資料庫三正規化 - 五月的倉頡 -
原出處:
mysql三正規化 MySQL資料庫三正規化
設計關係型資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。目前關係型資料庫有六種正規化 第一正規化 1nf 第二正規化 2nf 第三正規化 3nf 巴斯 科德正規化 bcnf 第四正規化 4nf 和第五正...
MySQL 資料庫三正規化
資料庫三正規化 1 第一正規化 1nf 定義 每一列都是不可分割的原子資料項 強調的是列的原子性 例 乙個表 聯絡人 姓名,性別,如果在實際場景中,乙個聯絡人有家庭 和公司 那麼這種表結構設計就沒有達到1nf。解決方案 要符合1nf我們只需把列 拆分,即 聯絡人 姓名,性別,家庭 公司 1nf很好辨...
mysql資料庫的正規化 MySQL資料庫三大正規化
第一正規化 1nf 所謂第一正規化 1nf 是指在關係模型中,對域新增的乙個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化 1nf 表中的每個域值只能是實體的...