CodeGym /課程 /SQL SELF /現有資料庫正規化分析

現有資料庫正規化分析

SQL SELF
等級 26 , 課堂 2
開放

講到分析資料庫有沒有符合正規化,其實就是在看資料表的結構、它們之間的關聯,還有屬性之間的依賴關係。主要目標就是找出正規化違規的地方,然後評估這些問題對效能、資料完整性還有操作便利性的影響。

簡單說,這就像在查帳:你要確定錢不是亂放,而是有好好分配到正確的支出項目。

資料庫分析的實戰方法

分析任何資料庫時,我們都會先問三個關鍵問題,這三個問題就對應到三個正規化。

假設我們有一個倉庫的資料庫,裡面有這樣一個資料表:

product_id product_name supplier_name supplier_phone stock_quantity
1 釘子 建材配件 +12301112233 150
2 螺絲 緊固專家 +12306667788 200
3 螺帽 建材配件 +12301112233 100

要怎麼檢查這個表有沒有符合正規化?

提醒一下,1NF 的條件是:

  • 每個 cell 只能有一個值。
  • 表裡不能有重複的欄位(同一種資料型態)。

我們這個例子沒有違反 1NF:每個 cell 都是原子值。這代表這個表已經是 1NF 了。耶!可以繼續往下。

2NF 的條件是:

  • 它已經是 1NF。
  • 所有非主鍵屬性 依賴整個主鍵(不是主鍵的一部分)。

在這個表裡,supplier_namesupplier_phone 都只依賴 product_id —— 也就是主鍵。不過這裡有資料重複:同一個供應商的名字跟電話會在好幾列出現。

要讓這個表變成 2NF,可以把它拆成兩個表:

Products

product_id product_name supplier_id stock_quantity
1 釘子 1 150
2 螺絲 2 200
3 螺帽 1 100

Suppliers

supplier_id supplier_name supplier_phone
1 建材配件 +78901112233
2 緊固專家 +78906667788

現在每個供應商只出現一次,兩個表之間用外鍵 supplier_id 連接。

3NF 的條件是:

  • 它已經是 2NF。
  • 所有非主鍵屬性 依賴主鍵,不會依賴其他非主鍵屬性。

在正規化後的 ProductsSuppliers 表裡,沒有看到任何傳遞依賴。這代表這些表已經是 3NF 了。

實戰練習

假設我們有一個原始表叫「大學」

student_id student_name course_name professor_name professor_email
101 Otto Lin 數學 Peter Pen pen@university.com
102 Anna Song 物理 Alex Sid sid@university.com
103 Otto Lin 物理 Alex Sid sid@university.com
  1. 檢查這個表有沒有符合正規化。
  2. 如果需要,把它變成 1NF、2NF、3NF。

解答

步驟 1:檢查 1NF

這個表已經是 1NF:每個 cell 都只有一個值。

步驟 2:檢查 2NF

這個表違反 2NF:老師的資訊(名字跟 email)會重複。我們可以把它拆到另一個表:

Students

student_id student_name
101 Otto Lin
102 Anna Song

Courses

course_id course_name professor_id
1 數學 1
2 物理 2

Professors

professor_id professor_name professor_email
1 Peter Pen pen@university.com
2 Alex Sid sid@university.com

Enrollments

enrollment_id student_id course_id
1 101 1
2 102 2
3 103 2

步驟 3:檢查 3NF

新的結構裡沒有傳遞依賴。這些表都符合 3NF。

實用建議

  1. 沒必要就不要追求完美。 有時候過度正規化會讓查詢變很複雜。
  2. 像偵探一樣去分析。 找找重複、奇怪的依賴還有其他「異常」。
  3. 別忘了效能。 正規化就是要在資料乾淨跟查詢速度之間取得平衡。

現在你已經會找資料庫的問題並解決它們,基本上可以很誠實地幫任何規模的資料庫做「稽核」。記住:好的資料庫不只是功能齊全,還要夠漂亮(也就是正規化啦)。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION