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

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

2.3 Middle🔥 131 комментариев
#Базы данных и SQL

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Нормализация базы данных

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

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

Аномалии данных:

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

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

1НФ (First Normal Form)

Правило: Атомарность значений

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

Пример ДО (нарушение 1НФ):

Сотрудник | Навыки
-----------+------------------
Иван      | SQL, Python, Java

Пример ПОСЛЕ (соответствует 1НФ):

Сотрудник | Навык
-----------+-------
Иван      | SQL
Иван      | Python
Иван      | Java

2НФ (Second Normal Form)

Правило: Полная функциональная зависимость от первичного ключа

  • Должна быть достигнута 1НФ
  • Все неключевые атрибуты зависят от всего первичного ключа, не только от части

Пример ДО (нарушение 2НФ):

Студент_ID | Курс_ID | Курс_Название | Оценка

Здесь Курс_Название зависит только от Курс_ID, а не от обоих ключей.

Пример ПОСЛЕ (соответствует 2НФ):

Таблица Оценки:
Студент_ID | Курс_ID | Оценка

Таблица Курсы:
Курс_ID | Курс_Название

3НФ (Third Normal Form)

Правило: Отсутствие транзитивных зависимостей

  • Должна быть достигнута 2НФ
  • Неключевые атрибуты не должны зависеть от других неключевых атрибутов

Пример ДО (нарушение 3НФ):

Сотрудник_ID | ФИО | Отдел_ID | Отдел_Название | Руководитель

Здесь Отдел_Название и Руководитель зависят от Отдел_ID, не от Сотрудник_ID.

Пример ПОСЛЕ (соответствует 3НФ):

Таблица Сотрудники:
Сотрудник_ID | ФИО | Отдел_ID

Таблица Отделы:
Отдел_ID | Отдел_Название | Руководитель

НФБК (Boyce-Codd Normal Form)

Более строгая версия 3НФ

  • Каждый детерминант должен быть потенциальным ключом
  • Практически всегда используется вместо 3НФ

Практические преимущества нормализации

  • ✅ Минимизация дублирования (меньше места на диске)
  • ✅ Снижение аномалий при обновлении
  • ✅ Лучшая целостность данных
  • ✅ Более гибкая схема (легче добавлять новые отношения)
  • ✅ Проще запросы (реже нужны объединения)

Когда НЕ нормализировать: денормализация

Иногда проще нарушить нормализацию:

  • Для повышения производительности (меньше JOIN'ов)
  • Для систем с очень большим объёмом чтения
  • Для документных БД (MongoDB)
  • Для аналитических БД (Data Warehouse)

Это называется денормализация — сознательное нарушение нормальных форм для оптимизации.

Вывод

Для OLTP систем (обычные приложения): нормализация до 3НФ/НФБК Для OLAP систем (аналитика): звездообразная схема или денормализованная

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