1.對資料表做 1NF
-
Table 中有Primary Key且其他所有欄位都需相依於Primary Key欄位
-
每個欄位都指儲存單一值(ex.某欄位紀錄姓名但不能在此欄位紀錄兩個人以上姓名)
-
Table中沒有無意義之相同欄位ex.Name1 , Name 2
訂單編號 |
客戶名稱 |
員工編號 |
業務員 |
書號 |
書籍名稱 |
數量 |
ID101 |
十全書店 |
1032 |
Melo |
F103 F102 |
Linux PHP |
20 80 |
ID103 |
愛買 |
1031 |
James |
F102 |
PHP |
20 |
以上資料表違反1NF
轉換為符合1NF
將書籍名稱(重複資料)改成存到不同的紀錄中
並替primary key打上* (訂單編號+書號)
*訂單編號 |
*書號 |
客戶名稱 |
員工編號 |
業務員 |
書籍名稱 |
數量 |
ID101 |
F103 |
十全書店 |
1032 |
Melo |
Linux |
20 |
ID101 |
F102 |
十全書店 |
1032 |
Melo |
PHP |
80 |
ID103 |
F102 |
愛買 |
1031 |
James |
PHP |
20 |
2.解釋何為部分相依
-
部分相依指某些欄位只與Primary Key某些欄位相依
-
部分相依只會在primary key為多欄位形成時發生
以前例子而言,部分相依的部分如下:
-
"客戶名稱" 只與primary key的 "訂單編號" 相依。
-
“書籍名稱” 只與primary key的 "書號" 相依。
部分相依產生之問題:
-
新增一筆 "書籍名稱":ASP.NET書籍,但因為沒有任何客戶訂購,
導致Primary key其中之一的 "訂單編號" 沒有值,這是不允許的。
3. 對資料表做 2NF
-
必須符合1NF
-
各欄位與Primary Key欄位間需要沒有部分相依
針對以下表格做2NF
*訂單編號 |
*書號 |
客戶名稱 |
員工編號 |
業務員 |
書籍名稱 |
數量 |
ID101 |
F103 |
十全書店 |
1032 |
Melo |
Linux |
20 |
ID101 |
F102 |
十全書店 |
1032 |
Melo |
PHP |
80 |
ID103 |
F102 |
愛買 |
1031 |
James |
PHP |
20 |
我們要去除部分相依性只需要將部分相依欄位拆成另外資料表即可。
以此例子而言,部分相依的部分如下:
-
"客戶名稱" 只與primary key的 "訂單編號" 相依。
-
“書籍名稱” 只與primary key的 "書號" 相依。
第一步: 將"書號" 與 "書籍名稱" 拆成一張表(但不包含數量)。
note:不包含數量原因為會違反1NF,因為萬一有同一本書但不同數量會有多筆同樣資料
ex.PHP有人訂20有人訂80等等。
書籍資料表
*書號 |
書籍名稱 |
F103 |
Linux |
F102 |
PHP |
第二步: 將"訂單編號" 與 “客戶名稱” 拆成一張表。
note:原因 "客戶名稱" 只與primary key的 "訂單編號" 相依。
訂單明細資料表
*訂單編號 |
客戶名稱 |
員工編號 |
業務員 |
ID101 |
十全書店 |
1032 |
Melo |
ID103 |
愛買 |
1032 |
Melo |
第三步:primary key(*訂單編號,*書號)與剩下的”數量”欄位自成一張表
訂單細目資料表
*訂單編號 |
*書號 |
數量 |
ID101 |
F103 |
20 |
ID101 |
F102 |
80 |
ID103 |
F102 |
20 |
4. 間接相依
A欄位與B欄位相依,B欄位與C欄位相依,所以A與C欄位間接相依
訂單明細資料表
*訂單編號 |
客戶編號 |
客戶名稱 |
員工編號 |
業務員 |
ID101 |
C002 |
十全書店 |
1032 |
Melo |
ID103 |
C005 |
愛買 |
1032 |
Melo |
-
"客戶名稱"與"客戶編號"相依 (與primary key無關)
-
"員工編號"與"業務員"相依(與primary key無關)
-
客戶編號,客戶名稱,員工編號,業務員 都相依於 "訂單編號" (與primary key有關)
整理出相依關係如下:(-->:相依)
客戶名稱-->客戶編號--> 訂單編號 <--業務員<--員工編號
5.對資料表做 3NF
-
符合2NF
-
各欄位與primary key欄位間沒有間接相依
去除間接相依如同去除部分相依一樣,所以我們可以將"訂單明細資料表"拆分如下:
訂單明細資料表
*訂單編號 |
客戶編號 |
客戶名稱 |
員工編號 |
業務員 |
ID101 |
C002 |
十全書店 |
1032 |
Melo |
ID103 |
C005 |
愛買 |
1032 |
Melo |
3NF 後如下:
員工資料表 (業務員<--員工編號)
員工編號 |
業務員 |
1032 |
Melo |
1032 |
Melo |
客戶資料表(客戶名稱-->客戶編號)
客戶編號 |
客戶名稱 |
C002 |
十全書店 |
C005 |
愛買 |
訂單資料表
*訂單編號 |
客戶編號 |
員工編號 |
ID101 |
C002 |
1032 |
ID103 |
C005 |
1032 |