爲了創建冗餘較小、結構合理的數據庫,設計數據庫時必須遵循必定的規則。在關係型數據庫中這種規則就稱爲範式。範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型數據庫,必須知足必定的範式。html
在實際開發中最爲常見的設計範式有三個:數據庫
1.第一範式(確保每列保持原子性)數據庫設計
第一範式是最基本的範式。若是數據庫表, 每一列屬性都是不可再分的屬性值,確保每一列的原子性,就說明該數據庫表知足了第一範式。性能
第一範式的合理遵循須要根據系統的實際需求來定。好比某些數據庫系統中須要用到「地址」這個屬性,原本直接將「地址」屬性設計成一個數據庫表的字段就行。可是若是系統常常會訪問「地址」屬性中的「城市」部分,那麼就非要將「地址」這個屬性從新拆分爲省份、城市、詳細地址等多個部分進行存儲,這樣在對地址中某一部分操做的時候將很是方便。這樣設計纔算知足了數據庫的第一範式,以下表所示。spa
編號設計 |
姓名htm |
性別blog |
年齡ci |
省份開發 |
城市 |
詳細地址 |
1 |
張三 |
男 |
23 |
北京 |
北京 |
朝陽區新華路23號 |
上表所示的用戶信息遵循了第一範式的要求,這樣在對用戶使用城市進行分類的時候就很是方便,也提升了數據庫的性能。
2.第二範式(不能部分依賴)
第二範式是在知足第一範式的基礎上,要求每列的屬性必須徹底依賴於主關鍵字
學生Id |
姓名 |
身份證號 |
課程Id |
課程名稱 |
1 |
張三 |
12345666 |
1 |
數學 |
1 |
張三 |
12345666 |
2 |
語文 |
好比,一個學生學多門課程,若是設計爲上面一張表,一個學生就有多條數據,這樣子學生信息是重複的,就會形成數據冗餘。咱們應該拆分紅學生信息表,課程信息表以及學生課程關係表,三張表。
學生信息表
學生Id |
姓名 |
身份證號 |
1 |
張三 |
12345666 |
1 |
張三 |
12345666 |
課程信息表
課程Id |
課程名稱 |
1 |
數學 |
2 |
語文 |
學生課程關係表
課程Id |
學生Id |
1 |
1 |
2 |
1 |
3.第三範式(不能存在傳遞依賴)
第三範式是在知足第二範式的基礎上,要求數據表中的每一列數據都和主鍵直接相關,而不能間接相關。
好比設計的學生信息表以下,學校信息和學生Id不是直接相關的。
學生Id |
姓名 |
年齡 |
性別 |
所在學校ID |
學校名稱 |
學校地址 |
1 |
張三 |
25 |
女 |
1001 |
北京大學 |
北京市*** |
拆分以下:
學生信息表
學生Id |
姓名 |
年齡 |
性別 |
所在學校ID |
1 |
張三 |
25 |
女 |
1001 |
學校信息表
所在學校ID |
學校名稱 |
學校地址 |
1001 |
北京大學 |
北京市*** |