Reducing redundancy through normal forms — and when to intentionally denormalize
Unnormalized schemas store the same data in multiple places. When that data changes, every copy must be updated — miss one and you have inconsistency. Normalization eliminates redundancy by ensuring each fact is stored once. But normalized schemas require more joins to read, which adds latency. The art is knowing when to normalize and when to deliberately denormalize for performance.
Each normal form addresses a specific type of redundancy. 1NF: each cell holds one atomic value (no lists in a column). 2NF: non-key columns depend on the whole primary key, not just part of it. 3NF: non-key columns depend only on the primary key, not on each other. BCNF: a stricter version of 3NF.
Think of it progressively: each level fixes a more subtle form of redundancy. In practice, reaching 3NF is the goal for most transactional systems.