〖學習筆記〗關聯式資料庫正規化

資料庫三大正規化(1NF ~ 3NF)

* 第一正規化:定義主鍵值(primary key或unique key)以及剔除重複資料,來打好資料表的基礎* 第二正規化:符合第一正規化,釐清資料表裡面每一個資料欄位的關係,把部分相依的資料另開表格作儲存,來確保每一非鍵值欄位必須「完全功能相依」(Functional Dependency)於主鍵* 第三正規化:符合第二正規化,且每一個非鍵值欄位都必須不得和其他非鍵值欄位產生相關性

在關聯式資料的世界裡,DB table 就像是一連串複雜的 Excel 表格,去做互相索引的動作,來關聯出整個網站架構上的資料。但倘若資料庫內的資訊雜亂無章,或是一堆重複無意義的資料,不僅對編輯上會造成負擔外,更會造成系統效能的增加。

這時候就需要正規化了,目的是減少資料庫中資料冗餘,增進資料的一致性,並增加資料查找或新增的效能,避免系統儲存空間上的浪費。其中最常聽到的就是第一到第三正規化(1NF ~ 3NF)。

假設今天有一個表格長這樣,這裡有些欄位 pay 和 item 欄位包含了兩個以上的數值或內容,儘管有逗號做分隔,但對電腦而言,這樣的方式還是無法準確的區分。

第一正規化 — 把資料表攤開變成單一值,並加入唯一值

使用每一筆記帳的 順序id來當作主鍵值,只要是每一個需要登進帳本的項目,就必須把 id累加上去,這樣既不重複,也具備識別性,若是在系統設計上,可以讓他成為一個自動疊加的純數字。

這樣不管是對其中一筆資料新增、查找或刪除,都可以依據 id來做出識別和溝通。

核心概念:
定義主鍵值(primary key)以及單一值

但隨著紀錄的筆數變多,Excel的表格也會隨之越長越肥大,很多欄位其實內容都一樣,卻還是要一直複製貼上才整齊。資料庫也是一樣,冗餘的資料就出現了。對系統而言,重複且不具重點的資料,只是浪費空間罷了。

許多欄位如 item、user、 shop 和 shop_address 等欄位都開始出現重複的現象,且表格的易讀性也開始降低。

第二正規化 — 拆分資料表,減少冗的資料

在Shop 表中的 id是 Shop 表中的 primary key 主鍵(PK),但是對應過去的 user_id在 Order 表中則為 foreign key 外鍵(FK)

一個Table表中只能有一個主鍵,但是可以有很多外鍵。主鍵與外鍵的配對就形成了Relational 關聯性 ,所以才稱作Relational database 關聯性資料庫。

核心概念 : 
釐清資料表裡面每一個資料欄位的關係,把不重要(部分相依)的資料另開表格作儲存,而這樣的做法,也正是關聯式資料庫的核心觀念,透過關聯的方式,來降低表內資料的重複性

第三正規化 — 可以邏輯推斷出來就不要多加欄位

這裡就違反了第三正規化(3NF),因為total 其實是由 price x quantity 來的,移除掉也不會影響到功能實現,並且也跟 PK 鍵無直接關係,這就是所謂的遞移相依(Transitive Dependency)。

如果不小心漏看了quantity 與 total 之間的關係,就有可能造成資料的不一致。第三正規化(3NF)的實現就可以避免這個問題。

結論

正規化最重要的目的,就是重新整裡關聯式資料庫的表格及欄位,來降低資料重複及減少相依性的過程。而這個過程中,對於減少資料庫空間上的浪費,以及強化維護與操作上的效率和正確性,都有很大的幫助。

另外值得一提的就是,基本上執行正規化就等於是原本的Table中的column會變少,而用新的Table 表來表示相關性,故一定會增加Join的次數與SQL指令的複雜度。

參考資料:

「不是工程師」關聯式資料庫正規化是什麼? 先從第一正規化(1NF)開始吧!(database normalization, Primary Key — PK) https://progressbar.tw/posts/265

--

--

Shih Ting, Tai

Enhance overall happiness by improving human-computer interaction to benefit people.