Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Третья нормальная форма Основы реляционных баз данных

В этом уроке мы разберем третью нормальную форму реляционной модели, а также ее требования.

Будем работать с текущей структурой:

users

id first_name last_name
2 Сергей Иванов
3 Иван Петров
5 Виктор Сидоров

goods

id name
50 утюг
30 кофеварка
20 телевизор
33 ноутбук

order_items

id user_id address good_id price
8 2 Москва, ул. Промышленная 50 1000.00
2 3 Самара, ул. Энгельса 30 5000.00
7 5 Омск, ул. Дворцовая 50 1000.00
4 5 Омск, ул. Дворцовая 20 6500.00
9 2 Москва, ул. Матросова 33 20000.00
6 2 Москва, ул. Матросова 33 20000.00

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

Третья нормальная форма включает в себя два пункта:

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

Первое требование уже выполнено, так как:

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

Поэтому разберем подробнее второе требование.

Зависимость колонок от первичного ключа, но не друг от друга

Стоимость заказа зависит от цены товара. При этом цена товара зависит от самого товара, то есть от good_id. Чтобы привести таблицу к третьей форме, нужно вынести цену в товар:

goods

id name price
50 утюг 1000.00
30 кофеварка 5000.00
20 телевизор 6500.00
33 ноутбук 20000.00

Наша таблица приобретает такой вид:

order_items

id user_id address good_id
8 2 Москва, ул. Промышленная 50
2 3 Самара, ул. Энгельса 30
7 5 Омск, ул. Дворцовая 50
4 5 Омск, ул. Дворцовая 20
9 2 Москва, ул. Матросова 33
6 2 Москва, ул. Матросова 33

С одной стороны, мы выполнили большую часть необходимой нормализации, с другой — новая структура имеет большой недостаток. Цена товара — вещь изменяемая, а вот стоимость покупки, которую мы совершили в прошлом – нет. Когда изменяется цена товара, изменится стоимость всех совершенных покупок, в которые входил данный товар. С точки зрения бухгалтерии и истории покупок это недопустимо.

Это значит, что цена товара должна копироваться в таблицу order_items. Но и в таблице goods она тоже нужна. В первую очередь для вывода на сайте на витрине.

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

Правильное решение – завести под адреса собственную таблицу. В ней адрес будет связан с пользователем, а вместо поля address в таблице заказов появится поле user_address_id.

Выводы

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


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
с нуля
Разработка веб-приложений на Django
1 декабря 10 месяцев
Иконка программы Java-разработчик
Профессия
с нуля
Разработка приложений на языке Java
1 декабря 10 месяцев
Иконка программы PHP-разработчик
Профессия
с нуля
Разработка веб-приложений на Laravel
1 декабря 10 месяцев
Иконка программы Инженер по тестированию
Профессия
с нуля
Ручное тестирование веб-приложений
дата определяется 4 месяца
Иконка программы Node.js-разработчик
Профессия
с нуля
Разработка бэкенд-компонентов для веб-приложений
1 декабря 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
с нуля
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
1 декабря 16 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»