一、正規化
正規化的英文名稱是normal form,它是英國人e.f.codd(關聯式資料庫的老祖宗)在上個世紀70年代提出關聯式資料庫模型後總結出來的。正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。目前有跡可尋的共有8種正規化,依次是:1nf,2nf,3nf,bcnf,4nf,5nf,dknf,6nf。通常所用到的只是前三個正規化,即:第一正規化(1nf),第二正規化(2nf),第三正規化(3nf)。
第一正規化(1nf)
第一正規化其實是關係型資料庫的基礎,即任何關係型資料庫都是符合第一正規化的。簡單的將第一正規化就是每一行的各個資料都是不可分割的,同一列中不能有多個值,如果出現重複的屬性就需要定義乙個新的屍實體。
下面資料庫便不符合第一正規化:+------------+-------------------+
| workername | company |
| john | bytedance,tencent |
| mike | tencent |
上面描述的資料所表達的意思是,mike在tencent工作,而john同時在bytedance和tencent工作(假設這是可能的)。但是這種表達方式並不符合第一正規化,即列的資料必須是不可分的,要滿足第一正規化,必須是下面的這種形式:+------------+-----------+
| workername | company |
| mike | tencent |
| john | bytedance |
| john | tencent |
第二正規化(2nf)
首先,乙個資料庫要滿足第二正規化必須要先滿足第一正規化。
我們先看乙個**:+----------+-------------+-------+
| employee | department | head |
| jones | accountint | jones |
| smith | engineering | smith |
| brown | accounting | jones |
| green | engineering | smith |
這個表描述了被僱傭者,工作部門和領導的關係。這個表所表示的關係在現實生活中是完全可能存在的,現在讓我們考慮乙個問題,如果brown接任accounting部門的領導,我們需要怎樣對錶進行修改?這個問題將會變得非常麻煩,因為我們會發現資料都耦合在一起了,你很難找到乙個很好的能唯一確定每一行的判斷條件來執行你的update語句。而我們把能夠唯一表示資料庫中表的一行的資料成為這個表的主鍵。 因此,沒有主鍵的表是不符合第二正規化的,也就是說符合第二正規化的表需要規定主鍵。
因此我們為了使上面的表符合第二正規化,需要將它拆分為兩個表:+----------+-------------+
| employee | department |
| brown | accounting |
| green | engineering |
| jones | accounting |
| smith | engineering |
| department | head |
| accounting | jones |
| engineering | smith |
在這兩個表中,第乙個表的主鍵為employee,第二個表的主鍵為department。在這種情況下,完成上面的問題就顯得非常簡單了。
第三正規化(3nf)
乙個關係型資料庫要滿足第三正規化必須要先滿足第二正規化。
將第三正規化前,我們同樣先看兩個表:+-----------+-------------+---------+-------+
| studentid | studentname | subject | score |
| 1 | mike | math | 96 |
| 2 | john | chinese | 85 |
| 3 | kate | history | 100 |
| subjectid | studentid | score |
| 101 | 1 | 96 |
| 111 | 3 | 100 |
| 201 | 2 | 85 |
上面的兩個**的主鍵分別為studentid和subjectid,很顯然兩個表都符合第二正規化。
但是我們會發現這兩個表有重複冗餘的資料score。因此第三正規化就是要消除冗餘的資料,具體到上面的情況,就是兩個表只有乙個能夠存在score這一列資料。那麼怎麼將這兩個表聯絡起來呢,這裡就出現了外來鍵。如果兩個表中有冗餘重複的列,而且這個表中的乙個非主鍵列在另乙個表中是主鍵,那麼我們為了消除冗餘列可以把這個非主鍵列作為聯絡兩個表的橋梁,也就是外來鍵。 通過觀察可以發現,studentid在第乙個表中是主鍵,在第二個表中是非主鍵,所以他就是第二個表的外來鍵。因此上述情況我們有了以下符合第三正規化的寫法:+-----------+-------------+---------+
| studentid | studentname | subject |
| 1 | mike | math |
| 2 | john | chinese |
| 3 | kate | history |
| subjectid | studentid | score |
| 101 | 1 | 96 |
| 111 | 3 | 100 |
| 201 | 2 | 85 |
可以發現在設定了外來鍵之後,第乙個表即使刪除了score列,也可以通過studentid在第二個表中查詢到相應的score的值,這樣即消除了資料的冗餘,又不會影響查詢,滿足第三正規化。
二、正規化的優點和缺點
正規化的優點正規化化的更新操作通常要比反正規化化要快。
當資料較好地正規化化時,就只有很少或者沒有重複的資料,所以只需要修改更少的資料。
正規化化的表通常都比較小,可以更好的放在記憶體中,所以執行操作會更快。
很少有多餘的資料意味著檢索列表資料時更少需要distinct或者group by語句。
正規化的缺點
正規化化的缺點就是通常需要關聯。稍微複雜一些的查詢語句在符合正規化的資料庫上都可能需要至少一次關聯,也許更多,這不但代價昂貴,也可能使一些索引策略無效。
MySQL屬於第幾正規化 mysql 之 三大正規化
前言 在使用mysql中對錶的設計,我們需要遵循三大正規化。設計關係型資料庫時,遵從不同的規範和要求,設計出合理的關係型資料庫,這些不同的規範和要求稱為不同的正規化。各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。若要遵循後面的正規化必須遵循之前的正規化。1nf 2nf 3nf 正規化分類 目前關...
怎樣判斷乙個函式依賴集屬於第幾正規化
判斷乙個函式依賴集屬於第幾正規化 首先,要懂得以下幾條概念 1.完全函式依賴 如果x y,且對於任意乙個x的子集x 都有x y,則稱y完全函式依賴於x 2.部分函式依賴 y不完全函式依賴於x 總之,如果乙個屬性y既依賴於x,也依賴於x的某個子集,則說明y部分依賴於x 3.傳遞函式依賴 如果x y,y...
mysql 反正規化 mysql 正規化和反正規化
第一正規化 1nf 強調的是列的原子性,即列不能夠再分成其他幾列。第二正規化 2nf 首先是 2nf,另外包含兩部分內容一是表必須有乙個主鍵 二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。第三正規化 3nf 首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。...