Normalization in DBMS is the systematic process of organizing data in a relational database to reduce redundancy and eliminate insertion, update, and deletion anomalies. The process applies a series of rules called normal forms: 1NF (atomic values, no repeating groups), 2NF (1NF plus no partial dependencies), 3NF (2NF plus no transitive dependencies), and BCNF (3NF plus every determinant is a candidate key). Most production databases satisfy 3NF or BCNF for transactional data, with selective denormalization for reporting and analytics. Practical database design balances normalization (for data integrity) against denormalization (for read performance) based on the workload characteristics.
Worked SQL Example: Normalizing a Student-Course Table from Unnormalized to 3NF
-- UNNORMALIZED -- repeating groups in a single column
CREATE TABLE enrollments_unnormalized (
student_id INT,
student_name VARCHAR(50),
course_ids VARCHAR(100), -- '101,102,103' -- violates 1NF
course_names VARCHAR(200), -- 'Math,Physics,Chem' -- also violates 1NF
instructor VARCHAR(50)
);
-- 1NF -- atomic values, separate row per course
CREATE TABLE enrollments_1nf (
student_id INT,
student_name VARCHAR(50),
course_id INT,
course_name VARCHAR(50),
instructor VARCHAR(50)
);
-- student_name now repeats for every course a student takes -- partial dependency exists.
-- 2NF -- separate students from enrollments (assuming composite PK was student_id+course_id)
CREATE TABLE students_2nf (
student_id INT PRIMARY KEY,
student_name VARCHAR(50)
);
CREATE TABLE enrollments_2nf (
student_id INT REFERENCES students_2nf(student_id),
course_id INT,
course_name VARCHAR(50),
instructor VARCHAR(50),
PRIMARY KEY (student_id, course_id)
);
-- course_name and instructor still repeat per enrollment -- but they depend on course_id alone.
-- 3NF -- separate courses from enrollments (transitive dependency)
CREATE TABLE students_3nf (
student_id INT PRIMARY KEY,
student_name VARCHAR(50)
);
CREATE TABLE courses_3nf (
course_id INT PRIMARY KEY,
course_name VARCHAR(50),
instructor VARCHAR(50)
);
CREATE TABLE enrollments_3nf (
student_id INT REFERENCES students_3nf(student_id),
course_id INT REFERENCES courses_3nf(course_id),
PRIMARY KEY (student_id, course_id)
);
-- 3NF achieved: no partial dependencies, no transitive dependencies.
-- Updating an instructor now requires ONE row update (in courses), not every enrollment.Why Normalization Matters
Normalization is one of the most important concepts in relational database design. A well-normalized database eliminates three classes of errors (anomalies), saves storage, and makes maintenance simpler.






