Что такое третья форма нормализации?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое третья форма нормализации?
Третья форма нормализации (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
- Когда доступная память ограничена
Третья нормальная форма — это балансир между минимизацией дублирования и практической применимостью базы данных.