CodeGym /課程 /SQL SELF /第一正規化原則 (1NF)

第一正規化原則 (1NF)

SQL SELF
等級 25, 課堂 1
開放

第一正規化 (First Normal Form, 1NF) 是資料庫正規化的起點,它對 表格結構有很嚴格的限制。表格要符合 1NF,必須:

  1. 所有資料都是原子性的。每個儲存格裡的值都要不可再分。跟「一格放一堆清單」說掰掰吧!資料庫裡這樣搞不行啦。
  2. 每一列都是唯一的。也就是說,表格要有主鍵 (Primary Key) 或唯一識別碼。
  3. 沒有重複的資料群組。同一個實體的值不應該出現在同一個欄位裡。

簡單來說,把資料表想像成你的房間,原子值就像是獨立的物品:檯燈、桌子、書。如果房間亂七八糟(比如所有東西都堆在一起),你根本找不到檯燈,也不知道有沒有備用桌子。正規化就是幫你「把東西都歸位」。

違反 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)?想像你把資料存在一個表格裡,一格就放好幾個值——比如顧客訂購的商品清單。這樣查資料超麻煩:想找所有訂過「鍵盤」的人會很痛苦。如果要改或刪掉某部分資訊,也很容易出錯。當資料是原子化的——也就是每個欄位只放一個值——操作起來就更可靠、更直觀。而且這種表格更容易擴充、更新和重構。

2
任務
SQL SELF, 等級 25, 課堂 1
上鎖
操作真實資料表
操作真實資料表
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION