← Назад к вопросам

Что такое третья нормальная форма БД?

1.0 Junior🔥 182 комментариев
#Базы данных и SQL

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое третья нормальная форма (3NF)?

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

Ключевые условия для соответствия 3NF

Таблица находится в третьей нормальной форме, если выполняются два условия:

  1. Таблица уже находится во второй нормальной форме (2NF):

    • Удовлетворяет требованиям 1NF (атомарность данных, отсутствие повторяющихся групп).
    • Все неключевые атрибуты полносью зависят от всего первичного ключа (нет частичных зависимостей).
  2. Отсутствие транзитивных зависимостей:

    • Ни один неключевой атрибут не зависит от другого неключевого атрибута. Все неключевые атрибуты зависят только от первичного ключа.

Транзитивная зависимость: пример и решение

Рассмотрим пример таблицы Заказы, которая НЕ находится в 3NF:

-- НЕ соответствует 3NF
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    CustomerName VARCHAR(100),
    CustomerCity VARCHAR(50),
    CityPopulation INT  -- Население города клиента
);

Проблема: CityPopulation зависит от CustomerCity, которое зависит от CustomerID, создавая транзитивную зависимость:

OrderID → CustomerID → CustomerCity → CityPopulation

Рефакторинг в 3NF:

-- Таблица заказов (2NF)
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

-- Таблица клиентов (3NF)
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    CustomerName VARCHAR(100),
    CityID INT,
    FOREIGN KEY (CityID) REFERENCES Cities(CityID)
);

-- Таблица городов (3NF)
CREATE TABLE Cities (
    CityID INT PRIMARY KEY,
    CityName VARCHAR(50),
    Population INT
);

Практическая польза 3NF

  1. Устранение аномалий обновления:

    • Без 3NF изменение населения города потребовало бы обновления всех записей клиентов этого города.
    • В 3NF обновляем всего одну запись в таблице Cities.
  2. Снижение избыточности:

    • Данные о городах хранятся однократно, а не дублируются для каждого клиента.
  3. Согласованность данных:

    • Референциальная целостность через внешние ключи гарантирует корректность связей.

Когда можно отступать от 3NF

На практике иногда сознательно денормализуют базу данных:

  1. Для оптимизации запросов в системах OLAP (аналитические системы)
  2. В read-heavy приложениях, где важнее скорость чтения, чем согласованность
  3. В кэширующих таблицах для агрегированных данных

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

-- Денормализованная таблица для отчетов
CREATE TABLE OrderReports (
    OrderID INT,
    CustomerName VARCHAR(100),
    CustomerCity VARCHAR(50),  -- Дублируем city здесь
    TotalAmount DECIMAL(10,2),
    CityPopulation INT         -- Дублируем population
    -- Умышленно нарушаем 3NF для скорости формирования отчетов
);

Проверка соответствия 3NF

Чтобы проверить таблицу на соответствие 3NF:

  1. Убедитесь в выполнении 1NF и 2NF
  2. Для каждого неключевого атрибута спросите: "Зависит ли этот атрибут от первичного ключа, а не от другого неключевого атрибута?"
  3. Если находится зависимость между неключевыми атрибутами — требуется декомпозиция.

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