| Lesson 3 | Why We Need Normalization |
| Objective | Explain why normalization improves reliability, reduces redundancy, and prevents anomalies. |
Normalization structures data so each fact is stored once, relationships are explicit, and updates remain consistent. The aim is information preservation with minimum redundancy, producing tables that are easier to query and maintain.
The purpose of normalization is to maximize logical efficiency—correctness, consistency, and maintainability—so physical performance tuning can be applied deliberately where it matters.
| ORDER | |||||||||
| CustID | CustName | Address | Phone | OrderDate | OrderNo | ItemNo | Title | Price | Shipped |
| 101 | C. Frye | Portland | 230.1251 | 2017-01-11 | 101 | 105 | MX | 14.95 | YES |
| 101 | C. Frye | Portland | 230.1251 | 2017-01-11 | 102 | 108 | CX | 15.95 | YES |
| 102 | D. Loge | DC | 555.1234 | 2017-01-12 | 103 | 105 | MX | 14.95 | YES |
| 102 | D. Loge | DC | 555.1234 | 2017-01-13 | 104 | 109 | DX | 13.95 | YES |
-- UNF: wide "ORDER" table with repeated items per row
-- 1NF: split repeating items into separate rows
OrderLine1NF(OrderNo, OrderDate, CustID, CustName, ItemNo, Title, Price)
-- FDs (illustrative):
-- CustID → CustName
-- ItemNo → Title
-- OrderNo → OrderDate, CustID
-- (OrderNo, ItemNo) → Price
-- 2NF: remove partial dependencies from composite key (OrderNo, ItemNo)
Customer(CustID, CustName, Address, Phone)
Product(ItemNo, Title)
[Order](OrderNo, OrderDate, CustID)
OrderLine(OrderNo, ItemNo, Price)
-- 3NF: remove transitive deps (if any) among non-keys
-- e.g., if Title determines a CatalogPrice, keep that in Product;
-- keep OrderLine.Price only if capturing the actual sale price (history).
Normalization ensures correctness. Physical performance is then addressed with indexes, materialized views, caching, and schema-level options—after the logical design is sound. See also Reduce Data Redundancy and Foreign Keys.
Test yourself on the transformation steps: