Mysql 正規化入門

2022-10-09 20:03:15 字數 1889 閱讀 3997

為什麼需要資料規範化

設計關係型資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。

目前關係型資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、巴斯-科德正規化(bcnf)、第四正規化(4nf)和第五正規化(5nf,又稱完美正規化)。一般來說,資料庫只需要滿足第三正規化就行了。

第一正規化是最基本的正規化。如果資料庫表中的所有字段值都是不可分解的原子值,就說明該資料庫表滿足了第一正規化。第一正規化的合理遵循需要根據系統的實際需求來定。比如下面的表中「使用者資訊」這一字段就可拆分為,姓名,**,這樣設計才算滿足了資料庫的第一正規化

第二正規化在第一正規化的基礎之上更進一層。第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在乙個資料庫表中,乙個表中只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中。

上表滿足第一正規化,即每個字段不可再分,但是這張表設計得並不好,或者說,這張表的設計並不滿足第二正規化。因為這張表裡面描述了兩件事情:學生資訊、課程資訊,"學分"完全依賴於"課程名稱"、"姓名"與"年齡"完全依賴於"學號"。

這麼做的後果是:

1、資料冗餘:同一門課程由n個學生選修,"學分"重複n-1次;同乙個學生選修了m門課程,姓名和年齡重複m-1次

2、更新異常:若調整了某門課程的學分,資料表中所有行的"學分"值都需要更新,否則會出現同一門課程學分不同的情況

3、插入異常:假設要開一門新課程,暫時沒有人選修,那麼由於沒有"學號"關鍵字,"課程"與"學分"也無法記錄入資料庫

4、刪除異常:假設一批學生已經完成課程的選修,這些選修記錄就應該從資料庫表中刪除。但是,與此同時,"課程"和"學分"也被刪除了,顯然,這最終可能會導致插入異常

所以,此表的結構必須修改,修改後如下:

增加了表,將學生資訊與課程資訊通過一張中間表關聯,很好地解決了上面的幾個問題,這就是第二正規化的中心----保證一張表只講一件事情。

滿足第三正規化,必須先滿足第二正規化。簡而言之,第三正規化要求乙個資料庫表中不包含已在其它表中已包含的非主鍵字段。就是說,表的資訊,如果能夠被推導出來,就不應該單獨的設計乙個欄位來存放(能盡量外來鍵join就用外來鍵join)。

即滿足第二正規化前提,如果某一屬性依賴於其他非主鍵屬性,而其他非主鍵屬性又依賴於主鍵,那麼這個屬性就是間接依賴於主鍵,這被稱作傳遞依賴於主屬性。 所謂傳遞函式依賴指的是如果存在"a-->b-->c"的決定關係,則c傳遞函式依賴於a。也就是說表中的字段和主鍵直接對應不依靠其他中間字段,說白了就是,決定某字段值的必須是主鍵。

比如乙個資料庫表結構中有字段:「學號,姓名,年齡,學院,學院**,學院地點」 。

可以看出,"姓名"、"年齡"、"學院"和主鍵"學號"直接關聯,但是"學院地點"、"學院**"卻不直接和主鍵"學號"相關聯,和"學院**"直接相關聯的是"學院",如果表結構這麼設計,同樣會造成和第二正規化一樣的資料冗餘、更新異常、插入異常、刪除異常的問題。

我們應該修改為:學院表:「學院,學院地點,學院**」   

學生表:「學號,姓名,年齡,學院」

通過學院作為外來鍵關聯兩個表。

mysql 反正規化 mysql 正規化和反正規化

第一正規化 1nf 強調的是列的原子性,即列不能夠再分成其他幾列。第二正規化 2nf 首先是 2nf,另外包含兩部分內容一是表必須有乙個主鍵 二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。第三正規化 3nf 首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。...

MySQL快速入門08 三大正規化

為了建立冗餘較小 結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計乙個結構合理的關係型資料庫,必須滿足一定的正規化。在實際開發中最為常見的設計正規化有三個 第一正規化是最基本的正規化。如果資料庫表中的所有字段值都是不可...

mysql 正規化化 MySQL 正規化和反正規化

1.第一正規化 1nf 列不能再拆分 原子性,字段不可分 列的資訊 只要是關係型資料庫,就自動滿足1nf 2.第二正規化 2nf 主鍵唯一,且被依賴 在第一正規化基礎上建立的,即滿足第二正規化的必須先滿足第一正規化。要求db表中的每個例項或行必須可以被唯一區分,通常設計乙個主鍵來實現,其他屬性完全依...