- Отсутствие транзитивных зависимостей: Это ключевое правило. В таблице 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.
BCNF – это “строже” форма 3NF, которая дополнительно устраняет аномалии, возникающие с перекрывающимися кандидатскими ключами. Он может быть особенно полезен в сложных случаях, когда только 3NF не устраняет зависимости полностью. BCNF применяется, когда непростой атрибут зависит от атрибута, который является частью составного кандидатского ключа. Я понимаю, что это звучит сложно, поэтому давайте разберем это на примере.
Текущая структура (в 3NF)
После декомпозиции для достижения 3NF у нас были эти две таблицы:
Таблица записей
Таблица курсов
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”, независимо от конкретного Идентификатора курса. В результате Название курса также уникально определяет Аудиторию.
Это означает, что у нас теперь два кандидатских ключа:
- Идентификатор курса
- Название курса
С обоими кандидатскими ключами у нас теперь возникает проблема, которую 3NF не решает: Аудитория зависит от Названия курса, а не только от Идентификатора курса.
Применение BCNF
Для устранения этой проблемы зависимости нам нужно будет дополнительно декомпозировать Курсы таблицу на две отдельные таблицы, которые лучше соответствуют BCNF:
- Новая таблица курсов, которая включает только ID курса и название курса.
- Таблица CourseDetails, которая хранит Название курса и аcсоциацию с аудиторией.
Вот как это выглядит:
Пересмотренная таблица курсов (BCNF)
Таблица CourseDetails (BCNF)
Course Name | Classroom |
---|---|
Основы SQL | Аудитория 101 |
Введение в Python | Аудитория 102 |
Понимание науки о данных | Аудитория 101 |
- В таблице Курсы, ID курса является первичным ключом, и все атрибуты зависят исключительно от него.
- В таблице CourseDetails, Course Name является первичным ключом, а Classroom зависит только от Course Name.
Эта настройка устраняет любые проблемы зависимостей, вызванные перекрывающимися кандидатскими ключами, обеспечивая строго нормализованную структуру.
Заключение
Третья нормальная форма является ценным инструментом для проектировщиков баз данных, стремящихся сохранить данные чистыми, последовательными и свободными от проблемных зависимостей. С 3NF целостность данных улучшается, что облегчает управление и снижает избыточность. Помните, что хотя 3NF хорошо работает в большинстве ситуаций, более сложные базы данных могут получить преимущество от дополнительных форм, таких как BCNF или 4NF.
Если вы нашли эту статью полезной, рассмотрите возможность перехода на следующий уровень, получив наш Сертификат SQL-специалиста. Это отличный способ подтвердить ваши навыки работы с SQL и управления базами данных, а также продемонстрировать свою экспертизу потенциальным работодателям!