銀行的面試官問了個簡單的問題,滿足第二范式,但是不滿足第三范式的例子
首先我們要搞清楚 第一,第二,第三范式的定義
網上很多,但是都不好理解我這里簡單總結下
一、三大范式通俗解釋:
(1)簡單歸納:
第一范式(1NF):字段不可分;
第二范式(2NF):有主鍵,非主鍵字段依賴主鍵;
第三范式(3NF):非主鍵字段不能相互依賴。
(2)解釋:
1NF:原子性。 字段不可再分,否則就不是關系數據庫;;
2NF:唯一性 。一個表只說明一個事物;
3NF:每列都與主鍵有直接關系,不存在傳遞依賴。
1、第一范式,
定義:實體表中的數據(字段)不可再分; 對數據項(字段)的要求是具備獨立性,不可再分;
重點:就是列不能再拆分了,比如你定義的某個列 叫信息
舉個栗子:
/*學號 年齡 信息*/
Sno Sage Sinfo
1001 19 陝西省西安市,電話:10086
1001 20 陝西,寶雞
看看第三列里面的信息,里面包羅萬象,很明顯不是原子的,這就不滿足第一范式;
2、第二范式:
定義:
1、每張表必須要有主屬性(主鍵)唯一,該表上的其他字段都可以由該字段來推導其相關內容;
2、其它屬性數據項(非主鍵)要完全依賴於主屬性(主鍵);
重點:
1、滿足第一范式,必須有主鍵;
2、只有當一個表中,主碼由兩個或以上的屬性組成的時候,才會出現不符合第二范式的情況。
其實就是 聯合主鍵才會出現不符合第二的情況,后面的列只依賴於聯合主鍵中的某一個鍵;
舉個栗子:(以下例子 不符合 第二范式)
/*學號 課程號 得分 課程名*/
Sno Cno Score Sname
1001 001 99 數據庫
主鍵: Sno,Cno (注意是聯合主鍵)
不滿足原因:Sname不完全依賴於碼,課程名部分依賴於碼Cno。
3、第三范式
定義:所有的非主屬性(非主鍵)都直接由其它表的主屬性(主鍵)推導生成,而不需要傳遞依賴。
重點:
1)滿足第二范式。
2)不能傳遞依賴,非主屬性不能部分或者傳遞依賴於碼。
舉個栗子: (異常的情況,就是冗余數據 ,比如我們之前的系統,場館里面的座位,冗余的場館的name,位置等信息)
表: 學號, 姓名, 年齡, 學院名稱, 學院電話
因為存在依賴傳遞: (學號) → (學生)→(所在學院) → (學院電話) 。
可能會存在問題:
數據冗余:有重復值;更新異常:有重復的冗余信息,修改時需要同時修改多條記錄,否則會出現數據不一致的情況 。
正確做法:
學生:(學號, 姓名, 年齡, 所在學院);
學院:(學院, 電話)。
第一范式: (1NF)
實體表中的數據(字段)不可再分; 對數據項(字段)的要求是具備獨立性,不可再分;
第二范式:(2NF)
1、每張表必須要有主屬性(主鍵)唯一,該表上的其他字段都可以由該字段來推導其相關內容;
2、其它屬性數據項(非主鍵)要完全依賴於主屬性(主鍵);
第三范式:(3NF)
所有的非主屬性(非主鍵)都直接由其它表的主屬性(主鍵)推導生成,而不需要傳遞依賴(第三范式重點是不能傳遞依賴)。
數據庫范式第一第二第三范式的區別是:1、第一范式就是無重復的列;2、第二范式就是屬性完全依賴於主鍵;3、第三范式就是屬性不依賴於其它非主屬性。
第一范式(1NF)無重復的列
所謂第一范式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。如果出現重復的屬性,就可能需要定義一個新的實體,新的實體由重復的屬性構成,新實體與原實體之間為一對多關系。在第一范式(1NF)中表的每一行只包含一個實例的信息。簡而言之,第一范式就是無重復的列。
1NF的定義為:符合1NF的關系中的每個屬性都不可再分
下表所示情況,便不符合1NF的要求:

說明:在任何一個關系數據庫中,第一范式(1NF)是對關系模式的基本要求,不滿足第一范式(1NF)的數據庫就不是關系數據庫。
第二范式(2NF)屬性完全依賴於主鍵
第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數據庫表中的每個實例或行必須可以被惟一地區分。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。例如員工信息表中加上了員工編號(emp_id)列,因為每個員工的員工編號是惟一的,因此每個員工可以被惟一區分。這個惟一屬性列被稱為主關鍵字或主鍵、主碼。
第二范式(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二范式就是屬性完全依賴於主鍵。
第三范式(3NF)
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。
例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在的員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。如果不存在部門信息表,則根據第三范式(3NF)也應該構建它,否則就會有大量的數據冗余。
簡而言之,第三范式就是屬性不依賴於其它非主屬性。 也就是說, 如果存在非主屬性對於碼的傳遞函數依賴,則不符合3NF的要求。
二、例子說明
(1)不符合第一字段的例子
表:字段1, 字段2(字段2.1,字段2.2), 字段3
字段2可以拆分成字段2.1和字段2.2,不符合第一范式。
(2)不符合第二范式的例子
表:學號, 姓名, 年齡, 課程名稱, 成績, 學分
這個表明顯說明了兩個事務:學生信息, 課程信息。
1)存在以下問題:
a、數據冗余:每條記錄都含有相同信息;
b、刪除異常:刪除所有學生成績,就把課程信息全刪除了;
c、插入異常:學生未選課,無法記錄進數據庫;
d、更新異常:調整課程學分,所有行都調整。
2)修正:
學生表:學號, 姓名, 年齡
課程表:課程名稱,學分
選課關系表:學號, 課程名稱, 成績
(3)不符合第三范式的例子
表:學號, 姓名, 年齡, 所在學院, 學院聯系電話
其中關鍵字為單一關鍵字"學號"。存在依賴傳遞::(學號) → (所在學院) → (學院聯系電話) 。
1)存在問題::
a、數據冗余:有重復值;
b、更新異常:有重復的冗余信息,修改時需要同時修改多條記錄,否則會出現數據不一致的情況
c、刪除異常
2)修正:
學生表:學號, 姓名, 年齡, 所在學院;
學院表:學院, 電話
