天天看點

資料庫設計

[1]設計範式

[2]第一範式

[3]第二範式

[4]第三範式

[5]新聞系統

前面的話

  本文将詳細介紹資料庫設計的相關知識

設計範式

  資料庫設計共有三大範式:

  第一範式:無重複的列

  第二範式:屬性完全依賴于主鍵

  第三範式:屬性不能依賴于主屬性

  下面将分别對這三個範式進行詳細介紹

第一範式

  資料庫表中的每一列都是不可分割的基本資料項,同一列中不能有多個值。具體而言,有以下兩條要求

  1、每一列屬性都是不可再分的,確定每一列的原子性

  2、兩列的屬性相近或相似或一樣,盡量合并屬性一樣的列, 確定不産生備援資料

  以考勤表設計為例,考勤表用來記錄每天學生的考勤情況

  最簡單的情況是,每一天都建立一張表。字段是每個學生的姓名,列值表示是否簽到。這樣,可以很友善的存儲當天的考勤情況。但是,這也導緻了每天都需要在資料庫裡建立一張考勤表。而且,這種做法違反了第一範式,這張考勤表的字段的屬性含義都是一樣的,都是記錄學員的考勤情況。是以,這些字段是需要合并的

資料庫設計

  更優化的設計是,第一字段是學生姓名,第二字段是0101表示`1月1日,第三字段是0102表示1月2日,以此類推。這種做法,不再需要設計那麼多表,将學生的姓名列合并成了一個姓名列。但是,同樣它沒有遵循第一範式,1年365天, 代碼除了學生姓名列外,還需要設定365個字段。而且,這些列的含義都是一樣的,記錄當天的考勤。是以,這些字段也是需要合并的

資料庫設計

  下面是優化的情況,把所有的日期合并成一個日期字段,新增一個考勤狀态字段,如下所示,完全遵循了第一範式,沒有重複的列,且每一列都是可拆分的。

資料庫設計

  總而言之,用第一範式設計資料庫時,就是分解資料,并将屬性相似的列合并

第二範式

  第二範式需要遵循以下要求:

  1、一個表表必須有一個主鍵

  2、沒有包含在主鍵中的列必須完全依賴于主鍵,而不能隻 依賴于主鍵的一部分

  以下面購物車表為例,使用者ID和商品ID構成了商品的主鍵,數量列依賴于使用者購買商品的數量,單價和商品名稱隻依賴于商品ID。是以,這張表不滿足第二範式

資料庫設計

  優化後,修改如下

資料庫設計

第三範式

  非主鍵列必須直接依賴于主鍵,不能存在傳遞依賴。第三範式,相較于第二範式而言,強調的是直接依賴,而不能是傳遞依賴

  關于傳遞依賴,以下面的中獎資訊表為例,中獎金額依賴于中獎等級,而中将等級及依賴于使用者ID,這就是傳遞依賴

資料庫設計

  要遵循第三範式,就要消除傳遞依賴

資料庫設計

  

新聞系統

  下面嘗試利用三個範式,來設計新聞系統資料庫。包括以下要點:

  1、使用者名、密碼、是否是管理者

  2、新聞标題、新聞内容、作者、新聞時間、是否上線

  3、評論人、評論内容、評論時間、評論源

  分别對應使用者表、新聞表和評論表

  一般來說,使用者名長度不超過20個字元,密碼長度不超過20個字元,新聞标題長度不超過30個字元,新聞内容長度不超過5000個字元,評論内容長度不超過300個字元

  使用者表詳細如下

資料庫設計

  新聞表詳細如下

資料庫設計

  評論表詳細如下

資料庫設計

最後

  在設計資料庫時,隻需滿足以上三個範式,就可以設計既合理又滿足需求的資料庫

好的代碼像粥一樣,都是用時間熬出來的

資料庫設計

繼續閱讀