Что такое третья нормальная форма БД?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое третья нормальная форма (3NF)?
Третья нормальная форма (3NF) — это фундаментальный принцип проектирования реляционных баз данных, который устраняет транзитивные зависимости между неключевыми атрибутами, обеспечивая минимальную избыточность данных и предотвращая аномалии при операциях обновления, вставки и удаления.
Ключевые условия для соответствия 3NF
Таблица находится в третьей нормальной форме, если выполняются два условия:
-
Таблица уже находится во второй нормальной форме (2NF):
- Удовлетворяет требованиям 1NF (атомарность данных, отсутствие повторяющихся групп).
- Все неключевые атрибуты полносью зависят от всего первичного ключа (нет частичных зависимостей).
-
Отсутствие транзитивных зависимостей:
- Ни один неключевой атрибут не зависит от другого неключевого атрибута. Все неключевые атрибуты зависят только от первичного ключа.
Транзитивная зависимость: пример и решение
Рассмотрим пример таблицы Заказы, которая НЕ находится в 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
-
Устранение аномалий обновления:
- Без 3NF изменение населения города потребовало бы обновления всех записей клиентов этого города.
- В 3NF обновляем всего одну запись в таблице
Cities.
-
Снижение избыточности:
- Данные о городах хранятся однократно, а не дублируются для каждого клиента.
-
Согласованность данных:
- Референциальная целостность через внешние ключи гарантирует корректность связей.
Когда можно отступать от 3NF
На практике иногда сознательно денормализуют базу данных:
- Для оптимизации запросов в системах OLAP (аналитические системы)
- В read-heavy приложениях, где важнее скорость чтения, чем согласованность
- В кэширующих таблицах для агрегированных данных
Пример денормализации для производительности:
-- Денормализованная таблица для отчетов
CREATE TABLE OrderReports (
OrderID INT,
CustomerName VARCHAR(100),
CustomerCity VARCHAR(50), -- Дублируем city здесь
TotalAmount DECIMAL(10,2),
CityPopulation INT -- Дублируем population
-- Умышленно нарушаем 3NF для скорости формирования отчетов
);
Проверка соответствия 3NF
Чтобы проверить таблицу на соответствие 3NF:
- Убедитесь в выполнении 1NF и 2NF
- Для каждого неключевого атрибута спросите: "Зависит ли этот атрибут от первичного ключа, а не от другого неключевого атрибута?"
- Если находится зависимость между неключевыми атрибутами — требуется декомпозиция.
3NF является стандартом де-факто для большинства операционных баз данных (OLTP-систем), обеспечивая оптимальный баланс между целостностью данных и гибкостью структуры. Однако важно помнить, что нормализация — это инструмент, а не догма, и ее применение должно соответствовать конкретным требованиям проекта.