第一正規化 (First Normal Form, 1NF) 是資料庫正規化的起點,它對 表格結構有很嚴格的限制。表格要符合 1NF,必須:
- 所有資料都是原子性的。每個儲存格裡的值都要不可再分。跟「一格放一堆清單」說掰掰吧!資料庫裡這樣搞不行啦。
- 每一列都是唯一的。也就是說,表格要有主鍵 (Primary Key) 或唯一識別碼。
- 沒有重複的資料群組。同一個實體的值不應該出現在同一個欄位裡。
簡單來說,把資料表想像成你的房間,原子值就像是獨立的物品:檯燈、桌子、書。如果房間亂七八糟(比如所有東西都堆在一起),你根本找不到檯燈,也不知道有沒有備用桌子。正規化就是幫你「把東西都歸位」。
違反 1NF 的範例
假設我們有一個學生表格,裡面記錄他們修的課程:
| student_id | name | courses |
|---|---|---|
| 1 | Maria | "數學, 物理" |
| 2 | Rob | "生物, 化學" |
這種結構有什麼問題?課程(courses 欄位)是用逗號分隔寫在同一格。這代表如果你想找所有修物理的學生,查詢會變超麻煩:要做一堆文字處理。如果有學生想把物理從清單裡刪掉,又是一個新問題。這種資料不是原子性的,違反了 1NF 的基本規則。
怎麼讓表格符合 1NF?
要解決這個問題,我們把資料拆成多列,每個儲存格只放一個原子值:
| student_id | name | course |
|---|---|---|
| 1 | Maria | 數學 |
| 1 | Maria | 物理 |
| 2 | Rob | 生物 |
| 2 | Rob | 化學 |
這樣就 OK 了。我們把表格改成每個儲存格都是不可再分的值,這就符合 1NF 的原則。
違反 1NF 及修正的詳細範例
假設我們有一個網路商店的訂單表:
| order_id | customer_name | items |
|---|---|---|
| 1001 | Otto Lin | "筆電, 滑鼠, 鍵盤" |
| 1002 | Anna Song | "智慧型手機, 保護殼" |
很明顯,這裡 items 一格就放了好幾個值,用逗號分隔,這樣就違反 1NF。
要讓資料符合 1NF,我們要一列只放一個商品:
| order_id | customer_name | item |
|---|---|---|
| 1001 | Otto Lin | 筆電 |
| 1001 | Otto Lin | 滑鼠 |
| 1001 | Otto Lin | 鍵盤 |
| 1002 | Anna Song | 智慧型手機 |
| 1002 | Anna Song | 保護殼 |
現在表格結構就符合 1NF 了。每個訂單和商品都用獨立一列來表示,值都是原子性的。
加上主鍵
轉換完表格後,記得要加上 唯一識別碼(主鍵)給每一列,確保唯一性。上面例子可以用 order_id 和 item 組合成複合主鍵。但實務上通常會另外加一個 id 欄位。
| id | order_id | customer_name | item |
|---|---|---|---|
| 1 | 1001 | Otto Lin | 筆電 |
| 2 | 1001 | Otto Lin | 滑鼠 |
| 3 | 1001 | Otto Lin | 鍵盤 |
| 4 | 1002 | Anna Song | 智慧型手機 |
| 5 | 1002 | Anna Song | 保護殼 |
實作練習
你有一個學生表,科目都寫在同一格:
| student_id | name | subjects |
|---|---|---|
| 1 | Polly | "數學, 化學" |
| 2 | Peter | "物理, 資訊學" |
請把表格改成符合 1NF 的形式。
轉換後的表格應該長這樣:
| student_id | name | subject |
|---|---|---|
| 1 | Polly | 數學 |
| 1 | Polly | 化學 |
| 2 | Peter | 物理 |
| 2 | Peter | 資訊學 |
常見的 1NF 錯誤
你在用資料庫時,違反 1NF 可能會遇到這些情況:
- 直接在表格裡存清單或陣列。這是最常見的錯誤。
- 沒有給資料列唯一識別碼(主鍵)。這會讓你的表格很容易出現重複資料。
- 用多個欄位存一樣的資訊。例如 "course_1", "course_2", "course_3" —— 這樣不對啦,應該用正確結構。
記住這些重點,你的資料庫就會符合第一正規化。
1NF 的實際應用
在實際專案裡,1NF 超級重要。舉例來說:
- 在客戶管理系統 (CRM) 裡,客戶資料和他們的行為都要原子化,這樣分析和查詢才方便。
- 在網路商店,1NF 用來有效儲存訂單、商品和顧客資訊。
- 在銀行系統,客戶、帳戶和交易資料都必須原子化,這樣才不會搞混不同操作。
遵守 1NF 原則可以設計出能承受高負載又好用的資料庫。雖然這樣會有資料重複的問題,所以我們會進入第二正規化 (2NF),到時會更清楚怎麼解決表格裡的部分依賴。
為什麼要遵守第一正規化 (1NF)?想像你把資料存在一個表格裡,一格就放好幾個值——比如顧客訂購的商品清單。這樣查資料超麻煩:想找所有訂過「鍵盤」的人會很痛苦。如果要改或刪掉某部分資訊,也很容易出錯。當資料是原子化的——也就是每個欄位只放一個值——操作起來就更可靠、更直觀。而且這種表格更容易擴充、更新和重構。
GO TO FULL VERSION