Нормализация баз данных: теоретический и практический аспекты

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

18 сентября 2025
Автор: Сидоров Александр
Время чтения: 15 мин.

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

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

Классические стадии нормализации:

Стадия

Избыточные аномалии

Ненормализованная (нулевая) форма (UNF)

 

Это состояние перед любой нормализацией. В таблице присутствуют избыточные и сложные значения

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

 

Разбиваются повторяющиеся и сложные значения; все экземпляры становятся атомарными

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

 

Частичные зависимости разделяются на новые таблицы. Все строки функционально зависимы от первичного ключа

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

 

Транзитивные зависимости разбиваются на новые таблицы. Не ключевые атрибуты зависят от первичного ключа

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

 

Транзитивные и частичные функциональные зависимости для всех потенциальных ключей разбиваются на новые таблицы

Четвертая нормальная форма (4NF)

Удаляются многозначные зависимости

Пятая нормальная форма (5NF)

Удаляются JOIN-зависимости (зависимости соединения)



Классификация 1NF-6NF + DKNF

Первая нормальная форма (1NF)
Первая нормальная форма является базовым уровнем нормализации и требует, чтобы все атрибуты отношения были атомарными, то есть неделимыми.

Примеры:
  • Бизнес: таблица «Сотрудники» с атрибутами «ID сотрудника», «ФИО», «Должность» и «Отдел».
  • Математика: таблица «Числа» с атрибутами «ID числа», «Значение».

Пример таблицы в первой нормальной форме (1НФ):

Номер заказа

Дата заказа

Клиент

Сумма заказа

1

01.01.2023

Иван

1000

2

02.01.2023

Мария

1500

3

03.01.2023

Пётр

2000


Пример таблицы с нарушением первой нормальной формы (1НФ):

Номер заказа

Дата заказа

Клиент

Сумма заказа

Товары

1

01.01.2023

Иван

1000

{ручка, бумага}

2

02.01.2023

Мария

1500

{карандаш, ластик}


В этом примере атрибут «Товары» содержит списки, что нарушает принцип 1НФ, так как значения должны быть скалярными.

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

Вторая нормальная форма требует, чтобы все неключевые атрибуты полностью зависели от первичного ключа.

Примеры:

·         Бизнес: таблица «Заказы» с атрибутами «ID заказа», «ID клиента», «Дата заказа» и «Сумма заказа».

·         Математика: таблица «Функции» с атрибутами «ID функции», «Аргумент», «Значение», где «Аргумент» однозначно определяет «Значение».

Пример таблицы в правильном варианте (во 2НФ):

Номер заказа

Клиент

Товар

Цена

1

Иванов

стул

1000

2

Петров

стол

2000

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

Пример таблицы с нарушением 2НФ:

Номер заказа

Отдел

Клиент

Товар

Цена

1

Мебель

Иванов

стул

1000

2

Мебель

Петров

стол

2000

3

Мебель

Семёнов

диван

3000

4

Электроника

Иванов

ноутбук

5000


В этом примере первичный ключ — это «Номер заказа». Однако атрибут «Отдел» не связан функционально только с первичным ключом, а скорее связан с выбором товара. Это создаёт частичную зависимость, что является нарушением 2НФ.

Пример таблицы в НФБК

Номер заказа

Клиент

Товар

Количество

Дата заказа

1

Иванов И. И.

Книга А

5

01.01.2023

2

Петров П. П.

Книга Б

3

02.01.2023


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


Пример таблицы с нарушением НФБК

Номер заказа

Клиент

Товар

Цена

Общая стоимость

1

Иванов И. И.

Книга А

100 руб.

500 руб.

2

Петров П. П.

Книга Б

150 руб.

450 руб.


В этой таблице атрибут «Общая стоимость» зависит не только от первичного ключа, но и от атрибутов «Товар» и «Количество» (хотя в явном виде количество не указано).

Это нарушает НФБК, так как существует транзитивная зависимость: Номер заказа → Товар → Общая стоимость. 

Для соответствия НФБК нужно было бы разделить таблицу на две: одна содержала бы информацию о заказе и товаре, а другая — расчёт общей стоимости на основе цены и количества.

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

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

Определение третьей нормальной формы (3НФ) не вполне подходит для следующих типов отношений

  • Когда отношение содержит два или более потенциальных ключа.

  • Когда эти потенциальные ключи являются составными.

  • Когда они пересекаются, то есть имеют хотя бы один общий атрибут.

Для отношений с одним потенциальным ключом (первичным) НФБК совпадает с 3НФ.

Отношение находится в НФБК, если каждая нетривиальная и неприводимая функциональная зависимость имеет потенциальный ключ в качестве детерминанта.

Третья нормальная форма является более строгим требованием и требует, чтобы все неключевые атрибуты были взаимно независимыми.

Примеры:

·         Бизнес: таблица «Клиенты» с атрибутами «ID клиента», «ФИО», «Адрес» и «Телефон».

·         Математика: таблица «Переменные» с атрибутами «ID переменной», «Обозначение», «Значение», где каждая переменная имеет уникальное обозначение и независимое значение.

Пример таблицы в третьей нормальной форме (3НФ):

ID

Имя

Адрес

Город

Телефон

1

Иван

ул. Цветочная, д. 5

Москва

+7 (900) 111-11-11

2

Пётр

пр. Солнечный, д. 10

Санкт-Петербург

+7 (900) 222-22-22


В этой таблице каждый атрибут зависит только от первичного ключа (ID) и не содержит транзитивных зависимостей.

Пример таблицы с нарушением третьей нормальной формы:

ID

Имя

Адрес

Город

Тип адреса

1

Иван

ул. Цветочная, д. 5

Москва

Частный

2

Пётр

пр. Солнечный, д. 10

Санкт-Петербург

Квартира

3

Анна

д. 15, СНТ «Зелёный»

Подмосковье

Частный


В данном примере атрибут «Тип адреса» зависит не только от первичного ключа, но и от атрибута «Адрес». Это создаёт транзитивную зависимость и нарушает 3НФ.


Четвёртая нормальная форма (4NF)

Четвёртая нормальная форма исключает нетривиальные многозначные зависимости.

Примеры:

·         Бизнес: таблица «Книги» с атрибутами «ID книги», «Автор», «Жанр» и «Издательство».

·         Математика: таблица «Пары чисел» с атрибутами «ID пары», «Первое число», «Второе число», где каждому первому числу соответствует определённое множество вторых чисел.

Пример таблицы в четвёртой нормальной форме (4НФ):

Номер заказа

Клиент

Товар

Количество

1

Клиент 1

Товар 1

10

2

Клиент 2

Товар 2

5


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

Пример таблицы с нарушением 4НФ:

Номер заказа

Научные обоснования и споры

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

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

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

Что такое транзитивная зависимость

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

Основные характеристики транзитивной зависимости

Транзитивная зависимость отличается от функциональной тем, что она возникает только тогда, когда косвенная связь между атрибутами вызывает функциональную зависимость. То есть, ТЗ не может существовать сама по себе, она всегда связана с ФЗ. Это важное отличие, которое необходимо учитывать при нормализации данных.

ТЗ обычно включает как минимум три атрибута, которые функционально зависят друг от друга. Например, если у нас есть таблица с тремя столбцами A, B и C, и значение A однозначно определяет значение B, а значение B однозначно определяет значение C, то существует транзитивная зависимость между A и C.

Роль транзитивной зависимости в нормализации

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

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

Пример транзитивной зависимости

Рассмотрим пример таблицы Orders, которая содержит информацию о заказах клиентов:

| OrderID | CustomerID | ProductID | Price | |---------|------------|-----------|-------| | 1 | 101 | 201 | 500 | | 2 | 102 | 202 | 600 | | 3 | 103 | 203 | 700 |

В этой таблице существует транзитивная зависимость между OrderID и Price. Это связано с тем, что значение OrderID однозначно определяет значение CustomerID, а значение CustomerID в свою очередь однозначно определяет значение Price.

Для устранения этой транзитивной зависимости необходимо разделить таблицу на две:

1. Orders:
OrderID (первичный ключ)
CustomerID
2. Customers:
CustomerID (первичный ключ)
Price

Теперь OrderID напрямую зависит только от первичного ключа в таблице Orders, и транзитивная зависимость устранена.

Важность устранения транзитивных зависимостей

Устранение транзитивных зависимостей важно по нескольким причинам:

  1. Повышение производительности: Удаление транзитивных зависимостей может ускорить выполнение запросов, так как уменьшается количество промежуточных шагов при обработке данных.
  2. Улучшение целостности данных: Разделение таблиц на более мелкие и логически независимые части помогает избежать ошибок и несогласованности данных.
  3. Упрощение структуры базы данных: Нормализация до 3НФ делает структуру базы данных более понятной и удобной для управления.
  4. Снижение дублирования данных: Устранение транзитивных зависимостей помогает избежать дублирования данных, что, в свою очередь, уменьшает объём хранимой информации и снижает риск ошибок.

Зачем нормализовать данные в базе данных (БД)

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

Работа с нормализованными данными напоминает поход за продуктами с книгой рецептов. Чтобы приготовить салат оливье, нужно открыть книгу рецептов, перейти в раздел «Салаты», найти нужный рецепт и купить только те ингредиенты, которые указаны в нём. Примерно так работают связи между таблицами в базе данных.

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

Преимущества нормализации данных

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

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

3. Снижение вероятности ошибок и аномалий
Нормализация помогает предотвратить ошибки и аномалии в данных. Например, если данные в одной таблице изменяются, связанные данные в других таблицах автоматически обновляются. Это снижает вероятность ошибок при внесении изменений и обеспечивает целостность данных.

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

5. Улучшение структуры данных
Нормализация данных помогает создать более логичную и понятную структуру базы данных. Это облегчает её обслуживание и модификацию в будущем. Например, при добавлении новых функций или изменении требований к системе нормализованная база данных позволяет сделать это без значительных изменений в структуре данных.
Что такое нормализация баз данных и зачем она нужна?
Нормализация — это процесс организации структуры реляционной базы данных для уменьшения избыточности и повышения целостности данных. Она помогает избежать аномалий вставки, обновления и удаления, упростить поддержку БД и сделать запросы более предсказуемыми и корректными.
Выделяют несколько нормальных форм: 1НФ, 2НФ, 3НФ, BCNF и более продвинутые (4НФ, 5НФ и др.). На практике для бизнес‑систем обычно достаточно довести модель до 3‑й нормальной формы (3НФ), чтобы избавиться от основных аномалий и избыточности.
Нормализация снижает дублирование данных, экономит место и уменьшает вероятность противоречивых значений в разных таблицах. Она повышает целостность и прозрачность структуры, облегчает изменение схемы и поддержку системы по мере роста требований.
Сильная нормализация приводит к большому числу таблиц и сложным соединениям (JOIN) в запросах, что может ухудшить производительность и усложнить разработку отчетов. Поэтому на практике часто применяют компромисс: нормализуют до разумного уровня (обычно 3НФ), а в узких местах используют денормализацию и витрины для аналитики.
Сначала выявляют дублирующиеся данные и аномалии (одно и то же значение, хранящееся в нескольких местах, проблемы при изменении/удалении записей). Затем шаг за шагом разбивают «широкие» таблицы на более узкие по сущностям, выделяют ключи и связи и проверяют выполнение 1НФ, 2НФ и 3НФ для ключевых областей модели.

Примеры применения нормализации

Пример 1: Интернет-магазин

В интернет-магазине нормализация данных помогает улучшить работу с товарами, категориями и заказами. Например, данные о товарах могут быть разделены на несколько таблиц:

·         Таблица товаров (ID товара, название, описание, цена и т.д.)

·         Таблица категорий (ID категории, название, описание)

·         Таблица заказов (ID заказа, ID клиента, дата заказа, статус и т.д.)

Такая структура позволяет легко добавлять новые товары, категории и заказы, а также упрощает поиск и обработку данных.

Пример 2: Система управления складом

В системе управления складом нормализация данных помогает оптимизировать работу с товарами и складами. Например, данные о товарах могут быть разделены на несколько таблиц:

·         Таблица товаров (ID товара, название, описание, цена, поставщик и т.д.)

·         Таблица складов (ID склада, название, адрес, вместимость и т.д.)

·         Таблица запасов (ID запаса, ID товара, ID склада, количество и т.д.)

Такая структура позволяет легко отслеживать запасы товаров на разных складах и оптимизировать их управление.

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

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

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

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

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

Плюсы и минусы денормализации

Плюсы:

  1. Быстрее читать данные: Когда в базе данных много повторяющейся информации, нужно делать меньше запросов, и это ускоряет процесс чтения.
  2. Проще делать запросы: Структура базы данных становится проще, и запросы к ней становятся более понятными и легкими для выполнения.
  3. Лучше подходит для чтения: В системах, где важно быстро читать данные, а не часто их обновлять, денормализация помогает работать быстрее.

Минусы:

  1. Медленнее записывать данные: Из-за повторения информации в базе данных она занимает больше места и требует больше времени для обновления.
  2. Сложно управлять: Денормализованные базы данных труднее поддерживать и обновлять.
  3. Дублирование информации: Когда информация повторяется, это увеличивает риск ошибок и усложняет её обновление и проверку на правильность.

Когда нужно использовать денормализацию?

Денормализацию обычно используют в следующих случаях:

  • Создание сайтов и приложений: Например, для социальных сетей или интернет-магазинов, где чаще читают информацию, чем ее изменяют.
  • Анализ больших данных: Программы для работы с большими объемами данных, где важнее быстро читать информацию, чем быстро ее записывать.
  • Программы с редкими изменениями: Программное обеспечение, где данные редко меняются, и можно пожертвовать скоростью записи ради более быстрого чтения.

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

Пример нормализации в SQL

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

Пример упорядочивания данных на таблице:

Предположим, у нас есть таблица Employees с данными о сотрудниках компании, и мы хотим упорядочить их по фамилии в алфавитном порядке. 

Таблица Employees:

ID

ФИО

Должность

Отдел

1

Иванов Иван

Менеджер

Продажи

2

Петров Пётр

Специалист

Разработка

3

Миронов Мирон

Руководитель

Управление

4

Фёдоров Фёдор

Специалист

Разработка



SQL-запрос для упорядочивания данных по фамилии:

SELECT * FROM Employees ORDER BY ФИО ASC;

Этот запрос выберет все столбцы из таблицы Employees и упорядочит их по столбцу ФИО в алфавитном порядке (ASC — ascending, возрастающий).


Результат выполнения запроса:

ID

ФИО

Должность

Отдел

1

Иванов Иван

Менеджер

Продажи

3

Миронов Мирон

Руководитель

Управление

2

Петров Пётр

Специалист

Разработка

4

Фёдоров Фёдор

Специалист

Разработка



Пример нормализации и упорядочивания данных в SQL

Предположим, у нас есть таблица Employees с данными о сотрудниках компании. Таблица содержит следующие столбцы:
  • EmployeeID (первичный ключ);
  • FirstName;
  • LastName;
  • DepartmentID (внешний ключ);
  • Salary;
  • HireDate.
Также у нас есть таблица Departments с данными о отделах:
  • DepartmentID (первичный ключ);
  • DepartmentName.
Предположим, нам нужно вывести список сотрудников, отсортированный по их зарплате в порядке убывания. Для этого мы можем использовать следующий SQL-запрос:

SELECT FirstName, LastName, Salary
FROM Employees
ORDER BY Salary DESC;

Этот запрос выведет список сотрудников с их именами и зарплатами, отсортированный по зарплате в порядке убывания.


Пример нормализации и упорядочивания данных через создание новой таблицы

Предположим, нам нужно создать новую таблицу EmployeeProjects для хранения информации о проектах, в которых участвуют сотрудники. Таблица EmployeeProjects должна содержать следующие столбцы:
  • ProjectID (первичный ключ);
  • EmployeeID (внешний ключ);
  • ProjectName;
  • StartDate;
  • EndDate.
Мы можем создать эту таблицу с помощью следующего SQL-кода:

CREATE TABLE EmployeeProjects (
    ProjectID INT PRIMARY KEY,
    EmployeeID INT,
    ProjectName VARCHAR(255),
    StartDate DATE,
    EndDate DATE,
    FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID)
);

Этот код создаст новую таблицу EmployeeProjects с указанными столбцами и установит связь между таблицей EmployeeProjects и таблицей Employees с помощью внешнего ключа EmployeeID.

Из примера явно понятно, что можно использовать SQL для нормализации данных и упорядочивания их в соответствии с заданными критериями.

Автор:
Продуктовый маркетолог линейки инфраструктуры Denvic Tools, event-маркетолог

Возникли вопросы?

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

Другие статьи

От быстрой аналитики и первых дашбордов к масштабному контуру данных
От быстрой аналитики и первых дашбордов к масштабному контуру данных
Тернистый путь от View к Экстрактору 1С.
История начинается одинаково почти у всех
В компании появляется запрос на аналитику,...
Подробнее
Очистка данных: инструменты и особенности процесса
Очистка данных: инструменты и особенности процесса
Очистка данных — обязательный этап подготовки информации перед анализом и отчётностью.  В статье разбираем, какие проблем...
Подробнее
Импортозамещение SAP: переезд на 1С. Архитектура решения
Импортозамещение SAP: переезд на 1С. Архитектура решения
Как выстроить промышленный переезд с SAP на 1С: сценарии миграции, выгрузка данных через SAP ODP, подготовка и загрузка в 1С без рисков д...
Подробнее
Эволюция работы с данными в 1С: от Экстрактора 1C к единой экосистеме Denvic Visual Tools
Эволюция работы с данными в 1С: от Экстрактора 1C к единой экосистеме Denvic Visual Tools
Как мы прошли путь от создания инструмента для выгрузки данных из 1С до построения целостной экосистемы? В этой статье — эволюция Denvic ...
Подробнее
Все статьи