(1)第一範式(1NF)原子性也就是說數據列不可再分數據庫
所謂第一範式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。若是出現重複的屬性,就可能須要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間爲一對多關係。在第一範式(1NF)中表的每一行只包含一個實例的信息。簡而言之,第一範式就是無重複的列函數
說明:在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不知足第一範式(1NF)的數據庫就不是關係數據庫。 spa
(2)第二範式(2NF)消除部分依賴orm
第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每一個實例或行必須能夠被唯一地區分。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。例如員工信息表中加上了員工編號(emp_id)列,由於每一個員工的員工編號是唯一的,所以每一個員工能夠被唯一區分。這個唯一屬性列被稱爲主關鍵字或主鍵、主碼。
ci
第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二範式就是屬性徹底依賴於主鍵。it
(3)第三範式(3NF)消除傳遞依賴ast
知足第三範式(3NF)必須先知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。例如,存在一個部門信息表,其中每一個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那麼在的員工信息表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。若是不存在部門信息表,則根據第三範式(3NF)也應該構建它,不然就會有大量的數據冗餘。簡而言之,第三範式就是屬性不依賴於其它非主屬性。 基礎
(4) 鮑依斯-科得範式(BCNF是3NF的改進形式)im
若關係模式R是第一範式,且每一個屬性都不傳遞依賴於R的候選鍵。這種關係模式就是BCNF模式。即在第三範式的基礎上,數據庫表中若是不存在任何字段對任一候選關鍵字段的傳遞函數依賴則符合鮑依斯-科得範式。假設倉庫管理關係表爲StorehouseManage(倉庫ID, 存儲物品ID, 管理員ID, 數量),且有一個管理員只在一個倉庫工做;一個倉庫能夠存儲多種物品。這個數據庫表中存在以下決定關係:數據
(倉庫ID, 存儲物品ID) →(管理員ID, 數量)
(管理員ID, 存儲物品ID) → (倉庫ID, 數量)
因此,(倉庫ID, 存儲物品ID)和(管理員ID, 存儲物品ID)都是StorehouseManage的候選關鍵字,表中的惟一非關鍵字段爲數量,它是符合第三範式的。可是,因爲存在以下決定關係:
(倉庫ID) → (管理員ID) (管理員ID) → (倉庫ID)
即存在關鍵字段決定關鍵字段的狀況,因此其不符合BCNF範式。它會出現以下異常狀況:
(1) 刪除異常:
當倉庫被清空後,全部"存儲物品ID"和"數量"信息被刪除的同時,"倉庫ID"和"管理員ID"信息也被刪除了。
(2) 插入異常:
當倉庫沒有存儲任何物品時,沒法給倉庫分配管理員。
(3) 更新異常:
若是倉庫換了管理員,則表中全部行的管理員ID都要修改。
把倉庫管理關係表分解爲二個關係表:
倉庫管理:StorehouseManage(倉庫ID, 管理員ID);
倉庫:Storehouse(倉庫ID, 存儲物品ID, 數量)。
這樣的數據庫表是符合BCNF範式的,消除了刪除異常、插入異常和更新異常。
四種範式之間存在以下關係: