網上搜羅了一大堆關於數據庫範式理解的文章,都是千律一篇的複製粘貼,連例子都是如出一轍,拜託有點創意好不,實在看不下去,本身寫一篇我的理解三範式的文章。若是有理解上的不正確之處,請聯繫指正。 數據庫
官方定義:第一範式(1NF):數據庫表中的字段都是單一屬性的,不可再分。
個人理解:第一範式這個不用說了,只要是關係數據庫都知足第一範式 數據庫設計
官方定義:第二範式(2NF):數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴
個人理解:在第二範式中組合主鍵(AB)【註明:也叫作複合主鍵】裏面的A或者B 與其餘字段不能存在組合重複,爲解決這個問題,一般的作法是我們不用組合主鍵,添加一個ID,作爲單一主鍵便可知足第二範式。若是不想添加ID,請知足組合主鍵(AB)裏面的A或者B 與其餘字段不能存在組合重複。
如:不知足第二範式,複合主鍵中的A與字段C組合重複
+------------+-----------+-------------------+
pk pk row
+------------+-----------+-------------------+
A B C
+------------+-----------+-------------------+
A D C
+------------+-----------+-------------------+
A E C
+------------+-----------+-------------------+ 函數
改成這樣知足第二範式(可是不知足第三範式,字段A與字段C是組合重複):
+---------+------------+-----------+-------------------+
pk row row row
+---------+------------+-----------+-------------------+
1 A B C
+---------+------------+-----------+-------------------+
2 A D C
+---------+------------+-----------+-------------------+
3 A E C
+---------+------------+-----------+-------------------+ 設計
官方定義:第三範式(3NF):在第二範式的基礎上,數據表中若是不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三 範式。
個人理解:在第三範式中字段與字段之間不能存在組合重複
如:不知足第三範式,字段A與字段C組合重複
+---------+------------+-----------+-------------------+---------------+
pk row row row row
+---------+------------+-----------+-------------------+---------------+
1 A B C F
+---------+------------+-----------+-------------------+---------------+
2 A D C G
+---------+------------+-----------+-------------------+---------------+
3 A E C K
+---------+------------+-----------+-------------------+---------------+ code
改成這樣知足第三範式:
表1
+---------+------------+-----------+
pk row row
+---------+------------+-----------+
1 A B
+---------+------------+-----------+
2 A D
+---------+------------+-----------+
3 A E
+---------+------------+-----------+
和表2
+---------+-------------------+------------+
pk row row
+---------+-------------------+------------+
1 C F
+---------+-------------------+------------+
2 C G
+---------+-------------------+------------+
3 C K
+---------+-------------------+------------+ class
原則:當出現字段與字段的組合重複,如上的A和C的組合重複,首先要考慮的就是把他們拆分爲2個表,具體是C拆到表1, 仍是A拆到表1,看狀況而定. 基礎
關鍵要理解定義這種範式標準的主要目的是爲了減小數據冗餘,數據冗餘產生的本質就是在一個表中存在字段與字段之間的一對多,或者多對多關係。解決這個幾對幾的關係問題,就能輕易實現知足第三範式的數據庫設計。
原理
基礎原理: 數據
構造數據庫必須遵循必定的規則。在關係數據庫中,這種規則就是範式。範式是符合某一種級別的關係模式的集合。關係數據庫中的關係必須知足必定的要求,即知足不一樣的範式。目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、第四範式(4NF)、第五範式(5NF)和第六範式(6NF)。知足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步知足更多要求的稱爲第二範式(2NF),其他範式以次類推。通常說來,數據庫只需知足第三範式(3NF)就好了。下面咱們舉例介紹第一範式(1NF)、第二範式(2NF)和第三範式(3NF)。 3.4.1 第一範式(1NF) 在任何一個關係數據庫中,第一範式(1NF)是對關係模式的基本要求,不知足第一範式(1NF)的數據庫就不是關係數據庫。 所謂第一範式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。若是出現重複的屬性,就可能須要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間爲一對多關係。在第一範式(1NF)中表的每一行只包含一個實例的信息。例如,對於圖3-2 中的員工信息表,不能將員工信息都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工信息表的每一行只表示一個員工的信息,一個員工的信息在表中只出現一次。簡而言之,第一範式就是無重複的列。 3.4.2 第二範式(2NF) 第二範式(2NF)是在第一範式(1NF)的基礎上創建起來的,即知足第二範式(2NF)必須先知足第一範式(1NF)。第二範式(2NF)要求數據庫表中的每一個實例或行必須能夠被唯一地區分。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。如 圖3-2 員工信息表中加上了員工編號(emp_id)列,由於每一個員工的員工編號是唯一的,所以每一個員工能夠被唯一區分。這個唯一屬性列被稱爲主關鍵字或主鍵、主碼。 第二範式(2NF)要求實體的屬性徹底依賴於主關鍵字。所謂徹底依賴是指不能存在僅依賴主關鍵字一部分的屬性,若是存在,那麼這個屬性和主關鍵字的這一部分應該分離出來造成一個新的實體,新實體與原實體之間是一對多的關係。爲實現區分一般須要爲表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二範式就是非主屬性非部分依賴於主關鍵字。 3.4.3 第三範式(3NF) 知足第三範式(3NF)必須先知足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。例如,存在一個部門信息表,其中每一個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那麼在圖3-2 的員工信息表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。若是不存在部門信息表,則根據第三範式(3NF)也應該構建它,不然就會有大量的數據冗餘。簡而言之,第三範式就是屬性不依賴於其它非主屬性。 簡單的解釋: 最基本的數據庫範式有三個,第一範式(1NF),第二範式(2NF)和第三範式(3NF),分別定義以下, 1NF:若是關係模式R中的每一個屬性都是單值的,則稱R∈1NF。 2NF:若是關係模式R∈1NF,且全部的非主屬性徹底函數依賴於(每個候選)碼,則稱R∈2NF。 3NF:若是關係模式R∈2NF,且不存在非主屬性傳遞函數依賴於碼的狀況,則稱R∈3NF。