第一范式
數據庫表中不能出現重復記錄,每個字段是原子性的不能再分。
不符合第一范式的示例
學生編號 |
學生姓名 |
聯系方式 |
1001 |
張三 |
[email protected],1359999999 |
1002 |
李四 |
[email protected],13699999999 |
1001 |
王五 |
[email protected],13488888888 |
存在問題:
● 最后一條記錄和第一條重復(不唯一,沒有主鍵)
● 聯系方式字段可以再分,不是原子性的
學生編號(pk) |
學生姓名 |
|
聯系電話 |
1001 |
張三 |
1359999999 |
|
1002 |
李四 |
13699999999 |
|
1003 |
王五 |
13488888888 |
關于第一范式,每一行必須唯一,也就是每個表必須有主鍵,這是我們數據庫設計的最基本要求,主要通常采用數值型或定長字符串表示,關于列不可再分,應該根據具體的情況來決定。如聯系方式,為了開發上的便利行可能就采用一個字段了。
第二范式是建立在第一范式基礎上的,另外要求所有非主鍵字段完全依賴主鍵,不能產生部分依賴。
示例:
學生編號 |
學生姓名 |
教師編號 |
教師姓名 |
1001 |
張三 |
001 |
王老師 |
1002 |
李四 |
002 |
趙老師 |
1003 |
王五 |
001 |
王老師 |
1001 |
張三 |
002 |
趙老師 |
確定主鍵:
學生編號(PK) |
教師編號(PK) |
學生姓名 |
教師姓名 |
1001 |
001 |
張三 |
王老師 |
1002 |
002 |
李四 |
趙老師 |
1003 |
001 |
王五 |
王老師 |
1001 |
002 |
張三 |
趙老師 |
以上雖然確定了主鍵,但此表會出現大量的冗余,主要涉及到的冗余字段為“學生姓名”和“教師姓名”,出現冗余的原因在于,學生姓名部分依賴了主鍵的一個字段學生編號,而沒有依賴教師編號,而教師姓名部門依賴了主鍵的一個字段教師編號,這就是第二范式部分依賴。
解決方案如下:
學生信息表
學生編號(PK) |
學生姓名 |
1001 |
張三 |
1002 |
李四 |
1003 |
王五 |
教師信息表
教師編號(PK) |
教師姓名 |
001 |
王老師 |
002 |
趙老師 |
教師和學生的關系表
學生編號(PK) fkà學生表的學生編號 |
教師編號(PK) fkà教師表的教師編號 |
1001 |
001 |
1002 |
002 |
1003 |
001 |
1001 |
002 |
如果一個表是單一主鍵,那么它就復合第二范式,部分依賴和主鍵有關系。
以上是一種典型的“多對多”的設計
建立在第二范式基礎上的,非主鍵字段不能傳遞依賴于主鍵字段。(不要產生傳遞依賴)
學生編號(PK) |
學生姓名 |
班級編號 |
班級名稱 |
1001 |
張三 |
01 |
一年一班 |
1002 |
李四 |
02 |
一年二班 |
1003 |
王五 |
03 |
一年三班 |
1004 |
六 |
03 |
一年三班 |
從上表可以看出,班級名稱字段存在冗余,因為班級名稱字段沒有直接依賴于主鍵,班級名稱字段依賴于班級編號,班級編號依賴于學生編號,那么這就是傳遞依賴,解決的辦法是將冗余字段單獨拿出來建立表,如:
學生信息表
學生編號(PK) |
學生姓名 |
班級編號(FK) |
1001 |
張三 |
01 |
1002 |
李四 |
02 |
1003 |
王五 |
03 |
1004 |
六 |
03 |
班級信息表
班級編號(PK) |
班級名稱 |
01 |
一年一班 |
02 |
一年二班 |
03 |
一年三班 |
以上設計是一種典型的一對多的設計,一存儲在一張表中,多存儲在一張表中,在多的那張表中添加外鍵指向一的一方的主鍵。
第一范式:有主鍵,具有原子性,字段不可分割;
第二范式:完全依賴,沒有部分依賴;
第三范式:沒有傳遞依賴;
數據庫設計盡量遵循三范式,但是還是根據實際情況進行取舍,有時可能會拿冗余換速度,最終用目的要滿足客戶需求。
一對一設計,有兩種設計方案:
第一種設計方案:主鍵共享;
第二種設計方案:外鍵唯一。