Database design is the process of structuring data efficiently so that it is easy to store, retrieve, update, and maintain. A well-designed database reduces redundancy, ensures data accuracy, improves performance, and supports future scalability. Two core pillars of database design are Normalization and Entity-Relationship (ER) modeling.
Normalization is the process of organizing data into tables in such a way that:
Normalization is applied through a series of normal forms, each building on the previous one.
CREATE TABLE employees_bad (
employee_id INT,
name VARCHAR(100),
phone_numbers VARCHAR(200)
);
Problem
phone_numbers stores multiple values in one columnCREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE employee_phones (
phone_id INT PRIMARY KEY,
employee_id INT,
phone_number VARCHAR(20),
FOREIGN KEY (employee_id) REFERENCES employees(employee_id)
);
Benefits
CREATE TABLE employee_departments_bad (
employee_id INT,
department_id INT,
department_name VARCHAR(50),
PRIMARY KEY (employee_id, department_id)
);
Problem
department_name depends only on department_idCREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(50)
);
CREATE TABLE employee_departments (
employee_id INT,
department_id INT,
PRIMARY KEY (employee_id, department_id),
FOREIGN KEY (employee_id) REFERENCES employees(employee_id),
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
Benefits
CREATE TABLE employees_bad (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
zip_code VARCHAR(10),
city VARCHAR(50)
);
Problem
city depends on zip_code, not directly on employee_idCREATE TABLE zip_codes (
zip_code VARCHAR(10) PRIMARY KEY,
city VARCHAR(50),
state VARCHAR(50)
);
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
zip_code VARCHAR(10),
FOREIGN KEY (zip_code) REFERENCES zip_codes(zip_code)
);
Benefits
Sometimes, databases are partially denormalized to:
Common in:
ER design visually and logically represents entities, attributes, and relationships in a database.
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(50)
);
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
Explanation
Real-World Examples
CREATE TABLE students (
student_id INT PRIMARY KEY,
student_name VARCHAR(100)
);
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100)
);
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY,
student_id INT,
course_id INT,
enrollment_date DATE,
grade VARCHAR(2),
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
Explanation
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
CREATE TABLE login_credentials (
login_id INT PRIMARY KEY,
employee_id INT UNIQUE,
username VARCHAR(50),
password_hash VARCHAR(255),
FOREIGN KEY (employee_id) REFERENCES employees(employee_id)
);
Explanation