Идем далее и поговорим о второй нормальной форме(2NF) и о том, как нормализовать отношение до второй нормальной формы, как привести базу данных ко второй нормальной форме.
Вторая нормальная форма(2NF). Для начала напишу академическое определение. Таблица находится во второй нормальной форме, ели она находится в первой нормальной форме и при этом любой ее атрибут, не входящий в состав первичного ключа, функционально полно зависит от первичного ключа. Функционально полно означает, что атрибут зависит от всего первичного ключа, но не зависит от его какой-либо части.
Конечно, я еще не успел рассказать про ключи ключевые атрибуты, в одной из следующих публикации постараюсь это исправить. А теперь давайте разберемся с этим на первый взгляд сложным определением и с тем, как привести базу данных ко второй нормальной форме.
Теперь по-русски. Правила второй нормальной формы(2NF): у любой таблице есть ключ (ключевой атрибут), любая база данных будет работать без ключей и ключевых атрибутов, но она не будет находиться во второй нормальной форме.
Теперь давайте разберемся с функционально полной зависимостью, которая обязательна для второй нормальной формы, если вы посмотрите на таблицу, которая находится в первой нормальной форме, то увидите, что некоторые строки содержат одинаковые данные, данные дублируются.
А эти данные откуда-то должны браться, согласитесь, если мы делаем базу данных для какой-то организации, то у нас есть информация обо всех сотрудниках этой организации и эту информацию мы должны заранее определить в какую-то отдельную таблицу. Такие таблицы называются справочники баз данных или домены данных.
Для ясности перейдем к более конкретному примеру:
Нормализация отношений в базе данных. Таблица находится в первой нормальной форме.
Данная таблица находится в первой нормальной форме, в этой таблице есть два поля, которые находятся между собой в логической зависимости: Преподаватель и Дата рождения. Глядя на таблицу, мы не можем сказать, что преподаватель Сидоров родился в 1960 году, так как он родился в 1940.
То есть, дата рождения зависит от преподавателя – это функционально полная зависимость, следовательно, дату рождения нужно отправить в справочник преподавателей. Таким образом для данной таблицы мы должны создать два справочника: справочник предметов и справочник преподавателей.
Ко всему выше сказанному нужно сказать, что у каждой таблице будет ключ, однозначно идентифицирующий каждую запись, то есть первичный ключ. На примере это будет смотреться наглядней, пример базы данных во второй нормальной форме(2NF):
Нормализация базы данных. Отношение находится во второй нормальной форме.
Получается, преподавателей и предметы мы выносим на справочники, у каждого справочника есть уникальный идентификатор или первичный ключ, в нашем случае код для преподавателя – это первичный ключ для справочника Преподаватели, а код предмета – это первичный ключ для справочника Предметы.
Суть второй нормальной формы заключается в том, что мы вместо того, чтобы писать длинные фамилии и названия предметов в главную таблицу передаем только соответствующие идентификаторы, для главной таблицы эти идентификаторы являются внешними ключами, таким образом, устанавливается связь между «главной» таблицей и таблицами справочниками во второй нормальной форме.
Грубо говоря, коды, записанные в таблице, являются ссылками на справочники. Мы как бы говорим СУБД: вот она ссылка перейди по ней в справочник и ищи нужное значение в справочнике.
Вторая нормальная форма позволяет избавиться от избыточности данных и от аномалий баз данных. Приведу пример: гражданка Быкова выходит замуж и меняет фамилию на Степанову, нужно внести соответствующие изменения в БД. Если бы отношение находилось в первой нормальной форме, нам бы пришлось изменить все записи, связанные с Быковой, а если отношение находится во второй нормальной форме, мы меняем только одну запись, именно ту запись, которая находится в справочнике.
Но, создавая справочники, мы получаем неприятность – транзитивную зависимость, эту неприятность позволяет нам решить третья нормальная форма, к которой мы и переходим.