講到分析資料庫有沒有符合正規化,其實就是在看資料表的結構、它們之間的關聯,還有屬性之間的依賴關係。主要目標就是找出正規化違規的地方,然後評估這些問題對效能、資料完整性還有操作便利性的影響。
簡單說,這就像在查帳:你要確定錢不是亂放,而是有好好分配到正確的支出項目。
資料庫分析的實戰方法
分析任何資料庫時,我們都會先問三個關鍵問題,這三個問題就對應到三個正規化。
假設我們有一個倉庫的資料庫,裡面有這樣一個資料表:
| 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_name 跟 supplier_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。
- 所有非主鍵屬性 只 依賴主鍵,不會依賴其他非主鍵屬性。
在正規化後的 Products 跟 Suppliers 表裡,沒有看到任何傳遞依賴。這代表這些表已經是 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 |
- 檢查這個表有沒有符合正規化。
- 如果需要,把它變成 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。
實用建議
- 沒必要就不要追求完美。 有時候過度正規化會讓查詢變很複雜。
- 像偵探一樣去分析。 找找重複、奇怪的依賴還有其他「異常」。
- 別忘了效能。 正規化就是要在資料乾淨跟查詢速度之間取得平衡。
現在你已經會找資料庫的問題並解決它們,基本上可以很誠實地幫任何規模的資料庫做「稽核」。記住:好的資料庫不只是功能齊全,還要夠漂亮(也就是正規化啦)。
GO TO FULL VERSION