ReviseAlgo Logo

Database Design

Normalization: 1NF, 2NF, 3NF, and BCNF

Designing schemas to eliminate data redundancy.

Last Updated: June 15, 2026 20 min read

1. Introduction

Normalization is the systematic process of organizing data in a database to reduce redundancy and improve data integrity. It progresses through a series of normal forms — 1NF, 2NF, 3NF, and BCNF — each eliminating a specific class of anomalies. A well-normalized schema ensures that every fact is stored in exactly one place, preventing update, insert, and delete anomalies.

2. Why It Matters

  • Update anomalies: If a customer's address appears in 10 rows and you update only 8, your data is inconsistent. Normalization stores the address once.
  • Insert anomalies: Without normalization, you might not be able to add a new product category until at least one product exists in it.
  • Delete anomalies: Deleting the last product in a category might accidentally delete the category information too.
  • Storage efficiency: Eliminating duplicated data reduces disk usage and index sizes significantly.

3. Real-World Analogy

Imagine a university where each student's record includes their advisor's name, department, and office. If the advisor moves offices, every student record with that advisor must be updated. Normalization is like creating a separate "advisor" file card — update the office once, and every student's record automatically references the current information.

4. How It Works

First Normal Form (1NF): Eliminate repeating groups. Each column contains atomic (indivisible) values, and each row is unique.

Second Normal Form (2NF): Satisfy 1NF + eliminate partial dependencies. Every non-key column must depend on the ENTIRE primary key, not just part of it.

Third Normal Form (3NF): Satisfy 2NF + eliminate transitive dependencies. No non-key column should depend on another non-key column.

Boyce-Codd Normal Form (BCNF): A stronger version of 3NF. For every functional dependency X → Y, X must be a superkey.

5. Internal Architecture

6. Visual Explanation

7. Practical Example

Normalizing an e-commerce order table from unnormalized to 3NF:

8. Common Mistakes

Over-normalizing

Normalizing beyond 3NF (to 4NF, 5NF) is rarely needed in practice. Each additional normal form adds JOIN complexity with diminishing returns. Most production schemas target 3NF.

Confusing 2NF and 3NF

2NF deals with partial dependencies (depends on part of a composite key). 3NF deals with transitive dependencies (non-key depends on non-key). If your table has a single-column primary key, it's automatically in 2NF.

Interview Insight

"Give me an example of a 3NF violation." — A table with (emp_id, name, department, dept_manager) violates 3NF because dept_manager depends on department (a non-key column), not directly on emp_id.

9. Quick Quiz

Q1: A table with a single-column primary key is automatically in which normal form?

Answer: 2NF (assuming it's already in 1NF). Partial dependencies can only exist with composite primary keys.

Q2: What's the key difference between 3NF and BCNF?

Answer: 3NF allows a non-key column to be determined by another non-key column if that column is part of a candidate key. BCNF is stricter — every determinant must be a superkey.

10. Scenario-Based Challenge

Challenge: Normalize a Hospital Management Schema

You have this unnormalized table:

Normalize it to 3NF. Identify all functional dependencies, then decompose into appropriate tables (patients, doctors, rooms, admissions, diagnoses, medications).

11. Debugging Exercise

This "normalized" schema still has a 3NF violation. Find it:

Issue:

  1. Transitive dependency: customer_tier depends on the customer (via order_id → customer), not directly on item_id. It should be in the customers or orders table, not order_items.
  2. discount_pct may depend on customer_tier: If discount is determined by tier, that's another transitive dependency: item_id → customer_tier → discount_pct.

12. Interview Questions

Q1: When would you deliberately violate normalization?

A: In read-heavy OLAP/analytics systems where JOINs are expensive. Storing pre-computed aggregates or denormalized columns (like total_price on orders) avoids costly joins for frequently-accessed reports. This is called denormalization for performance.

Q2: What are update anomalies?

A: When the same data is stored in multiple rows, updating one copy without updating all others creates inconsistency. Example: customer address stored in every order row — updating the customer's address requires updating all their order rows, or some orders show the old address.

Q3: Is 3NF always sufficient for production schemas?

A: For OLTP systems, yes — 3NF eliminates virtually all redundancy-related anomalies. BCNF is a stronger guarantee but the difference rarely matters in practice. Data warehouse schemas (star/snowflake) deliberately use different patterns optimized for read performance.

13. Production Considerations

  • Target 3NF for OLTP: Transactional systems benefit most from normalization — fewer anomalies, smaller indexes, and better write performance.
  • Migration cost: Normalizing an existing denormalized schema requires data migration scripts, application code changes, and thorough testing. Plan migrations carefully with rollback strategies.
  • JOIN performance: Highly normalized schemas require more JOINs. Ensure proper indexing on foreign keys and consider whether a moderate denormalization might improve read performance.
  • Application complexity: More tables means more ORM entities, more repository methods, and more complex queries. Balance normalization with developer productivity.
  • Audit trails: Normalized schemas make auditing easier — changes are localized to specific tables, making it clear what was modified and when.