Во второй нормальной форме каждый столбец в таблице, который не является ключом, должен зависеть от ключа.
Ключевой момент второй нормальной формы - полная функциональная зависимость. Она предполагает, что атрибут В полностью функционально зависим от атрибута А, если атрибут В функционально зависит от полного значения атрибута А, а не от какого-либо подмножества значений из атрибута А. То есть, если атрибут А составляют несколько значений, скажем, А1 и А2, то атрибут В полностью функционально зависит от А, если он зависит и от А1 и от А2 (А1, А2 → В).
Если атрибут В зависит только от какого-либо подмножества из атрибута А, например, только от А1, то имеет место частичная функциональная зависимость.
Эта форма применяется к тем таблицам, которые имеют составной первичный ключ, то есть где первичный ключ состоит из нескольких атрибутов. Если в таблице несоставной первичный ключ, то в этом случае считается, что все остальные атрибуты автоматически находятся в полной функциональной зависимости от первичного ключа.
Вторая нормальная форма применяется только к тем таблицам, которые находятся в первой нормальной форме. После применения второй формы все столбцы таблицы зависят от первичного ключа.
Возьмем сформированную в прошлой теме таблицу StudentCourses после применения первой нормальной формы:
StudentId | Name | CourseId | Course | Date | TeacherId | Teacher |
1 | Том | 1 | Математика | 11/06/2017 | 1 | Смит |
1 | Том | 2 | JavaScript | 14/06/2017 | 2 | Адамс |
2 | Сэм | 3 | Алгоритмы | 12/06/2017 | 2 | Адамс |
3 | Боб | 1 | Математика | 13/06/2017 | 1 | Смит |
На данный момент эта таблица имеет составной первичный ключ StudentId+CourseId. Какие функциональные зависимости от ключевых атрибутов здесь можно выделить:
StudentId, CourseId → Date
StudentId → Name
CourseId → Course, TeacherId, Teacher
От обоих частей составного ключа StudentId+CourseId зависит только арибут Date - дата, в которую студент с идентификатором StudentId поступил на курс с идентифкатором CourseId.
Атрибут Name зависит только от части составного ключа - от атрибута StudentId, так как зная идентификатор студента, можно сказать, какое у него имя. В данном случае имеет факт частичной зависимости.
Атрибуты Course, TeacherId, Teacher, Position зависит от другой части ключа - от атрибута CourseId. Зная значение CourseId, можно сказать, как называется курс, какой у курса преподаватель, какую должность он занимает. Опять же здесь частичная зависимость.
Наличие частичных зависимостей говорит о том, что таблица не находится во второй нормальной форме. И для перехода к этой форме необходимо переместить атрибуты, которые не входят в первичный ключ, в новую таблицу вместе с копией части первичного ключа, от которой они функционально зависят.
В нашем случае из одной таблицы получатся три. Таблица Students:
StudentId | Name |
1 | Том |
2 | Сэм |
3 | Боб |
Таблица Courses:
CourseId | Course | TeacherId | Teacher |
1 | Математика | 1 | Смит |
2 | JavaScript | 2 | Адамс |
3 | Алгоритмы | 2 | Адамс |
И таблица StudentCourses:
StudentId | CourseId | Date |
1 | 1 | 11/06/2017 |
1 | 2 | 14/06/2017 |
2 | 3 | 12/06/2017 |
3 | 1 | 13/06/2017 |
Итогом стало образование связи многие ко многим (много студентов - много курсов) между таблицами Students и Courses через таблицу StudentCourses .
Таким образом, база данных перешла во вторую нормальную форму.