Что такое третья нормальная форма (3NF) в реляционных базах данных?

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

Ответ

Третья нормальная форма (3NF) — это правило проектирования реляционных баз данных, которое устраняет транзитивные зависимости неключевых атрибутов от первичного ключа. Таблица находится в 3NF, если:

  1. Она находится во второй нормальной форме (2NF) (нет частичных зависимостей неключевых атрибутов от составного ключа).
  2. Каждый неключевой атрибут нетранзитивно зависит от первичного ключа. Это означает, что неключевые атрибуты не должны зависеть друг от друга.

Проще: В таблице не должно быть ситуации, когда 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 остались только атрибуты, напрямую зависящие от её первичного ключа. Аномалии устранены.