DB World國際中文電子雜誌
作 者:楊先民
審 稿:張智凱
來聊一個資料庫設計的主題,雖然我寫過實戰資料庫設計,但是已經絕版多年,只有在恆逸資訊上課時才會使用到我的書
想想,這本書基本上就是實戰二字,沒有複雜的資料庫設計原理,完全以系統分析的角度來看資料庫設計,除了資料庫設定
2天的課程會提到之外,效能調校這門課也會提到,今天就來簡單介紹一下資料庫正規化的檢查。
一般資料庫會進行正規化檢查,主旨是希望不要有資料重複導致資料不一致,正規代做的愈多,資料表的個數會愈多,上面的
欄位個數會愈少,所以正規化也不會做到第五正規化,通常做到第三正規化就可以了,而我發明了一種判斷正規化的方式:
第一正規化用新增檢查,第二正規化用修改檢查,第三正規化用刪除檢查(我發明的,厲害吧!)
首先,第一正規化用新增檢查,我們看下面的資料
有兩筆資料,分別記錄姓名、產品名稱、數量以及日期,如果 John 買了1個 A商品,發現買不夠,又回過頭來再買一個,就會
造成違反第一正規化,如下圖:
此時,你分不清第1筆和第3筆有何不同,這個我們稱為「重複群」,違反第一正規化,解決方法就是增加一個「訂單編號」即可:
但是,不要以為這樣就結束了,這個是「列的重複群避免」,事實上還有「資料行的重複群」也要注意,也就是說,如果你設計資料庫
很常設定像下面這樣,你也違反了第一正規化:
興趣1、興趣2與興趣3不該被設計出來,使用者需求,如果要求記錄興趣,最多3個興趣,則資料庫設計是需要把興趣實體獨立出來
也就是不能用興趣欄位記錄興趣,而要使用興趣資料表記錄,在資料庫的世界中,只有1 或是多,沒有3這種東西,所以,如果設計
興趣1、興趣2、興趣3,就是對系統分析極為不了解。
第二正規化用修改檢查
來看一下,下面的資料庫設計:
業務和員工資料,之間是1對1的關係,這是恆逸資訊的學員系統,恆逸資訊的學員系統中,業務獨立出來和學生關聯,而和員工之間有1對1的關聯
此時必需把業務的身份證、姓名、性別刪除,不然會重複存放,以後員工若是改姓名的話,除了要更改員工資料表之外,還需要更改業務資料表
一次改兩份,若忘記改,則會有資料不一致的情況產生,這就是第二正規化,使用修改進行資料檢查,如果執行讓不一致產生,會使得資料不正確之外
想維護資料一致性,可能會利用 trigger觸發程序來維護,這樣反而會有效能問題,要記住,資料庫正規化,或是資料庫設計,對資料的新增、修改
刪除是有利的,只是資料表的個數會變多,不利於資料的查詢。
第三正規化用刪除去檢查
我們看一下之前的資料表
如果你把第二筆訂單刪除,則你會永遠遺失這個顧客以及B這個產品的資訊,也就是說第三正規化用刪除去檢查,把一些應該設計出來的實體要設計出來
不然會有資料被你刪沒了的問題。
以上用新增、修改與刪除去做正規化的檢查,你會了嗎?