Что такое нормализация баз данных и какие цели она преследует

«Что такое нормализация баз данных и какие цели она преследует» — вопрос из категории Базы данных, который задают на 23% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нормализация — это процесс структурирования реляционной базы данных для уменьшения избыточности данных и улучшения их целостности. Основная цель — разбить большие таблицы на более мелкие и четко определенные, установив между ними связи.

Ключевые цели:

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

Пример (до и после 1НФ и 2НФ):

До нормализации (одна таблица):

-- Избыточность: имя и адрес клиента повторяются для каждого заказа
-- Аномалия обновления: для смены адреса клиента нужно обновить несколько строк
CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    customer_address VARCHAR(255),
    product_name VARCHAR(100),
    quantity INT
);

После нормализации:

CREATE TABLE Customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    address VARCHAR(255)
);

CREATE TABLE Products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100)
);

CREATE TABLE Orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    product_id INT,
    quantity INT,
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id),
    FOREIGN KEY (product_id) REFERENCES Products(product_id)
);

Чаще всего на практике базы данных приводят к третьей нормальной форме (3НФ), так как она обеспечивает хороший баланс между устранением избыточности и сложностью запросов. В некоторых случаях для повышения производительности чтения намеренно применяют денормализацию.