1. 程式人生 > >數據庫三大範式個人理解,書上講的太抽象

數據庫三大範式個人理解,書上講的太抽象

ack width 重復值 str font 城市 保存 eight cnblogs

第一範式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。

個人理解:列不可分(原子性,即字段不可以再分)

技術分享圖片

地址可以再分,分成省份,城市,和詳細地址


第二範式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。

人理解:不存在部分依賴(唯一性,不可以把多種數據保存在同一張表中,即一張表只能保存“一種”數據)

表: 學號, 姓名, 年齡, 課程名稱, 成績, 學分

問題:

數據冗余,每條記錄都含有相同信息;
刪除異常:刪除所有學生成績,就把課程信息全刪除了;
插入異常:學生未選課,無法記錄進數據庫;
更新異常:調整課程學分,所有行都調整。


這個表有兩個事務:學生信息, 課程信息;由於非主鍵字段必須依賴主鍵,這裏學分依賴課程號,姓名依賴與學號,所以不符合二範式。


正確做法:


學生:Student(學號, 姓名, 年齡);
課程:Course(課程名稱, 學分);
選課關系:StudentCourse(學號, 課程名稱, 成績)。


第三範式(3NF):首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。

個人理解:不存在傳遞依賴(直接性,每一列都和主鍵直接相關,而不能間接相關)

表: 學號, 姓名, 年齡, 學院名稱, 學院電話

問題:

數據冗余:有重復值;
更新異常:有重復的冗余信息,修改時需要同時修改多條記錄,否則會出現數據不一致的情況


因為存在依賴傳遞: (學號) → (學生)→(所在學院) → (學院電話) 。

正確做法:

學生:(學號, 姓名, 年齡, 所在學院);

學院:(學院, 電話)。

數據庫三大範式個人理解,書上講的太抽象