關於三個範式我的總結:數據庫
- 第一範式:屬性不可才分,好比:電話(手機和座機),最好分紅倆屬性
- 第二範式:列裏面的一個項不能僅僅依賴於另外一個,或部分項,這時須要拆表
- 第三範式:知足第二範式,拆表後,本表僅保留其餘相關表的主鍵便可,這樣消除傳遞依賴
基礎概念數據庫設計
- 實體:現實世界中客觀存在並能夠被區別的事物
- 屬性:教科書上解釋爲:「實體所具備的某一特性」
- 元組:表中的一行就是一個元組
- 份量:元組的某個屬性值
- 碼:表中能夠惟一肯定一個元組的某個屬性(或者屬性組)
- 若是這樣的碼有不止一個,那麼你們都叫候選碼,咱們從候選碼中挑一個出來作老大,它就叫主碼。
- 全碼:若是一個碼包含了全部的屬性,這個碼就是全碼。
- 主屬性:一個屬性只要在任何一個候選碼中出現過,這個屬性就是主屬性。
- 非主屬性:與上面相反,沒有在任何候選碼中出現過,這個屬性就是非主屬性。
- 外碼:一個屬性(或屬性組),它不是碼,可是它表明別的表的碼,它就是外碼。
範式:函數
- 範式包含關係:
- 一個數據庫設計若是符合第二範式,必定也符合第一範式。若是符合第三範式,必定也符合第二範式……
第一範式(1NF):屬性不可分。設計
- 不知足第一範式的數據庫,不是關係數據庫!
- 舉兩個不知足例子:


第二範式(2NF):符合1NF,而且,非主屬性徹底依賴於碼。3d

- 一個學生上一門課,必定是特定某個教材。因此有(學生,課程)->教材
- 所以(學生,課程)是一個碼。
- (學生,課程)是個碼,課程卻決定了教材,這就叫作不徹底依賴
- 出現這樣的狀況,就不知足第二範式!
- 因此表要作拆分,以下圖

第三範式(3NF):符合2NF,而且,消除傳遞依賴blog
- 若是存在"A → B → C"的決定關係,則C傳遞函數依賴於A
- 「老師」和「老師職稱」有傳遞依賴
- 老師升級了,變教授了,要改數據庫,表中有N條,改了N次……(修改異常)
- 沒人選這個老師的課了,老師的職稱也沒了記錄……(刪除異常)
- 新來一個老師,還沒分配教什麼課,他的職稱記到哪?……(插入異常)

BC範式(BCNF):符合3NF,而且,主屬性不依賴於主屬性基礎
- 不存在任何字段對任一候選關鍵字段的傳遞函數依賴
- 當只檢查非主屬性時,就成了第三範式。