AdSense

網頁

2017/11/28

第一正規化(First Normal Form, 1NF)

第一正規化(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 |
+------+-------+-------+

消除意義上重複的欄位

例如原本資料中SCORE1SCORE2SCORE3都是用來紀錄分數的欄位。

+------+-------+--------+--------+--------+
| 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就重複出現了三次,而CLASSS001也重複出現。至於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 |
+---------+------+-------+-------+

完成以上步驟便完成了第一正規化。


沒有留言:

AdSense