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

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

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

Определение Третьей Нормальной Формы (3NF)

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

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

В 1970-х годах Эдгар Ф. Кодд представил 3NF для формализации условий достижения полностью нормализованной структуры базы данных. Несколько лет спустя переформулировка Карло Заниоло дала более ясное объяснение различия между “классической” 3NF и более строгой нормальной формой Бойса-Кодда (BCNF). Пока не беспокойтесь слишком о BCNF, мы вернемся к ней позже.

Понимание Условий для Третьей Нормальной Формы

Итак, что именно нужно сделать, чтобы достичь 3NF? Чтобы таблица соответствовала этому требованию, она должна соответствовать нескольким условиям:

  • Быть во 2NF: Это означает, что она уже атомарна, без повторяющихся групп и без частичных зависимостей от любых составных ключей.

3NF включает в себя 2NF и 1NF. Изображение от автора

  • Отсутствие транзитивных зависимостей: Это ключевое правило. В таблице 3NF любой столбец, не являющийся первичным ключом, должен зависеть исключительно от первичного ключа, а не косвенно через другой столбец, не являющийся ключом.

Давайте посмотрим, что это практически означает.

Декомпозиция таблиц для достижения 3НФ

Давайте пройдемся по процессу декомпозиции таблиц для достижения 3НФ. Мы будем использовать некоторые примеры данных из курсов DataCamp для иллюстрации каждого шага.

Шаг 1: Определение транзитивных зависимостей

Для начала мы будем искать любые атрибуты в таблице, которые косвенно зависят от первичного ключа. Как правило, если какой-либо атрибут зависит от чего-то, кроме первичного ключа, это указывает на транзитивную зависимость. Это сигнал к тому, что настало время разделить вашу таблицу.

Взгляните на три таблицы ниже. В какой из них есть транзитивная зависимость?

Таблица 1: Курс

Course ID Course Name Difficulty
201 Основы SQL Начинающий
202 Введение в Python Начинающий
203 Понимание Data Science Промежуточный

Таблица 2: Преподаватель

Instructor ID Instructor Name Expertise
1 Сара Джонсон Data Science
2 Том Уильямс Машинное обучение
3 Эмили Браун Python

Таблица 3: Записи

Enrollment ID Student Name Course ID Course Name
1001 Alice Smith 201 Основы SQL
1002 Bob Green 202 Введение в Python
1003 Charlie Blue 201 Основы SQL

Ответ…Таблица 3!

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

Шаг 2: Разделите данные на новые таблицы

Чтобы устранить транзитивную зависимость, мы разделим Таблицу 1 на две таблицы. Каждая таблица будет сосредоточена на непосредственно зависимых данных.

Улучшенная таблица записи

Enrollment ID Student Name Course ID
1001 Алиса Смит 201
1002 Боб Грин 202
1003 Чарли Блу 201

Таблица курсов

Course ID Course Name
201 Основы SQL
202 Введение в Python

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

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

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

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

Итак, зачем прикладывать все усилия для достижения 3NF? Вот основные преимущества:

  • Улучшенная целостность данных: Избавляясь от транзитивных зависимостей, 3NF помогает обеспечить, что обновления и удаления не приведут к конфликтующим или устаревшим данным в разных таблицах.
  • Снижение избыточности: Меньшая избыточность означает, что вашу базу данных легче обслуживать, и использование хранилища уменьшается.
  • Более простое обслуживание данных: Хранение подобной информации в отдельных таблицах упрощает обновление записей без необходимости отслеживать избыточные записи.

Сказанное, хотя 3NF структуры поддерживают точность данных, они также могут привести к более сегментированным данным, иногда замедляя выполнение сложных запросов из-за дополнительных объединений таблиц. В случаях, когда скорость работы важнее, чем нормализация, BCNF или 4NF могут быть более практичными вариантами.

Сравнение: Первая, Вторая, Третья и Нормальные формы Бойса-Кодда

Давайте посмотрим на различия форм.

Таблица сравнения: первая, вторая и третья нормальные формы

Вот таблица сравнения, которая поможет вам понять требования 1NF, 2NF и 3NF.

Feature 1NF 2NF 3NF
Атомарные данные
Отсутствие частичных зависимостей
Отсутствие транзитивных зависимостей

Третья нормальная форма против нормальной формы Бойса-Кодда (BCNF)

BCNF – это “строже” форма 3NF, которая дополнительно устраняет аномалии, возникающие с перекрывающимися кандидатскими ключами. Он может быть особенно полезен в сложных случаях, когда только 3NF не устраняет зависимости полностью. BCNF применяется, когда непростой атрибут зависит от атрибута, который является частью составного кандидатского ключа. Я понимаю, что это звучит сложно, поэтому давайте разберем это на примере.

Текущая структура (в 3NF)

После декомпозиции для достижения 3NF у нас были эти две таблицы:

Таблица записей

Enrollment ID Student Name Course ID
1001 Алиса Смит 201
1002 Боб Грин 202
1003 Чарли Блу 201

Таблица курсов

Course ID Course Name
201 Основы SQL
202 Введение в Python

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

Представление нового требования

Теперь давайте добавим новый атрибут к Курсы: Аудитория, в которой проводится каждый курс. Этот новый атрибут может потребовать нормализацию по BCNF.

Обновленная таблица курсов (3NF)

Course ID Course Name Classroom
201 Основы SQL Аудитория 101
202 Введение в Python Аудитория 102
203 Понимание науки о данных Аудитория 101

Здесь, Идентификатор курса все еще является первичным ключом, и все остальные атрибуты зависят непосредственно от него. Но предположим, что есть новое правило, согласно которому каждый класс может вмещать только один предмет за раз. Предположим также, что Название курсаОсновы SQL” могут предлагаться под разными Идентификаторами курсов (например, 201, 204 и т. д.), если они запланированы на разное время. В этом случае каждое предложение “Основ SQL” все равно будет проходить в “Аудитории 101”, независимо от конкретного Идентификатора курса. В результате Название курса также уникально определяет Аудиторию.

Это означает, что у нас теперь два кандидатских ключа:

  1. Идентификатор курса
  2. Название курса

С обоими кандидатскими ключами у нас теперь возникает проблема, которую 3NF не решает: Аудитория зависит от Названия курса, а не только от Идентификатора курса.

Применение BCNF

Для устранения этой проблемы зависимости нам нужно будет дополнительно декомпозировать Курсы таблицу на две отдельные таблицы, которые лучше соответствуют BCNF:

  1. Новая таблица курсов, которая включает только ID курса и название курса.
  2. Таблица CourseDetails, которая хранит Название курса и аcсоциацию с аудиторией.

Вот как это выглядит:

Пересмотренная таблица курсов (BCNF)

Таблица CourseDetails (BCNF)

Course Name Classroom
Основы SQL Аудитория 101
Введение в Python Аудитория 102
Понимание науки о данных Аудитория 101

С этой новой структурой каждая таблица удовлетворяет условиям BCNF:

  • В таблице Курсы, ID курса является первичным ключом, и все атрибуты зависят исключительно от него.
  • В таблице CourseDetails, Course Name является первичным ключом, а Classroom зависит только от Course Name.

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

Заключение

Третья нормальная форма является ценным инструментом для проектировщиков баз данных, стремящихся сохранить данные чистыми, последовательными и свободными от проблемных зависимостей. С 3NF целостность данных улучшается, что облегчает управление и снижает избыточность. Помните, что хотя 3NF хорошо работает в большинстве ситуаций, более сложные базы данных могут получить преимущество от дополнительных форм, таких как BCNF или 4NF.

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

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