Ответ
Третья нормальная форма (3NF) устраняет транзитивные зависимости между атрибутами таблицы. Она требует, чтобы каждый неключевой атрибут зависел только от первичного ключа, а не от других неключевых атрибутов. Это минимизирует избыточность данных и аномалии при обновлении.
Проблема (нарушение 3NF):
Предположим, есть таблица Заказы: |
order_id (PK) | customer_id | customer_name | product |
|---|---|---|---|---|
| 1 | 101 | Иван Петров | Книга | |
| 2 | 101 | Иван Петров | Ручка |
Здесь customer_name зависит не от первичного ключа order_id, а от неключевого атрибута customer_id. Это приводит к:
- Избыточности: Имя клиента повторяется в каждой строке его заказа.
- Аномалии обновления: Чтобы изменить имя клиента, нужно обновить все его заказы.
- Аномалии удаления: Удаление последнего заказа клиента может привести к потере информации о его имени.
Решение (приведение к 3NF): Таблица разбивается на две, устраняя транзитивную зависимость.
-- Таблица 1: Заказы
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
product VARCHAR(100),
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);
-- Таблица 2: Клиенты
CREATE TABLE Customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(100)
);
Теперь customer_name хранится в одном месте, что исключает аномалии.