Learn 1NF through 3NF/BCNF normalization rules to eliminate redundancy and update anomalies.
Published April 4, 2025
Normalization is the process of structuring a relational database to reduce data redundancy and improve data integrity. Each normal form adds a rule to eliminate a specific type of anomaly.
Without normalization, you get update anomalies:
Eliminate repeating groups; each column must hold atomic values.
❌ Violates 1NF:
| student_id | name | courses |
|------------|-------|----------------------|
| 1 | Alice | Java, Spring, DSA |
✅ 1NF:
| student_id | name | course |
|------------|-------|---------|
| 1 | Alice | Java |
| 1 | Alice | Spring |
| 1 | Alice | DSA |
Must be in 1NF; every non-key attribute must depend on the whole primary key (eliminate partial dependencies).
Applies only to tables with composite keys.
❌ Violates 2NF (course_name depends only on course_id, not the full key):
| student_id | course_id | course_name | grade |
✅ 2NF (split into two tables):
courses: | course_id | course_name |
enrollments: | student_id | course_id | grade |
Must be in 2NF; no transitive dependencies (non-key attribute depending on another non-key attribute).
❌ Violates 3NF (zip_code → city is a transitive dependency):
| employee_id | name | zip_code | city |
✅ 3NF:
employees: | employee_id | name | zip_code |
zip_codes: | zip_code | city |
Stricter version of 3NF. Every determinant must be a candidate key.
Rarely violated in practice; 3NF is sufficient for most applications.
Normalization optimises for write integrity. For read performance, you sometimes denormalize intentionally:
user_name on the orders table to avoid a JOIN on every readDenormalization is a deliberate trade-off: you accept some redundancy in exchange for faster reads.
| Normal Form | Eliminates |
|---|---|
| 1NF | Repeating groups, multi-valued columns |
| 2NF | Partial dependencies (composite key tables) |
| 3NF | Transitive dependencies |
| BCNF | Non-key determinants |