10 сентября 2025 г.
Нормальные формы (NF) в теории реляционных баз данных - это правила, определяющие структуру таблицы, чтобы уменьшить избыточность данных и улучшить целостность данных. Они помогают бороться с аномалиями, возникающими при операциях обновления, вставки и удаления данных.
Вот основные нормальные формы с примерами:
1. Первая нормальная форма (1NF)
2. Вторая нормальная форма (2NF)
-
Описание: Таблица находится в 2NF, если она находится в 1NF, и каждый неключевой атрибут (столбец, который не является частью первичного ключа) функционально зависит от всего первичного ключа, а не от его части.
- Пример нарушения:
Предположим, у нас есть таблица Заказы_с_товарами:
| OrderID |
ProductID |
Product_Name |
Product_Price |
Quantity |
| 1 |
10 |
Книга |
20 |
2 |
| 1 |
20 |
Ручка |
5 |
1 |
| 2 |
10 |
Книга |
20 |
1 |
Здесь OrderID и ProductID являются составным первичным ключом (PK). Product_Name и Product_Price зависят только от ProductID (части PK), а не от всего PK.
- Пример в 2NF (исправлено):
Теперь информация о товарах хранится в отдельной таблице. В Заказы_с_товарами мы храним только информацию о количестве товаров в заказе, связанную с ProductID.
3. Третья нормальная форма (3NF)
- Описание: Таблица находится в 3NF, если она находится в 2NF и ни один неключевой атрибут не зависит транзитивно от первичного ключа. Транзитивная зависимость означает, что столбец зависит от другого неключевого столбца, который, в свою очередь, зависит от первичного ключа.
- Пример нарушения:
| EmployeeID |
EmployeeName |
DepartmentID |
DepartmentName |
| 1 |
Иван |
10 |
Продажи |
| 2 |
Мария |
20 |
Маркетинг |
| 3 |
Петр |
10 |
Продажи |
Здесь EmployeeID - первичный ключ. DepartmentName зависит от DepartmentID, который, в свою очередь, зависит от EmployeeID. Это транзитивная зависимость.
- Пример в 3NF (исправлено):
-
Таблица Сотрудники:
| EmployeeID |
EmployeeName |
DepartmentID |
| 1 |
Иван |
10 |
| 2 |
Мария |
20 |
| 3 |
Петр |
10 |
-
Таблица Отделы:
| DepartmentID |
DepartmentName |
| 10 |
Продажи |
| 20 |
Маркетинг |
Теперь информация об отделах хранится в отдельной таблице, и связь между таблицами осуществляется через DepartmentID.
4. Нормальная форма Бойса – Кодда (BCNF)
- Описание: Более строгая, чем 3NF. Таблица находится в BCNF, если для каждой функциональной зависимости (X -> Y), X является суперключом. Суперключ — это атрибут или набор атрибутов, которые однозначно идентифицируют строку.
- Пример нарушения:
| StudentID |
Course |
Instructor |
| 1 |
Math |
Professor X |
| 1 |
Physics |
Professor Y |
| 2 |
Math |
Professor X |
| 2 |
History |
Professor Z |
Здесь StudentID и Course вместе определяют Instructor. Но в тоже время, один студент может посещать несколько курсов, и один курс может вести несколько преподавателей. Course не является суперключом.
- Пример в BCNF (исправлено):
или:
В этом случае, каждый преподаватель связан с одним курсом.