Sobes.tech
Назад к вопросам
Junior — Middle
57

Объясните концепцию третьей нормальной формы в реляционной базе данных и зачем она нужна.

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Третья нормальная форма нужна, чтобы убрать избыточность и зависимость неключевых полей друг от друга. Таблица в 3НФ не должна содержать транзитивных зависимостей: каждый неключевой атрибут должен зависеть только от ключа, а не от другого неключевого атрибута. Это упрощает поддержку данных и снижает риск аномалий при вставке, обновлении и удалении.

Определение:

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

Практический смысл 3НФ — хранить один факт в одном месте. Если одно и то же значение дублируется в нескольких строках, появляются риски рассинхронизации и лишние обновления.

Пример использования:

Допустим, есть таблица Orders:

OrderId CustomerId CustomerName CustomerCity
1 10 Иван Москва
2 11 Анна Казань

Здесь CustomerName и CustomerCity зависят не от OrderId, а от CustomerId. Это транзитивная зависимость, и таблица не в 3НФ.

Лучше разделить данные:

CREATE TABLE Customers (
    CustomerId INT PRIMARY KEY,
    CustomerName NVARCHAR(100) NOT NULL,
    CustomerCity NVARCHAR(100) NOT NULL
);

CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    CustomerId INT NOT NULL,
    FOREIGN KEY (CustomerId) REFERENCES Customers(CustomerId)
);

Теперь данные о клиенте хранятся отдельно, а заказ ссылается на клиента по CustomerId.

Пояснение кода:

Код нужен, чтобы показать, как 3НФ выглядит на практике.

  1. В Customers хранится информация только о клиенте.
  2. В Orders хранится только сам заказ и ссылка на клиента.
  3. Имя и город клиента не дублируются в каждой строке заказов.
  4. Если город клиента изменится, достаточно обновить одну запись в Customers.
  5. Если удалить заказ, данные о клиенте не потеряются.

Ключевые моменты:

  • 3НФ устраняет транзитивные зависимости.
  • Каждый неключевой атрибут должен зависеть только от ключа.
  • Нормализация уменьшает дублирование данных.
  • 3НФ снижает риск аномалий вставки, обновления и удаления.
  • На практике 3НФ часто достигается разбиением одной широкой таблицы на несколько связанных таблиц.
  • Иногда в реальных системах допускают денормализацию ради производительности, но осознанно.