NORMALIZATION
Organizing data to reduce redundancy & improve integrity
What is Normalization?
Benefits
Problems without Normalization
Unnormalized Table (UNF)
1NF – First Normal Form
2NF – Second Normal Form
3NF – Third Normal Form
BCNF – Boyce-Codd Normal Form
Problems Without Normalization
Three types of anomalies destroy data quality in an unnormalized database:
Insert Anomaly Example:
You cannot add new data without Cannot add a new course unless a student is already enrolled — because student info is required in
providing unrelated data. the same row.
Update Anomaly Example:
Changing one fact requires If a teacher changes departments, every row mentioning that teacher must be updated — missing
updating many rows. even one creates contradictory data.
Delete Anomaly Example:
Deleting one record accidentally Removing the last student enrolled in a course deletes the course information entirely — unintentional
removes unrelated data. data loss.
Also causes: data duplication, wasted storage, slow queries, and inconsistent reports.
Unnormalized Table (UNF) – The Problem
One massive table storing everything — packed with defects:
order_id customer_name customer_email product_names quantities prices supplier supplier_ph
1001 Alice alice@[Link] Pen, Notebook 2, 1 5, 12 ABC Corp 021-111
1001 Alice alice@[Link] Pen, Notebook 2, 1 5, 12 ABC Corp 021-111
1002 Bob bob@[Link] Stapler 3 18 XYZ Ltd 042-222
1003 Alice alice@[Link] Pen 5 5 ABC Corp 021-111
Duplicate Rows Repeating Groups Redundant Data Mixed Concerns
Rows 1 & 2 are identical — no Multiple values in one cell (Pen, customer_email repeated on every Supplier info mixed with order data —
unique identifier per item Notebook) — not atomic order row unrelated entities
Duplicate / Redundant data Multiple values in one cell (repeating group)
1NF – First Normal Form
Rule: Every column must hold atomic (indivisible) values. No repeating groups. Each row must be uniquely identifiable.
Fix: Split multi-values into separate rows
order_id customer_name customer_email product_name qty price supplier supp_phone
1001 Alice alice@[Link] Pen 2 5 ABC Corp 021-111
1001 Alice alice@[Link] Notebook 1 12 ABC Corp 021-111
1002 Bob bob@[Link] Stapler 3 18 XYZ Ltd 042-222
1003 Alice alice@[Link] Pen 5 5 ABC Corp 021-111
Still has issues: customer email repeats on every row (partial dependency on non-key). Needs 2NF.
What changed:
Multi-value cells split — each row now holds one product name only (atomic)
Rows are now uniquely identifiable using composite key: order_id + product_name
Repeating groups eliminated — no more comma-separated values in any cell