Ответ
Нормальная форма (НФ) — это набор правил для проектирования схемы реляционной базы данных, целью которых является устранение избыточности данных и аномалий при операциях вставки, обновления и удаления (аномалии модификации). Нормализация разбивает большие таблицы на меньшие, связанные отношения.
Основные нормальные формы:
-
Первая нормальная форма (1НФ):
- Все значения атрибутов атомарны (неделимы).
- В таблице нет повторяющихся групп или массивов.
-- Ненормализованная таблица (нарушает 1НФ) CREATE TABLE Orders ( order_id INT PRIMARY KEY, customer_name VARCHAR(100), items VARCHAR(500) -- Список товаров через запятую: 'Монитор,Клавиатура,Мышь' );
-- 1НФ: Каждый товар в отдельной строке CREATE TABLE OrderItems ( order_id INT, item_name VARCHAR(100), FOREIGN KEY (order_id) REFERENCES Orders(order_id) );
-
Вторая нормальная форма (2НФ):
- Таблица должна находиться в 1НФ.
- Все неключевые атрибуты полностью зависят от всего составного первичного ключа (нет частичных зависимостей).
- Актуально для таблиц с составными первичными ключами.
-
Третья нормальная форма (3НФ):
- Таблица должна находиться в 2НФ.
- Нет транзитивных зависимостей: неключевые атрибуты не должны зависеть от других неключевых атрибутов, а только от первичного ключа.
-- Нарушает 3НФ: customer_city зависит от customer_id, а не от order_id. CREATE TABLE Orders ( order_id INT PRIMARY KEY, customer_id INT, customer_city VARCHAR(50), -- Транзитивная зависимость! total_amount DECIMAL );
-- 3НФ: Выносим информацию о клиенте в отдельную таблицу. CREATE TABLE Customers ( customer_id INT PRIMARY KEY, city VARCHAR(50) ); CREATE TABLE Orders ( order_id INT PRIMARY KEY, customer_id INT, total_amount DECIMAL, FOREIGN KEY (customer_id) REFERENCES Customers(customer_id) );
-
Нормальная форма Бойса-Кодда (BCNF):
- Усиленная 3НФ. Каждая детерминанта (атрибут, от которого функционально зависит другой) должен быть потенциальным ключом.
На практике проектирование часто останавливается на 3НФ или BCNF, так как дальнейшая нормализация (4НФ, 5НФ) решает более специфичные проблемы и может чрезмерно усложнить схему, увеличив количество JOIN-операций.