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

Что такое нормальная форма в теории БД?

1.7 Middle🔥 171 комментариев
#Язык C++

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

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

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

Нормальная Форма в Теории Баз Данных

Нормальная форма (Normal Form) — это набор правил проектирования реляционных баз данных, которые помогают организовать данные так, чтобы минимизировать аномалии при вставке, обновлении и удалении данных, а также избежать дублирования информации. Это один из ключевых принципов нормализации БД.

Цели Нормализации

  • Устранение дублирования данных: один раз сохранённые данные, один раз изменяемые
  • Улучшение целостности данных: минимизация аномалий
  • Оптимизация хранения: экономия дискового пространства
  • Упрощение запросов: логичная структура таблиц

Уровни Нормальных Форм

1. Первая Нормальная Форма (1NF)

Требования:

  • Каждый атрибут содержит только атомарные (неделимые) значения
  • Нет повторяющихся групп атрибутов
  • Каждая ячейка содержит только одно значение

Пример НЕ в 1NF:

Таблица: Students
| ID | Name   | Subjects           |
|----|--------|-------------------|
| 1  | Иван   | Math, Physics     |
| 2  | Мария  | History, English  |

Поле "Subjects" содержит несколько значений в одной ячейке.

После приведения к 1NF:

Таблица: Students
| ID | Name   |
|----|--------|
| 1  | Иван   |
| 2  | Мария  |

Таблица: StudentSubjects
| StudentID | Subject |
|-----------|----------|
| 1         | Math    |
| 1         | Physics |
| 2         | History |
| 2         | English |

2. Вторая Нормальная Форма (2NF)

Требования:

  • Таблица должна быть в 1NF
  • Все неключевые атрибуты полностью зависят от первичного ключа (не от его части)

Пример НЕ в 2NF:

Таблица: Orders
| OrderID | ProductID | ProductName  | Quantity |
|---------|-----------|-------------|----------|
| 1       | 101       | Laptop      | 2        |
| 2       | 102       | Mouse       | 5        |

ProductName зависит только от ProductID, а не от всего ключа (OrderID, ProductID).

После приведения к 2NF:

Таблица: Orders
| OrderID | ProductID | Quantity |
|---------|-----------|----------|
| 1       | 101       | 2        |
| 2       | 102       | 5        |

Таблица: Products
| ProductID | ProductName |
|-----------|-------------|
| 101       | Laptop      |
| 102       | Mouse       |

3. Третья Нормальная Форма (3NF)

Требования:

  • Таблица должна быть в 2NF
  • Неключевые атрибуты не зависят от других неключевых атрибутов (нет транзитивной зависимости)

Пример НЕ в 3NF:

Таблица: Students
| StudentID | Name  | DepartmentID | DepartmentName |
|-----------|-------|--------------|----------------|
| 1         | Иван  | 10           | Computer Sci   |
| 2         | Мария | 11           | Mathematics    |

DepartmentName зависит от DepartmentID, а не напрямую от StudentID.

После приведения к 3NF:

Таблица: Students
| StudentID | Name  | DepartmentID |
|-----------|-------|---------------|
| 1         | Иван  | 10           |
| 2         | Мария | 11           |

Таблица: Departments
| DepartmentID | DepartmentName |
|--------------|----------------|
| 10           | Computer Sci   |
| 11           | Mathematics    |

4. Нормальная Форма Бойса-Кодда (BCNF)

Более строгая версия 3NF:

  • Требует, чтобы каждый детерминант был кандидатом для первичного ключа

Редко необходима на практике, используется в специальных случаях.

5. Четвёртая и Пятая Нормальные Формы (4NF, 5NF)

Редко используются на практике. Занимаются многозначными и связочными зависимостями.

Практическая Таблица Сравнения

| Форма | Требование                           | Проблемы до достижения |
|-------|--------------------------------------|------------------------|
| 1NF   | Атомарные значения                   | Дублирование данных    |
| 2NF   | Зависимость от полного ключа        | Аномалии при изменении |
| 3NF   | Нет транзитивной зависимости        | Сложность структуры    |
| BCNF  | Каждый детерминант - ключ           | Редко используется     |

SQL Пример Нормализации

-- ДО нормализации (плохо)
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerName VARCHAR(100),
    Products VARCHAR(500),  -- Несколько продуктов в одной ячейке
    Prices VARCHAR(200)
);

-- ПОСЛЕ нормализации (хорошо - 3NF)
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY,
    CustomerName VARCHAR(100)
);

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName VARCHAR(100),
    Price DECIMAL(10, 2)
);

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT REFERENCES Customers(CustomerID),
    OrderDate DATE
);

CREATE TABLE OrderItems (
    OrderItemID INT PRIMARY KEY,
    OrderID INT REFERENCES Orders(OrderID),
    ProductID INT REFERENCES Products(ProductID),
    Quantity INT
);

Когда Нарушать Нормализацию

Иногда полная нормализация может снизить производительность. Используются денормализованные схемы:

  • Кэширование: хранение вычисленных значений
  • Репликация: копирование данных в несколько таблиц
  • Агрегирование: предварительное вычисление сумм
  • OLAP системы: хранилища данных требуют денормализации

Такие решения принимаются после анализа производительности и требуют документирования причин.

Что такое нормальная форма в теории БД? | PrepBro