TEC-DATA86-02 · Lesson 4 · 14 clock hours · theory
Normalization: 1NF through 3NF
Objective. Students will identify violations of First, Second, and Third Normal Form in a given table and decompose it into 3NF-compliant tables without losing data or functional dependencies.
⚠ Pending professional review
This lesson, its worked examples and its practice questions has not yet been verified by an industry-certified professional or by a certification or approval body. It is a study draft and may contain errors. Do not use it as instructions for work on a job site or on live equipment. Always follow your instructor, your supervising professional, and current official references and regulations.
VoTechWorks program approval and accreditation are still in progress. Credentials are issued only by the certifying bodies named in each program, after their own exams.
What Is Normalization?
Normalization is the process of organizing a relational database so that data is stored efficiently, redundancy is minimized, and data integrity is protected. The core tool is a set of rules called normal forms. Each normal form builds on the previous one. In this lesson you will work through the first three normal forms: 1NF, 2NF, and 3NF. Mastering these three is the practical foundation for every certification exam covered in this program and for real DBA work on the job.
Before starting, note one professional responsibility: poorly normalized schemas are a common source of data corruption and silent data loss. A DBA who introduces or ignores normalization problems can damage production data. Always test decompositions with real data samples before deploying schema changes, and always keep verified backups before any structural alteration.
---
First Normal Form (1NF)
A table is in First Normal Form when:
1. Every column holds atomic (indivisible) values — no lists, no comma-separated strings, no repeating groups stuffed into one cell.
2. Every row is unique — the table has a primary key.
3. There are no repeating column groups (for example, `skill1`, `skill2`, `skill3` columns).
Common violation — repeating groups in columns: An invoice table might have columns `Item1`, `Item2`, `Item3`. If an invoice has four items, the design breaks down. The fix is to move repeating data into its own table.
Common violation — non-atomic values: A single `Address` cell containing `123 Main St, Springfield, IL 62701` violates atomicity if you ever need to filter by city or state. Break it into `StreetAddress`, `City`, `State`, `ZIPCode`.
After applying 1NF, each cell holds exactly one value and each row is uniquely identifiable.
---
Second Normal Form (2NF)
A table is in Second Normal Form when:
1. It is already in 1NF.
2. Every non-key attribute is fully functionally dependent on the entire primary key — not just part of it.
This rule only matters when the primary key is composite (made of two or more columns). If your primary key is a single column, you cannot have a partial dependency.
Partial dependency — the violation: Suppose a table `ProjectAssignment` has the composite key (`EmployeeID`, `ProjectID`). The column `EmployeeName` depends only on `EmployeeID`, not on the combination. That is a partial dependency and violates 2NF.
The fix: Move `EmployeeName` (and any other attribute that depends only on `EmployeeID`) into a separate `Employee` table keyed on `EmployeeID`. Keep only the key columns and attributes that genuinely require both keys in `ProjectAssignment`.
Decomposition must be lossless: you must be able to rejoin the tables on their shared key and recover every original row without inventing rows or losing rows.
---
Third Normal Form (3NF)
A table is in Third Normal Form when:
1. It is already in 2NF.
2. No non-key attribute is transitively dependent on the primary key through another non-key attribute.
Transitive dependency — the violation: In an `Employee` table, suppose `EmployeeID → DepartmentID` and `DepartmentID → DepartmentName`. That means `EmployeeID → DepartmentName` through `DepartmentID`. `DepartmentName` is transitively dependent on the primary key and should not live in the `Employee` table.
The fix: Move `DepartmentName` (and any attribute that depends on `DepartmentID`) into a `Department` table keyed on `DepartmentID`. The `Employee` table retains `DepartmentID` as a foreign key.
Boyce-Codd Normal Form (BCNF) is a slightly stronger version of 3NF and appears on some exam questions. For most practical design work, 3NF is the target.
---
Lossless Join — Why It Matters
Every decomposition step must pass the lossless-join test: when you rejoin the decomposed tables on the shared key column(s), you must get back exactly the original table — no extra (spurious) rows, no missing rows. To verify, manually join your decomposed tables using a small data sample and compare the result to the original. This is a required check in professional practice and is tested on all four credentials in this program.
---
Preservation of Functional Dependencies
Decomposition should also preserve functional dependencies — the logical rules that say one attribute determines another. If a dependency is lost during decomposition, the database can no longer enforce that business rule through the schema alone. In some cases (particularly with BCNF) you must choose between lossless join and dependency preservation; 3NF always allows both.
---
Step-by-Step Summary
| Step | Question to Ask | Action If Violated |
|------|----------------|--------------------|
| 1NF | Are all values atomic? Is there a primary key? Any repeating groups? | Remove repeating groups; add a primary key |
| 2NF | Does every non-key column depend on the whole composite key? | Move partially dependent columns to a new table |
| 3NF | Does any non-key column depend on another non-key column? | Move transitively dependent columns to a new table |
Always work in order: fix 1NF before checking 2NF, fix 2NF before checking 3NF.
---
Professional Notes
Over-normalization can hurt read performance on large data sets. DBAs sometimes intentionally denormalize (accept some redundancy) for reporting tables or data warehouses, but this is a deliberate, documented decision — not an oversight. For OLTP (transaction-processing) systems, 3NF is the standard target. Document every design decision so future DBAs understand the rationale.
Key terms10
NormalizationThe process of restructuring a relational database schema to reduce redundancy and protect data integrity by applying a series of formal rules called normal forms.
Functional DependencyA relationship in which the value of one attribute (or set of attributes) uniquely determines the value of another attribute; written A → B, meaning A determines B.
Atomic ValueA column value that is indivisible and holds exactly one piece of information, with no lists, sets, or repeating groups embedded in a single cell.
Partial DependencyA situation in which a non-key attribute depends on only part of a composite primary key rather than on the full key; a violation of 2NF.
Transitive DependencyA situation in which a non-key attribute depends on the primary key indirectly through another non-key attribute; a violation of 3NF.
Lossless JoinA property of a decomposition that guarantees the original table can be fully reconstructed by joining the decomposed tables — with no spurious rows added and no rows lost.
Composite Primary KeyA primary key made up of two or more columns whose combined values uniquely identify each row in a table.
Repeating GroupA set of columns or values that represent multiple instances of the same type of data within a single row, violating 1NF.
DecompositionThe act of splitting one table into two or more tables to eliminate a normalization violation while preserving all original data and relationships.
BCNF (Boyce-Codd Normal Form)A normal form slightly stronger than 3NF that requires every determinant in a table to be a candidate key; used when 3NF still leaves certain anomalies.
Worked examples4
1. The table below is NOT in 1NF. Identify the violation and decompose it into 1NF.
Invoice(InvoiceID, CustomerName, Items)
Sample row: (1001, 'Acme Corp', 'Bolt, Nut, Washer')
Items is a comma-separated list of product names in one cell.
Step 1 — Identify the violation: The 'Items' column contains multiple values ('Bolt, Nut, Washer') in a single cell. This is a non-atomic value and a repeating group, violating 1NF.
Step 2 — Design the fix: Move the repeating data to its own table. Create InvoiceLine(InvoiceID, LineNum, ItemName) so each row holds exactly one item. InvoiceID + LineNum together form the composite primary key.
Step 3 — Revise the original table: Invoice(InvoiceID, CustomerName) — the 'Items' column is removed; each invoice's line items live in InvoiceLine.
Step 4 — Verify atomicity: In InvoiceLine, every cell holds one indivisible value. In Invoice, every cell holds one indivisible value. Both tables now satisfy 1NF.
Answer: Two tables in 1NF:
• Invoice(InvoiceID PK, CustomerName)
• InvoiceLine(InvoiceID FK, LineNum, ItemName) — composite PK: (InvoiceID, LineNum)
Each cell is atomic; repeating group is eliminated.
2. The table below is in 1NF but NOT in 2NF. Identify the violation and decompose it.
OrderItem(OrderID, ProductID, ProductName, Quantity)
Primary key: (OrderID, ProductID)
Sample rows:
(5001, P10, 'Bolt', 50)
(5001, P11, 'Nut', 30)
(5002, P10, 'Bolt', 20)
Step 1 — List all functional dependencies: (OrderID, ProductID) → Quantity (full dependency — both key parts needed). ProductID → ProductName (partial dependency — only one key part needed).
Step 2 — Identify the violation: 'ProductName' depends only on 'ProductID', not on the full composite key (OrderID, ProductID). This is a partial dependency, violating 2NF. Notice 'Bolt' is repeated for every order that includes ProductID P10 — classic update anomaly.
Step 3 — Decompose: Remove 'ProductName' from OrderItem and place it in a new Product table keyed on ProductID.
Step 4 — Result: Product(ProductID PK, ProductName) and OrderItem(OrderID, ProductID FK, Quantity) with composite PK (OrderID, ProductID). Verify lossless join by joining on ProductID — you recover every original row.
Answer: Two tables in 2NF:
• Product(ProductID PK, ProductName)
• OrderItem(OrderID, ProductID FK, Quantity) — composite PK: (OrderID, ProductID)
No partial dependency remains.
3. The table below is in 2NF but NOT in 3NF. Identify the violation and decompose it.
Employee(EmployeeID, EmployeeName, DepartmentID, DepartmentName)
Primary key: EmployeeID (single-column, so 2NF is already satisfied)
Sample rows:
(E01, 'Jordan', D10, 'Engineering')
(E02, 'Riley', D10, 'Engineering')
(E03, 'Morgan', D20, 'Marketing')
Step 2 — Identify the violation: EmployeeID → DepartmentID, and DepartmentID → DepartmentName. Therefore EmployeeID → DepartmentName transitively through DepartmentID. 'DepartmentName' is a non-key attribute that depends on another non-key attribute (DepartmentID), violating 3NF. If the department is renamed, every employee row must be updated — an update anomaly.
Step 3 — Decompose: Move DepartmentName (and anything else determined solely by DepartmentID) into a Department table. Keep DepartmentID in Employee as a foreign key.
Step 4 — Verify: Join Employee and Department on DepartmentID to recover all original data. No spurious rows, no missing rows — lossless join confirmed.
Answer: Two tables in 3NF:
• Department(DepartmentID PK, DepartmentName)
• Employee(EmployeeID PK, EmployeeName, DepartmentID FK)
No transitive dependency remains; update anomaly eliminated.
4. A student claims the following table is already in 3NF. Is the student correct? Table: CourseSection(SectionID, CourseID, CourseName, InstructorID, InstructorEmail). PK: SectionID. Additional FDs: CourseID → CourseName; InstructorID → InstructorEmail.
Step 2 — Check 2NF: Primary key is a single column (SectionID), so no partial dependency is possible. 2NF satisfied.
Step 3 — Check 3NF: Are there transitive dependencies? SectionID → CourseID, and CourseID → CourseName, so SectionID → CourseName transitively. Also SectionID → InstructorID, and InstructorID → InstructorEmail, so SectionID → InstructorEmail transitively. Both CourseName and InstructorEmail depend on non-key attributes — two transitive dependencies exist. 3NF is VIOLATED.
Step 4 — Decompose: Create Course(CourseID PK, CourseName) and Instructor(InstructorID PK, InstructorEmail). CourseSection retains (SectionID PK, CourseID FK, InstructorID FK). Join on CourseID and InstructorID to recover the full original table.
Answer: The student is INCORRECT. The table has two transitive dependencies. After decomposition, three 3NF-compliant tables are:
• Course(CourseID PK, CourseName)
• Instructor(InstructorID PK, InstructorEmail)
• CourseSection(SectionID PK, CourseID FK, InstructorID FK)
In class: Lecture with worked examples: instructor presents the definition of each normal form, demonstrates a violation, and walks through decomposition using a running 'employee-project-department' example on the projector. · Normalization worksheet: students receive an un-normalized invoice table with repeating groups, partial dependencies, and transitive dependencies; they decompose it step-by-step, labeling each violation and the normal form achieved after each step. · Group discussion: each student group presents one normalization step to the class and explains why the decomposition preserves the original data (lossless join) using a join example. Materials: Normalization rules reference handout, un-normalized invoice table dataset, decomposition worksheet, projector, whiteboard Check: Instructor scores the completed decomposition worksheet: each step labeled correctly (violation identified, NF named, correct decomposition). Pass: all three decomposition stages correct with violations correctly labeled (70% of rubric points).
Practice check8
Answer each question, then check it. Nothing is recorded; this is your own practice.
Relational database design and normalization
1. A table has the column 'PhoneNumbers' containing the value '555-1234, 555-5678' for a single customer row. Which normal form rule does this violate?
Relational database design and normalization
2. Table: Enrollment(StudentID, CourseID, StudentEmail, Grade). Primary key: (StudentID, CourseID). The column StudentEmail depends only on StudentID. Which statement is correct?
Relational database design and normalization
3. After decomposing a table to remove a partial dependency, a student produces two tables. To confirm the decomposition is lossless, the student should:
Relational database design and normalization
4. In a table Employee(EmpID, EmpName, DeptID, DeptLocation), the primary key is EmpID. The dependency DeptID → DeptLocation exists. What is the correct diagnosis?
Relational database design and normalization
5. Which of the following decompositions correctly resolves the 3NF violation in Employee(EmpID, EmpName, DeptID, DeptLocation) where DeptID → DeptLocation?
Relational database design and normalization
6. A table with a single-column primary key and all atomic values is confirmed to be in 1NF. A classmate says it might still violate 2NF. Is the classmate correct?
Relational database design and normalization
7. Which scenario BEST illustrates an update anomaly caused by a transitive dependency?
Data governance and data quality (DAMA CDMP)
8. For the DAMA CDMP Associate exam, data quality and data governance are core domains. How does normalizing a schema to 3NF directly support data quality goals?
Record this lesson on my transcript.Sign in with your key and enrollment email to record lessons (enroll free if you have no key). This page stays open to read and practise.
A free tech program — complimentary, as our commitment to get America working. Help us build VoTechWorks. Tell us what works, what doesn’t, and what you want to learn.