JavaRush /Курсы /SQL SELF /Принципы второй нормальной формы (2NF)

Принципы второй нормальной формы (2NF)

SQL SELF
25 уровень , 2 лекция
Открыта

Таблица считается находящейся во второй нормальной форме, если:

  1. Она уже находится в первой нормальной форме (1NF).
  2. Каждая неключевая колонка зависит от всего первичного ключа, а не только от части ключа.

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

Пример нарушения 2NF

Допустим, у нас есть таблица student_courses (Студенты и Курсы), которая хранит информацию о студентах, их курсах и преподавателях:

student_id course_id course_name instructor_name
1 101 Математика Lin
1 102 Литература Song
2 101 Математика Lin
  • student_id и course_id вместе образуют составной первичный ключ.
  • Но обратите внимание на колонки course_name и instructor_name. Они зависят только от course_id, а не от всей пары (student_id, course_id).

Вот она, частичная зависимость! course_name и instructor_name зависят только от части составного ключа (course_id). Это нарушение принципов 2NF.

Приведение таблицы к 2NF

Наша задача — устранить частичную зависимость, разделив таблицу на две. Это избавит нас от избыточности и улучшит согласованность данных.

Выделим информацию про курсы в отдельную таблицу courses:

course_id course_name instructor_name
101 Математика Lin
102 Литература Song

Основную таблицу сведем к следующему виду:

student_id course_id
1 101
1 102
2 101

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

Магия устранения избыточности

Обратите внимание на таблицу до нормализации. В колонке instructor_name повторяется имя "Lin". А сколько таких повторений может быть в реальной базе с тысячами записей? Путём разделения таблиц мы устранили избыточность и снизили вероятность ошибок, например, опечаток ("Lin" vs "Ling").

Пример из жизни

Представьте, что вы ведёте учёт заказов на товары. У вас есть следующая таблица order_items (заказы и товары), где order_id и item_id составляют первичный ключ:

order_id item_id item_name price
1 101 Лэптоп 50000
1 102 Мышь 1000
2 101 Лэптоп 50000

Как видите, цены и названия товаров повторяются. Это признак нарушения 2NF, потому что item_name и price зависят только от item_id.

Для приведения таблицы к 2NF создадим таблицу items:

item_id item_name price
101 Лэптоп 50000
102 Мышь 1000

И изменим таблицу order_items, оставив только идентификаторы заказа и товара:

order_id item_id
1 101
1 102
2 101

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

Практическое задание: попробуй сам!

Пусть у вас есть таблица employee_projects, содержащая информацию о сотрудниках, их проектах и менеджерах проектов:

employee_id project_id project_name manager_name
1 201 CRM Upgrade Lin
2 202 Website Revamp Ming
1 202 Website Revamp Ming

Попробуйте:

  1. Найти зависимости, которые нарушают требования 2NF.
  2. Разделить таблицу на две, устранив нарушение.

Почему важно соблюдать 2NF?

Зачем вообще соблюдать вторую нормальную форму (2NF)? Всё просто: чтобы данные не дублировались и не создавали путаницу. Когда вы убираете частичные зависимости, таблицы становятся чище — без повторяющейся информации, вроде одного и того же имени преподавателя в каждой строке. Это экономит место и избавляет от риска несостыковок: обновили имя в одном месте — и всё сразу актуально.

К тому же, запросы к такой базе писать проще: когда структура логична и данные не размазаны по куче строк, фильтрация и группировка работают быстрее и надёжнее. Да, за это приходится платить чуть более сложными SQL-запросами с JOIN’ами, потому что таблиц становится больше. Но всё же лучше один JOIN, чем сто строк с одними и теми же фамилиями. В большинстве случаев нормализация того стоит.

Интеграция с реальными проектами

Знание 2NF пригодится вам:

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

Вторая нормальная форма (2NF) помогает устранить частичные зависимости в таблице, где первичный ключ является составным. Мы разделяем таблицы на логические блоки, чтобы каждая колонка зависела только от всего ключа, а не от его части. Это улучшает качество базы данных, устраняет избыточность и повышает её гибкость. Готовы к третьей нормальной форме? Переходим дальше!

2
Задача
SQL SELF, 25 уровень, 2 лекция
Недоступна
Приведение таблицы к 2NF
Приведение таблицы к 2NF
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 50
10 февраля 2026
❤️
9 ноября 2025
В условии: -- Создание таблицы student_courses для хранения связи между студентами и курсами. А по итогу нам нужна student_courses_new.
Slevin Уровень 57
17 сентября 2025
"Лэптоп" мне в сраку 🤣 Зачем давать в условиях задачи - ее решение?
Евгений Уровень 49 Expert
25 августа 2025
Если говорить начистоту, то примеры "нормализации" в лекции и в задаче не являются полными 🙂 Например, в задаче мы создаём таблицу courses, но вообще-то данную таблицу тоже надо нормализовать, потому что в реальной жизни один инструктор может вести несколько курсов. Т.е. надо создать ещё отдельную таблицу только под инструкторов. Однако, это уже будет не 2НФ, а следующая нормальная форма 😏
Александер Уровень 31
2 августа 2025
Ошибка в задаче : -- Создание таблицы student_courses для хранения связи между студентами и курсами -- Вставка данных о связи студентов и курсов в новую таблицу student_courses_new Выше создаём конечно же student_courses_new и потом в неё вставляем данные .