Что такое Вторая Нормальная Форма (2NF)?

При работе с базами данных часто возникают проблемы, такие как избыточные данные и несогласованные обновления. Вторая нормальная форма – это шаг нормализации базы данных, который строится на первой нормальной форме (1NF) для создания более чистых и эффективных таблиц.

Понимание 2NF критично для всех, кто работает в области проектирования баз данных или управления данными, и оно является основой для более высоких форм нормализации, таких как третья нормальная форма (3NF). В этой статье мы рассмотрим, как работает 2NF и как преобразовывать таблицы, чтобы соответствовать требованиям 2NF, с практическими примерами. Мы также обсудим преимущества и недостатки 2NF, а также наилучшие случаи его использования.

Понимание Второй Нормальной Формы

Вторая нормальная форма – это шаг нормализации базы данных, направленный на устранение частичных зависимостей. Он был введен Эдгаром Ф. Коддом, пионером реляционных баз данных, в рамках его работы по нормализации.

Прежде чем таблица может находиться в 2NF, она должна удовлетворять правилам первой нормальной формы:

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

2НФ идет на шаг дальше с дополнительным правилом: устранение частичных зависимостей.

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

Сама теория может показаться немного сухой, поэтому давайте рассмотрим практический пример.

Ниже приведена таблица посещаемости курсов студентов Datacamp.

Student ID Course ID Course Name Instructor Name
1001 201 Основы SQL Кен Смит
1002 202 Введение в Python Merlin O’Donnell
1001 202 Введение в Python Merlin O’Donnell

Здесь первичный ключ является составным из Идентификатора студента и Идентификатора курса. Однако не ключевые атрибуты Название курса и Стоимость курса зависят только от Идентификатора курса, а не от всего ключа. Это нарушает 2НФ.

Шаги для разложения таблиц для достижения 2НФ

Чтобы убедиться, что таблица соответствует правилам 2НФ, вам необходимо:

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

Примеры второй нормальной формы в практике

Давайте теперь посмотрим на два примера.

Пример 1: Таблица записи на курс

Ранее мы видели следующую таблицу регистрации на курсы:

Student ID Course ID Course Name Instructor Name
1001 201 Основы SQL Кен Смит
1002 202 Введение в Python Мерлин О’Доннелл
1001 202 Введение в Python Мерлин О’Доннелл

Давайте следовать шагам, которые мы описали в предыдущем разделе.

1. Определите наш кандидатный ключ.

В данном случае кандидатским ключом является составной ключ ИД студента и ИД курса. Это уникальное сочетание идентифицирует каждую строку в таблице.

2. Определите наши функциональные зависимости

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

3. Избавляемся от частичных зависимостей

Нам нужно переместить атрибуты, которые зависят только от части ключа (Название курса и Имя инструктора), в новую таблицу, основанную исключительно на ID курса.

После декомпозиции наши новые таблицы выглядят следующим образом:

Таблица записей на курс

Student ID Course ID
1001 201
1002 202
1001 202

Таблица деталей курса

Course ID Course Name Instructor Name
201 Основы SQL Кен Смит
202 Введение в Python Мерлин О’Доннелл

Если вы хотите получить практический опыт и создать свои собственные базы данных, посмотрите наш курс PostgresQL. Если вы находитесь на более продвинутом уровне, попробуйте этот Введение в моделирование данных в Snowflake, который охватывает такие идеи, как моделирование сущностей-связей и размерное моделирование.

Пример 2: Таблица заказов

Мы начнем с этой таблицы Заказов. Попробуйте следовать описанным выше шагам и самостоятельно декомпозировать эту таблицу!

Order ID Product ID Order Date Product Name Supplier Name
1 201 2024-11-01 Ноутбук TechSupply
1 202 2024-11-01 Мышь TechSupply
2 201 2024-11-02 Ноутбук TechSupply
3 203 2024-11-03 Клавиатура KeyMasters

1. Определите наш ключ-кандидат.

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

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

Это означает, что (Идентификатор заказа, Идентификатор продукта) также является нашим первичным ключом.

2. Определите наши функциональные зависимости

Дата заказа зависит от Идентификатора заказа (не от полного составного ключа). Это частичная зависимость.

Название продукта и Название поставщика зависят от Идентификатора продукта (а не от полного составного ключа). Это также частичные зависимости.

3. Устранение частичных зависимостей

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

Сначала мы создадим таблицу для информации о заказе, которая содержит информацию, специфичную для Идентификатора заказа.

Таблица заказов

Order ID Order Date
1 2024-11-01
2 2024-11-02
3 2024-11-03

Затем мы создаем таблицу, которая содержит информацию, специфичную для Идентификатора продукта.

Таблица заказов

Product ID Product Name Supplier Name
201 Ноутбук ТехноСнабжение
202 Мышь ТехноСнабжение
203 Клавиатура КлючМастерс

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

Order ID Product ID
1 201
1 202
2 201
3 203

Сейчас наша база данных находится в 2НФ, потому что 1) все частичные зависимости были устранены, и 2) неперь атрибуты зависят исключительно от своих соответствующих первичных ключей.

Когда внедрять вторую нормальную форму

Почему следует привести свою базу данных к 2НФ? Этого достаточно само по себе или стоит пойти ещё дальше и стремиться к 3НФ?

Преимущества и ограничения второй нормальной формы

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

  • Улучшенная целостность данных: Путем устранения частичных зависимостей 2НФ минимизирует вставку, обновление и удаление аномалий, что приводит к более надежной базе данных.
  • Уменьшение избыточности: 2НФ уменьшает повторение данных, оптимизируя использование хранилища и упрощая обслуживание данных.
  • Улучшенная структура данных: Она закладывает основу для дальнейшей нормализации, такой как переход к третьей нормальной форме, создавая более чистый и эффективный дизайн базы данных.

Но это связано с некоторыми ограничениями:

  • Увеличенная сложность: Декомпозиция таблиц для соответствия 2NF может усложнить процесс проектирования, особенно при работе с составными ключами и зависимостями.
  • Дополнительные объединения: Разделение таблиц может потребовать большего числа объединений в запросах, что потенциально может повлиять на производительность в системах с большими объемами данных или сложными запросами – подробнее об этом ниже.
  • Остаточная избыточность: Хотя 2NF уменьшает частичные зависимости, он не решает транзитивные зависимости, оставляя некоторую избыточность до устранения в 3NF.

Соображения о производительности второй нормальной формы

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

Чтобы обеспечить оптимальную производительность нормализованной базы данных, следуйте этим bew practices:

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

Является ли 2НФ всего лишь переходным этапом для достижения третьей нормальной формы?

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

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

Продвижение за пределы второй нормальной формы: к третьей нормальной форме

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

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

Например, в таблице отслеживания записей на курсы:

  • 2NF: Гарантирует, что атрибуты, такие как название курса и имя студента, зависят исключительно от их соответствующих первичных ключей (например, Student ID и Course ID). Это исключает частичные зависимости, когда неключевые атрибуты зависят только от части составного ключа.
  • 3НФ: Обеспечивает хранение таких атрибутов, как данные об инструкторах или информация о департаменте, в отдельных таблицах, исключая транзитивные зависимости.

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

Заключение

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

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

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

Source:
https://www.datacamp.com/tutorial/second-normal-form