Ответ
Третья нормальная форма (3NF) — это правило проектирования реляционных баз данных, которое устраняет транзитивные зависимости неключевых атрибутов от первичного ключа. Таблица находится в 3NF, если:
- Она находится во второй нормальной форме (2NF) (нет частичных зависимостей неключевых атрибутов от составного ключа).
- Каждый неключевой атрибут нетранзитивно зависит от первичного ключа. Это означает, что неключевые атрибуты не должны зависеть друг от друга.
Проще: В таблице не должно быть ситуации, когда A → B → C, где A — первичный ключ, а B и C — неключевые атрибуты.
Пример нарушения 3NF:
| order_id (PK) | customer_id | customer_name | product | quantity |
|---|---|---|---|---|
| 1001 | CUST77 | Иванов Иван | Монитор | 1 |
| 1002 | CUST77 | Иванов Иван | Клавиатура | 2 |
Проблема: Атрибут customer_name зависит не напрямую от первичного ключа order_id, а от другого неключевого атрибута customer_id (транзитивная зависимость: order_id → customer_id → customer_name). Это приводит к аномалиям:
- Избыточность: Имя клиента повторяется в каждой его заказе.
- Аномалия обновления: Чтобы изменить имя клиента, нужно обновить все его заказы.
- Аномалия удаления: Удаление последнего заказа клиента может привести к потере информации о его имени.
Приведение к 3NF (декомпозиция):
-- Таблица заказов (Order)
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT, -- Внешний ключ
product VARCHAR(100),
quantity INT
);
-- Таблица клиентов (Customer)
CREATE TABLE Customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100)
);
-- Добавляем связь
ALTER TABLE Orders ADD FOREIGN KEY (customer_id) REFERENCES Customers(customer_id);
Теперь customer_name зависит только от первичного ключа Customers.customer_id, а в таблице Orders остались только атрибуты, напрямую зависящие от её первичного ключа. Аномалии устранены.