淺談對數據庫範式的理解
數據庫的設計範式是數據庫設計所需要滿足的規範,若滿足的數據庫的規範,則該數據庫是簡潔的、結構明晰的,同時不會發生插入、刪除、跟新操作異常。否則數據庫的設計是不夠合理的,會給編程人員帶來很多麻煩,也可能會造成大量的數據冗余。下面談一談我最近對數據庫範式的理解。
1.1第一範式(1NF)確保每列保持原子性
我理解的第一範式就是:數據表中的每一列都是不可再分割的了,就是同一列不能有多個值,也不能有重復的列。例
姓名 | 電話 |
張三 | 12345678910;87946513216 |
這個例子就是電話這一列出現了兩個電話號,這是不符合1NF的,我們可以這樣讓他只添加一個電話號,或者再加一行。即
姓名 | 電話 |
張三 | 12345678910 |
張三 | 87946513216 |
在任何一個關系數據庫中,第一範式(1NF)是對關系模式的基本要求,不滿足第一範式(1NF)的數據庫就不是關系數據庫。
1.2第二範式(2NF)屬性完全依賴於主鍵
第二範式是在第一範式的基礎上建立起來,即滿足第二範式必須先滿足第一範式。第二範式要求數據表中的每行的內容必須可以被唯一區分。簡單來說就是每一個實例(行)都要有一個唯一標識(主鍵)。
例:現有一張選課關系表,字段包括(學號,姓名,年齡,課程名稱,學分,成績),關鍵字(主鍵)為(學號,課程名稱),
存在:(學號,課程名稱)——>(姓名,年齡,學分,成績)
但這張表並不是2NF,因為我們可以看到他應存在:(課程名稱)——>(學分)和(學號)——>(姓名,年齡)。
所以正確的2NF應該是將這張表拆分成三張表,即:學生表(學號,姓名,年齡),課程表(課程名稱,學分),成績表(學號,課程名稱,成績)
1.3第三範式(3NF)屬性不依賴於其他非主屬性
滿足第三範式必須先滿足第二範式,第三範式要求一個數據表中不包含已在其他表中已包含的非主鍵信息。簡單來說就是,一張數據表只能包含其他數據表的主鍵字段。例如現有一張部門表(部門ID,部門名稱,地址),還有用戶表(用戶ID,用戶姓名,部門ID,部門名稱,地址)。這是不滿足三範式的,因為在用戶表中已經存在了“部門ID”,就不需要再寫“部門名稱”和“地址”了。如果我們需要“部門名稱”和“地址”的話,我們可以這樣(用戶ID)——>(部門ID)——>(部門名稱,地址)。所以,正確的三範式應該是,部門表(部門ID,部門名稱,地址),還有用戶表(用戶ID,用戶姓名,部門ID)
淺談對數據庫範式的理解