Какую проблему решает третья нормальная форма (3NF) при проектировании базы данных?

«Какую проблему решает третья нормальная форма (3NF) при проектировании базы данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Третья нормальная форма (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 хранится в одном месте, что исключает аномалии.