← Назад к вопросам

Что такое третья форма нормализации?

1.0 Junior🔥 201 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое третья форма нормализации?

Третья форма нормализации (3NF — Third Normal Form) — это состояние базы данных, в котором таблица полностью соответствует второй нормальной форме (2NF) и не содержит транзитивных зависимостей. Транзитивная зависимость возникает, когда неключевой атрибут зависит от другого неключевого атрибута, а не только от первичного ключа. 3NF обеспечивает минимальную избыточность данных при сохранении возможности эффективных запросов.

Предыдущие формы нормализации

1NF (Первая нормальная форма)

  • Все значения атомарны (неделимы)
  • Нет повторяющихся групп данных

2NF (Вторая нормальная форма)

  • Соответствует 1NF
  • Все неключевые атрибуты полностью функционально зависят от первичного ключа
  • Нет частичных зависимостей

3NF (Третья нормальная форма)

  • Соответствует 2NF
  • Нет транзитивных зависимостей — неключевые атрибуты зависят только от первичного ключа, не друг от друга

Пример: нарушение 3NF

Таблица студентов (не нормализована):

const students = [
  {
    id: 1,
    name: 'Иван',
    groupId: 101,
    groupName: 'ПИ-1', // зависит от groupId, не от id студента!
    groupTeacher: 'Петров'
  },
  {
    id: 2,
    name: 'Мария',
    groupId: 101,
    groupName: 'ПИ-1', // дублирование!
    groupTeacher: 'Петров'
  }
];

Проблемы:

  • Дублирование: groupName и groupTeacher повторяются для каждого студента
  • Аномалия обновления: если изменить учителя группы, нужно обновить все записи
  • Аномалия удаления: если удалить всех студентов группы, потеряем информацию о группе
  • Транзитивная зависимость: groupName → groupId → id студента

Решение: приведение к 3NF

Таблица студентов:

const students = [
  { id: 1, name: 'Иван', groupId: 101 },
  { id: 2, name: 'Мария', groupId: 101 }
];

Таблица групп (отдельно):

const groups = [
  {
    id: 101,
    name: 'ПИ-1',
    teacherId: 5
  }
];

Таблица учителей (отдельно):

const teachers = [
  {
    id: 5,
    name: 'Петров',
    department: 'Информатика'
  }
];

SQL пример

Неправильно (нарушает 3NF):

CREATE TABLE students (
  id INT PRIMARY KEY,
  name VARCHAR(100),
  group_id INT,
  group_name VARCHAR(50), -- зависит от group_id!
  teacher_name VARCHAR(100) -- зависит от group_id!
);

Правильно (3NF):

CREATE TABLE students (
  id INT PRIMARY KEY,
  name VARCHAR(100),
  group_id INT REFERENCES groups(id)
);

CREATE TABLE groups (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  teacher_id INT REFERENCES teachers(id)
);

CREATE TABLE teachers (
  id INT PRIMARY KEY,
  name VARCHAR(100),
  department VARCHAR(100)
);

Запросы с нормализованной структурой

-- Получить студента с информацией о группе и учителе
SELECT s.name, g.name as group_name, t.name as teacher_name
FROM students s
JOIN groups g ON s.group_id = g.id
JOIN teachers t ON g.teacher_id = t.id
WHERE s.id = 1;

Преимущества 3NF

  • Минимальная избыточность: данные хранятся один раз
  • Целостность: изменения в одном месте
  • Производительность: эффективные индексы на внешних ключах
  • Гибкость: легко добавлять новые атрибуты

Недостатки 3NF

  • Сложные запросы: больше JOIN операций
  • Медленнее для чтения: разъединённые таблицы требуют объединения
  • Иногда требуется денормализация для аналитики

Когда использовать 3NF

  • OLTP системы (Online Transaction Processing) — финансы, CRM, управление заказами
  • Когда важна целостность данных
  • Когда много операций INSERT/UPDATE
  • Когда доступная память ограничена

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

Что такое третья форма нормализации? | PrepBro