Нормализация базы данных — это процесс организации структуры реляционной БД для минимизации избыточности и аномалий данных. Существует несколько стандартных нормальных форм, каждая из которых представляет определенный уровень строгости в проектировании.
Требования:
Пример нарушения:
CREATE TABLE orders (
order_id INT,
customer VARCHAR(100),
products VARCHAR(500) -- Список товаров через запятую (нарушение)
);
Исправленный вариант:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT
);
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY,
order_id INT,
product_id INT,
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
Требования:
Пример нарушения:
CREATE TABLE order_items (
order_id INT,
product_id INT,
product_name VARCHAR(100), -- Частичная зависимость (только от product_id)
quantity INT,
PRIMARY KEY (order_id, product_id)
);
Требования:
Пример нарушения:
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
dept_id INT,
dept_name VARCHAR(100), -- Транзитивная зависимость (зависит от dept_id)
salary INT
);
Требования:
Пример нарушения:
CREATE TABLE student_courses (
student_id INT,
course_id INT,
professor_id INT, -- Профессор зависит от курса, но курс не суперключ
PRIMARY KEY (student_id, course_id)
);
Требования:
Пример нарушения:
CREATE TABLE employee_skills_languages (
emp_id INT,
skill VARCHAR(100),
language VARCHAR(100),
PRIMARY KEY (emp_id, skill, language)
);
Требования:
Форма | Решаемая проблема | Критерий |
---|---|---|
1NF | Атомарность данных | Нет составных атрибутов |
2NF | Частичные зависимости | Полная функциональная зависимость |
3NF | Транзитивные зависимости | Нет зависимостей между неключевыми полями |
BCNF | Зависимости от неключевых атрибутов | Все детерминанты - суперключи |
4NF | Многозначные зависимости | Нет независимых многозначных зависимостей |
5NF | Зависимости соединения | Нет возможности дальнейшего декомпозирования без потерь |
Пример полной нормализации:
-- Полностью нормализованная структура (3NF)
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100) UNIQUE
);
CREATE TABLE products (
product_id INT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
Резюмируем: нормальные формы представляют собой иерархию требований к структуре базы данных, где каждая последующая форма устраняет определенные типы аномалий. Понимание этих форм критически важно для проектирования эффективных и надежных реляционных баз данных.