Ответ
Нормализация — это процесс организации данных в реляционной базе для минимизации избыточности и аномалий, а также для обеспечения целостности данных. Я применяю её, чтобы проектируемая схема БД была гибкой, эффективной и надёжной.
Решаемые проблемы (аномалии):
- Аномалия обновления: При изменении данных (например, адреса клиента) нужно обновлять множество строк в разных местах, что ведёт к ошибкам и неконсистентности.
- Аномалия добавления: Невозможно добавить данные об одном объекте (новый город), не добавив связанный с ним другой объект (клиента из этого города).
- Аномалия удаления: Удаление одной записи (последний заказ клиента) может привести к потере другой информации (данные о самом клиенте).
Практическая польза:
- Устранение дублирования: Данные хранятся в одном месте. Например, информация о пользователе — в таблице
users, а не копируется в каждую таблицу заказов или сообщений. - Сохранение целостности: Изменения вносятся один раз. Связи обеспечиваются внешними ключами.
- Упрощение запросов и модификаций: Структура становится более логичной и предсказуемой.
- Экономия дискового пространства (хотя это не главная цель в современном мире).
Пример из практики: До нормализации (плохо):
CREATE TABLE orders (
order_id INT,
customer_name VARCHAR(100), -- Дублируется для каждого заказа
customer_phone VARCHAR(20), -- Дублируется для каждого заказа
product_name VARCHAR(100),
order_date DATE
);
После нормализации (хорошо):
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
phone VARCHAR(20)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT REFERENCES customers(customer_id), -- Ссылка по внешнему ключу
product_name VARCHAR(100),
order_date DATE
);
В работе я обычно стремлюсь к 3NF (третьей нормальной форме), которая устраняет транзитивные зависимости.