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