This top-landing page gives you a crisp overview of the first three normal forms and why they matter. Use it as your hub to the detailed lessons on functional dependencies, 2NF limitations, transitive dependencies, and 3NF decomposition.
Normalization reduces redundancy and prevents update, insert, and delete anomalies. You’ll decompose tables along functional dependency lines and re-link them with foreign keys, so each fact lives in exactly one place.
A relation is in 1NF when it has a primary key, no repeating groups, and only atomic (indivisible) values. Each column has a single meaning and consistent type; each row is unique.
| OrderID | ProductNames |
|---------|---------------------|
| 1 | Pen, Pencil |
| 2 | Notebook |
| OrderID | ProductName |
|---------|-------------|
| 1 | Pen |
| 1 | Pencil |
| 2 | Notebook |
Tip: Use a surrogate key if needed for simplicity, but keep meaningful candidates (like a natural order number) UNIQUE to prevent accidental duplicates.
A relation is in 2NF if it’s in 1NF and every non-prime attribute (not part of any candidate key) is fully dependent on the entire candidate key. 2NF primarily addresses partial dependencies in tables with composite keys.
| OrderID | ProductID | ProductName |
|---------|-----------|-------------|
| 1 | P1 | Pen |
| 1 | P2 | Pencil |
Here, the candidate key is (OrderID, ProductID), but ProductName depends only on ProductID (a part of the key). That violates 2NF.
OrdersProducts(OrderID, ProductID)
Products(ProductID, ProductName)
Tip: Validate 2NF by asking “Does any non-prime attribute depend on only part of a composite key?” If yes, split by subject.
A relation is in 3NF if it’s in 2NF and has no transitive dependencies—that is, no non-prime attribute depends on another non-prime attribute. In notation: if A → B and B → C, then A → C is transitive; 3NF forbids storing C in the A table when B is a non-prime attribute.
| ProductID | ProductName | CategoryName |
|-----------|-------------|--------------|
| P1 | Pen | Stationery |
| P2 | Pencil | Stationery |
If ProductName → CategoryName, then CategoryName is transitively dependent on ProductID through ProductName. That’s a 3NF violation.
Products(ProductID, ProductName, CategoryID)
Categories(CategoryID, CategoryName)
Tip: In practice, make each determinant (e.g., CategoryID) the key of its own table. Enforce FOREIGN KEY constraints and add indexes for common join paths.
UNIQUE for natural identifiers.Normalization arose when entity-relationship analysis needed further refinement. You decompose tables to eliminate redundancy and bind them back together with keys and constraints. After each decomposition, test your result against the definitions of 1NF, 2NF, and 3NF. If the table still shows redundancy or anomalies, iterate.
Next steps in this module: