← Назад к вопросам

Что такое нормализация БД?

1.0 Junior🔥 111 комментариев
#Базы данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

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

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

  1. Устранение дублирования данных — хранение каждого факта в одном месте.
  2. Предотвращение аномалий:
    • Аномалии вставки: невозможность добавить данные без наличия связанных данных (например, нельзя добавить сотрудника без отдела).
    • Аномалии обновления: необходимость изменять одни и те же данные в нескольких местах.
    • Аномалии удаления: потеря связанных данных при удалении записи (например, удаление отдела приводит к потере информации о сотрудниках).
  3. Обеспечение целостности данных через использование внешних ключей и связей.
  4. Упрощение запросов и повышение гибкости структуры данных.

Нормальные формы (НФ)

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

Первая нормальная форма (1НФ)

Таблица находится в 1НФ, если:

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

Пример нарушения 1НФ:

-- Ненормализованная таблица
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    phones VARCHAR(200) -- Может содержать несколько номеров через запятую
);

Приведение к 1НФ:

-- Выносим телефоны в отдельную таблицу
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE employee_phones (
    id INT PRIMARY KEY AUTO_INCREMENT,
    employee_id INT,
    phone VARCHAR(20),
    FOREIGN KEY (employee_id) REFERENCES employees(id)
);

Вторая нормальная форма (2НФ)

Таблица находится во 2НФ, если:

  • Она уже в 1НФ.
  • Все неключевые атрибуты полностью зависят от всего первичного ключа (а не от его части). Актуально для таблиц с составными первичными ключами.

Пример:

-- Таблица заказов с нарушением 2НФ
CREATE TABLE orders (
    order_id INT,
    product_id INT,
    product_name VARCHAR(100), -- Зависит только от product_id, а не от всего ключа
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);
-- Приведение к 2НФ: выносим product_name в таблицу products

Третья нормальная форма (3НФ)

Таблица находится в 3НФ, если:

  • Она уже во 2НФ.
  • Все неключевые атрибуты зависят только от первичного ключа, и нет транзитивных зависимостей (когда атрибут зависит от другого неключевого атрибута).

Пример нарушения 3НФ:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    department_id INT,
    department_city VARCHAR(50) -- Зависит от department_id, а не от id сотрудника
);
-- department_city нужно вынести в таблицу departments

Высшие нормальные формы

  • Нормальная форма Бойса-Кодда (BCNF) — усиленная версия 3НФ, устраняющая аномалии, связанные с функциональными зависимостями кандидатных ключей.
  • Четвёртая нормальная форма (4НФ) — устраняет многозначные зависимости.
  • Пятая нормальная форма (5НФ) — устраняет зависимости соединения.

Практическое применение в Go

При работе с Go и реляционными базами данных (PostgreSQL, MySQL) нормализация напрямую влияет на структуру моделей и эффективность запросов. Например, в GORM (популярный ORM для Go) нормализованные таблицы удобно отображаются в виде связанных структур:

// Модели для нормализованной структуры
type Department struct {
    ID   uint   `gorm:"primaryKey"`
    Name string
    City string
}

type Employee struct {
    ID           uint   `gorm:"primaryKey"`
    Name         string
    DepartmentID uint
    Department   Department `gorm:"foreignKey:DepartmentID"`
}

// Запрос с JOIN через GORM
var employees []Employee
db.Preload("Department").Find(&employees) // Автоматическое объединение таблиц

Денормализация как обратный процесс

В реальных проектах часто применяется контролируемая денормализация — преднамеренное добавление избыточности для повышения производительности чтения данных, особенно в системах аналитики (OLAP) или при работе с большими данными. Это компромисс между нормализацией и скоростью выполнения запросов.

Заключение

Нормализация — фундаментальный принцип проектирования реляционных баз данных, обеспечивающий целостность данных, эффективность хранения и устойчивость к аномалиям. Однако важно соблюдать баланс: избыточная нормализация может привести к сложным запросам с множеством JOIN, что снижает производительность. Современные подходы часто сочетают нормализованную структуру для операционных данных (OLTP) и денормализованные представления для аналитики и отчетности.