Найти в Дзене
Егор Гусаков

Нормальные формы баз данных простым языком. Часть №1.

Зачастую в кругах разработчиков приходится слышать о ненужности таких понятий как «Нормальные формы баз данных», мол если вы хоть немного работали с базами данных, то все. что описывают нормальный форма БД и так для вас логично и понятно. По мне так этот тезис неверен, ведь одно дело исходить из логики, а другое дело исходить из формализованных, описанных данных. Сколько всего существуем нормальных форм БД ? Тема будет разбита на три части, в этой статье будут рассмотрены первые три нормальные формы. На практике базы данных нормализованные дальше третьей формы встречаются крайне редко. Первая нормальная форма В каждой ячейке таблицы должно храниться одно значение и не должно быть повторяющихся строк. Пример Существует база данных — providers, в которой хранится таблица с поставщиками — users. До нормализации база данных выглядит следующим образом: Видим явное нарушение первой нормальной форма в ячейке product_category — в одной ячейке хранится несколько значений. Для нормализации форм
Оглавление

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

По мне так этот тезис неверен, ведь одно дело исходить из логики, а другое дело исходить из формализованных, описанных данных.

Сколько всего существуем нормальных форм БД ?

  • Первая нормальная форма;
  • Вторая нормальная форма;
  • Третья нормальная форма;
  • Нормальная форма Бойса-Кодда или Усиленная третья нормальная форма;
  • Четвертая нормальная форма;
  • Пятая нормальная форма;
  • Шестая нормальная форма;
  • Доменно-Ключевая нормальная форма.

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

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

Первая нормальная форма

В каждой ячейке таблицы должно храниться одно значение и не должно быть повторяющихся строк.

Пример

Существует база данных — providers, в которой хранится таблица с поставщиками — users. До нормализации база данных выглядит следующим образом:

Первая нормальная форма базы данных. До нормализации.
Первая нормальная форма базы данных. До нормализации.

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

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

Первая нормальная форма базы данных. После нормализации.
Первая нормальная форма базы данных. После нормализации.

Вторая нормальная форма

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

Пример

Возьмем уже известную таблицу - providers и добавим в ней первичные ключи для записей - id.

Вторая нормальный форма базы данных. До нормализации.
Вторая нормальный форма базы данных. До нормализации.

Так как значения поля id имеют повторения, сделаем первичный ключ составным, то есть он будет состоять из поля id + product_category.

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

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

Вторая нормальный форма базы данных. До нормализации.
Вторая нормальный форма базы данных. До нормализации.

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

Третья нормальная форма

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