第一正規化(1NF)是資料庫正規化的第一步,之後的正規化步驟都必須先從第一正規化開始進行。
第一正規化要完成以下工作:
- 一個欄位只能有單一值
- 消除意義上重複的欄位
- 決定主鍵
一個欄位只能有單一值
如果一個欄位中記錄了多個值,則應化分出來成為另一筆資料,例如原本的資料如下,成績欄位中記錄了多筆資料。
+------+-------+----------+
| NAME | CLASS | SCORE |
+------+-------+----------+
| Matt | S001 | 60,58,72 |
| John | S001 | 92,87,89 |
+------+-------+----------+
所以應該畫分出來如下。
+------+-------+-------+
| NAME | CLASS | SCORE |
+------+-------+-------+
| Matt | S001 | 60 |
| Matt | S001 | 58 |
| Matt | S001 | 72 |
| John | S001 | 92 |
| John | S001 | 87 |
| John | S001 | 89 |
+------+-------+-------+
消除意義上重複的欄位
例如原本資料中SCORE1
,SCORE2
及SCORE3
都是用來紀錄分數的欄位。
+------+-------+--------+--------+--------+
| NAME | CLASS | SCORE1 | SCORE2 | SCORE3 |
+------+-------+--------+--------+--------+
| Matt | S001 | 60 | 58 | 72 |
| John | S001 | 92 | 87 | 89 |
+------+-------+--------+--------+--------+
這種意義相同的欄位必須化分出來如下
+------+-------+-------+
| NAME | CLASS | SCORE |
+------+-------+-------+
| Matt | S001 | 60 |
| Matt | S001 | 58 |
| Matt | S001 | 72 |
| John | S001 | 92 |
| John | S001 | 87 |
| John | S001 | 89 |
+------+-------+-------+
決定主鍵
第一正規化必須找出資料表的主鍵(Primary Key, PK),並確定其他欄位都應依賴主鍵而存在。
所謂的主鍵是指具有唯一(unique)特性的欄位,該欄位的值是獨一無二的,用來識別出每一筆資料。主鍵可以由多個欄位組合而成,又稱為複合主鍵(Composite Primary Key)。
例如上面資料表中現有的欄位都無法成為主鍵,因為值不是唯一,例如NAME
欄位中Matt
就重複出現了三次,而CLASS
的S001
也重複出現。至於SCORE
的值目前雖然沒有重複,但未來的資料可能會出現重複的分數,因此也不是唯一。此時可透過賦予新的欄位來決定主鍵,例如新增一個TEST_ID
欄位代表每次測驗的識別號碼。
+---------+------+-------+-------+
| TEST_ID | NAME | CLASS | SCORE |
+---------+------+-------+-------+
| 1 | Matt | S001 | 60 |
| 2 | Matt | S001 | 58 |
| 3 | Matt | S001 | 72 |
| 4 | John | S001 | 92 |
| 5 | John | S001 | 87 |
| 6 | John | S001 | 89 |
+---------+------+-------+-------+
完成以上步驟便完成了第一正規化。
沒有留言:
張貼留言