前端學資料庫之資料庫設計
資料庫設計共有三大正規化:
第一正規化:無重複的列
第二正規化:屬性完全依賴於主鍵
第三正規化:屬性不能依賴於主屬性
下面將分別對這三個正規化進行詳細介紹
第一正規化
資料庫表中的每一列都是不可分割的基本資料項,同一列中不能有多個值。具體而言,有以下兩條要求
1、每一列屬性都是不可再分的,確保每一列的原子性
2、兩列的屬性相近或相似或一樣,儘量合併屬性一樣的列, 確保不產生冗餘資料
以考勤表設計為例,考勤表用來記錄每天學生的考勤情況
最簡單的情況是,每一天都建立一張表。欄位是每個學生的姓名,列值表示是否簽到。這樣,可以很方便的儲存當天的考勤情況。但是,這也導致了每天都需要在資料庫裡新建一張考勤表。而且,這種做法違反了第一正規化,這張考勤表的欄位的屬性含義都是一樣的,都是記錄學員的考勤情況。因此,這些欄位是需要合併的
design1
更優化的設計是,第一欄位是學生姓名,第二欄位是0101表示`1月1日,第三欄位是0102表示1月2日,以此類推。這種做法,不再需要設計那麼多表,將學生的姓名列合併成了一個姓名列。但是,同樣它沒有遵循第一正規化,1年365天,程式碼除了學生姓名列外,還需要設定365個欄位。而且,這些列的含義都是一樣的,記錄當天的考勤。因此,這些欄位也是需要合併的
下面是優化的情況,把所有的日期合併成一個日期欄位,新增一個考勤狀態欄位,如下所示,完全遵循了第一正規化,沒有重複的列,且每一列都是可拆分的。
總而言之,用第一正規化設計資料庫時,就是分解資料,並將屬性相似的列合併
第二正規化
第二正規化需要遵循以下要求:
1、一個表必須有一個主鍵
2、沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只 依賴於主鍵的一部分
以下面購物車表為例,使用者ID和商品ID構成了商品的主鍵,數量列依賴於使用者購買商品的數量,單價和商品名稱只依賴於商品ID。因此,這張表不滿足第二正規化
優化後,修改如下
第三正規化
非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。第三正規化,相較於第二正規化而言,強調的是直接依賴,而不能是傳遞依賴
關於傳遞依賴,以下面的中獎資訊表為例,中獎金額依賴於中獎等級,而中將等級及依賴於使用者ID,這就是傳遞依賴
design6
要遵循第三正規化,就要消除傳遞依賴
新聞系統
下面嘗試利用三個正規化,來設計新聞系統資料庫。包括以下要點:
1、使用者名稱、密碼、是否是管理員
2、新聞標題、新聞內容、作者、新聞時間、是否上線
3、評論人、評論內容、評論時間、評論源
分別對應使用者表、新聞表和評論表
一般來說,使用者名稱長度不超過20個字元,密碼長度不超過20個字元,新聞標題長度不超過30個字元,新聞內容長度不超過5000個字元,評論內容長度不超過300個字元
使用者表詳細如下
新聞表詳細如下
評論表詳細如下
最後
在設計資料庫時,只需滿足以上三個正規化,就可以設計既合理又滿足需求的資料庫