Ответ
Нормализация — это процесс организации данных в реляционной базе данных с целью уменьшения избыточности данных и устранения аномалий (проблем при вставке, обновлении и удалении данных).
Основная цель — разбить большие таблицы на меньшие, хорошо структурированные таблицы и определить связи между ними.
Основные нормальные формы (НФ):
Первая нормальная форма (1НФ):
- Таблица является "плоской".
- Все атрибуты (колонки) являются атомарными (неделимыми), то есть в одной ячейке не может быть нескольких значений.
- Отсутствуют повторяющиеся группы столбцов (например,
product1
,product2
).
Вторая нормальная форма (2НФ):
- Таблица находится в 1НФ.
- Все неключевые атрибуты полностью зависят от составного первичного ключа. Если первичный ключ простой (состоит из одного поля), таблица в 1НФ автоматически находится и во 2НФ.
Третья нормальная форма (3НФ):
- Таблица находится в 2НФ.
- Отсутствуют транзитивные зависимости. Это означает, что неключевые атрибуты не должны зависеть от других неключевых атрибутов.
Существуют и другие формы (НФ Бойса-Кодда, 4НФ, 5НФ), но на практике чаще всего достаточно приведения к 3НФ.
Пример:
Предположим, у нас есть таблица заказов:
Orders (OrderID, CustomerID, CustomerName, ProductID, ProductName, Quantity)
Проблема:
CustomerName
зависит отCustomerID
, аProductName
— отProductID
. Это вызывает избыточность (имя клиента повторяется для каждого его заказа) и аномалии обновления (если клиент сменит имя, придется обновить все его заказы).Решение (приведение к 3НФ):
Customers (CustomerID, CustomerName)
Products (ProductID, ProductName)
Orders (OrderID, CustomerID, ProductID, Quantity)
Компромиссы и денормализация:
- Преимущества нормализации: целостность данных, отсутствие избыточности, гибкость.
- Недостаток: для получения полных данных требуется больше операций
JOIN
, что может снижать производительность на больших объемах данных.
В некоторых случаях для повышения скорости чтения данных применяют денормализацию — умышленное нарушение нормальных форм для объединения данных в одной таблице и уменьшения количества JOIN
'ов.