Сайт кафедры ИТСайт кафедры ИТ
Направления подготовки
Учебные материалы
О кафедре
На главнуюGitHub
Направления подготовки
Учебные материалы
О кафедре
  • МДК.11.01 - 05 - Вторая нормальная форма (2NF) базы данных

МДК.11.01 - 05 - Вторая нормальная форма (2NF) базы данных

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

Перед тем как переходить к процессу приведения таблиц базы данных до второй нормальной формы, необходимо чтобы эти таблицы уже находились в первой нормальной форме, подробно процесс приведения таблиц базы данных до первой нормальной формы, а также все требования, предъявляемые к первой нормальной форме, мы рассматривали в предыдущей статье — первая нормальная форма (1NF).

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

Требования второй нормальной формы (2NF)

Чтобы база данных находилась во второй нормальной форме (2NF), необходимо чтобы ее таблицы удовлетворяли следующим требованиям:

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

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

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

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

Главное правило второй нормальной формы (2NF) звучит следующим образом

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

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

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

Таблица сотрудников в первой нормальной форме

ФИОДолжностьПодразделениеОписание подразделения
Иванов И.И.ПрограммистОтдел разработкиРазработка и сопровождение приложений и сайтов
Сергеев С.С.БухгалтерБухгалтерияВедение бухгалтерского и налогового учета финансово-хозяйственной деятельности
John SmithПродавецОтдел реализацииОрганизация сбыта продукции

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

Теперь мы можем начать процесс нормализации этой таблицы до второй нормальной формы.

Что для этого нам нужно сделать?
Нам нужно внедрить первичный ключ.

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

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

Таким образом, чтобы привести эту таблицу ко второй нормальной форме, мы должны добавить в нее еще один атрибут, т.е. столбец с табельным номером.

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

🔑 Табельный номерФИОДолжностьПодразделениеОписание подразделения
1Иванов И.И.ПрограммистОтдел разработкиРазработка и сопровождение приложений и сайтов
2Сергеев С.С.БухгалтерБухгалтерияВедение бухгалтерского и налогового учета финансово-хозяйственной деятельности
3John SmithПродавецОтдел реализацииОрганизация сбыта продукции

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

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

Пример приведения таблицы ко второй нормальной форме (первичный ключ составной)

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

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

Для хранения таких данных мы создали следующую таблицу.

Таблица проектов организации в первой нормальной форме

Название проектаУчастникДолжностьСрок проекта (мес.)
Внедрение приложенияИванов И.И.Программист8
Внедрение приложенияСергеев С.С.Бухгалтер8
Внедрение приложенияJohn SmithМенеджер8
Открытие нового магазинаСергеев С.С.Бухгалтер12
Открытие нового магазинаJohn SmithМенеджер12

Как видим, она в первой нормальной форме, значит, мы можем пытаться приводить ее ко второй нормальной форме.

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

Посмотрев на эту таблицу, мы понимаем, что четко идентифицировать каждую строку мы можем только с помощью комбинации столбцов, например, «Название проекта» + «Участник», иными словами, зная «Название проекта» и «Участника», мы можем четко определить конкретную запись в таблице, т.е. каждое сочетание значений этих столбцов является уникальным.

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

Таблица проектов организации. Внедрен составной первичный ключ

🔑 Название проекта🔑 УчастникДолжностьСрок проекта (мес.)
Внедрение приложенияИванов И.И.Программист8
Внедрение приложенияСергеев С.С.Бухгалтер8
Внедрение приложенияJohn SmithМенеджер8
Открытие нового магазинаСергеев С.С.Бухгалтер12
Открытие нового магазинаJohn SmithМенеджер12

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

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

Чтобы это проверить, мы можем задать себе несколько вопросов.

Можем ли мы определить «Должность», зная только название проекта?
Нет. Для этого нам необходимо знать и участника. Значит, пока все хорошо, по этой части ключа мы не можем четко определить значение неключевого столбца. Идем дальше и проверяем другую часть ключа.

Можем ли мы определить «Должность» зная только участника?
Да, можем. Значит наш первичный ключ плохой, и требование второй нормальной формы не выполняется.

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

Декомпозиция — это процесс разбиения одного отношения (таблицы) на несколько.

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

Проекты

🔑 Идентификатор проектаНазвание проектаСрок проекта (мес.)
1Внедрение приложения8
2Открытие нового магазина12

Участники

🔑 Идентификатор участникаУчастникДолжность
1Иванов И.И.Программист
2Сергеев С.С.Бухгалтер
3John SmithМенеджер

Связь проектов и участников этих проектов

🔑 🔗 Идентификатор проекта🔑 🔗 Идентификатор участника
11
12
13
22
23

Мы создали 3 таблицы:

  1. Проекты, в нее мы добавили искусственный первичный ключ
  2. Участники, в нее мы также добавили искусственный первичный ключ
  3. Связь между проектами и участниками, она нужна для реализации связи «Многие ко многим», так как между этими таблицами связь именно такая

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

Последнее обновление: 11.09.2025, 10:03
Предыдущая
МДК.11.01 - 04 - Первая нормальная форма (1NF) базы данных
Следующая
МДК.11.01 - 06 - Третья нормальная форма (3NF) базы данных
© Кафедра информационных технологий ЧУВО «ВШП», 2025. Версия: 0.4.1
Материалы доступны в соответствии с лицензией: