Зачем используют нормализацию баз данных?

«Зачем используют нормализацию баз данных?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нормализация — это процесс организации данных в реляционной базе для минимизации избыточности и аномалий, а также для обеспечения целостности данных. Я применяю её, чтобы проектируемая схема БД была гибкой, эффективной и надёжной.

Решаемые проблемы (аномалии):

  • Аномалия обновления: При изменении данных (например, адреса клиента) нужно обновлять множество строк в разных местах, что ведёт к ошибкам и неконсистентности.
  • Аномалия добавления: Невозможно добавить данные об одном объекте (новый город), не добавив связанный с ним другой объект (клиента из этого города).
  • Аномалия удаления: Удаление одной записи (последний заказ клиента) может привести к потере другой информации (данные о самом клиенте).

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

  1. Устранение дублирования: Данные хранятся в одном месте. Например, информация о пользователе — в таблице users, а не копируется в каждую таблицу заказов или сообщений.
  2. Сохранение целостности: Изменения вносятся один раз. Связи обеспечиваются внешними ключами.
  3. Упрощение запросов и модификаций: Структура становится более логичной и предсказуемой.
  4. Экономия дискового пространства (хотя это не главная цель в современном мире).

Пример из практики: До нормализации (плохо):

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 (третьей нормальной форме), которая устраняет транзитивные зависимости.