Что такое нормализация базы данных?sql-19

Нормализация базы данных — это процесс организации данных в реляционной базе для минимизации избыточности и аномалий при вставке, обновлении и удалении данных. Это многоэтапный метод проектирования базы данных, который следует определенным правилам (нормальным формам).

Основные цели нормализации

  1. Устранение избыточности данных
    Каждый факт должен храниться только в одном месте

  2. Предотвращение аномалий

    • Аномалии вставки (нельзя добавить данные без других данных)
    • Аномалии обновления (необходимость изменять данные в нескольких местах)
    • Аномалии удаления (потеря информации при удалении записей)
  3. Обеспечение логической целостности
    Четкие связи между таблицами через ключи

Нормальные формы

1. Первая нормальная форма

  • Все атрибуты атомарны (неделимы)
  • Нет повторяющихся групп
  • Определен первичный ключ

Пример нарушения:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    products VARCHAR(500) -- Список товаров через запятую (нарушение 1NF)
);

Исправленный вариант:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

CREATE TABLE order_items (
    order_item_id INT PRIMARY KEY,
    order_id INT,
    product_id INT,
    quantity INT,
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

2. Вторая нормальная форма

  • Соответствует 1NF
  • Все неключевые атрибуты зависят от всего первичного ключа (нет частичных зависимостей)

Пример нарушения:

CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    product_name VARCHAR(100), -- Зависит только от product_id
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);

3. Третья нормальная форма

  • Соответствует 2NF
  • Нет транзитивных зависимостей (неключевые атрибуты не зависят от других неключевых атрибутов)

Пример нарушения:

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    dept_name VARCHAR(100), -- Зависит от dept_id, а не от emp_id
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

Дополнительные нормальные формы

Нормальная форма Бойса-Кодда

  • Усиленная версия 3NF
  • Для таблиц, где потенциальные ключи могут пересекаться

Четвертая нормальная форма

  • Нет многозначных зависимостей

Пятая нормальная форма

  • Нет зависимостей соединения

Денормализация

В некоторых случаях (особенно для аналитических систем) применяют осознанную денормализацию для повышения производительности за счет:

  • Хранения вычисляемых данных
  • Повторения информации
  • Объединения таблиц

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

CREATE TABLE order_summary (
    order_id INT PRIMARY KEY,
    customer_name VARCHAR(100), -- Дублируем из customers
    total_amount DECIMAL(10,2), -- Вычисляемое поле
    item_count INT -- Вычисляемое поле
);

Практические рекомендации

  1. Начинайте с полной нормализации
  2. Денормализуйте только при доказанной необходимости
  3. Используйте представления (views) для сложных запросов
  4. Документируйте причины денормализации

Резюмируем: нормализация — это фундаментальный процесс проектирования реляционных баз данных, который обеспечивает целостность данных и устраняет аномалии. Хотя полная нормализация не всегда практична, понимание нормальных форм позволяет принимать осознанные решения о структуре базы данных.