Ответ
Нормализация — это процесс проектирования схемы реляционной базы данных, направленный на устранение избыточности данных и аномалий при вставке, обновлении и удалении (аномалий модификации). Достигается это путем декомпозиции таблиц и приведения их к нормальным формам (НФ).
Основные нормальные формы:
-
Первая нормальная форма (1НФ):
- Все значения атрибутов атомарны (неделимы).
- В таблице нет повторяющихся групп или массивов.
- Пример нарушения: Столбец
PhoneNumbersсо значением"123-456, 789-012". Исправление: вынести номера в отдельную таблицуCustomerPhones.
-
Вторая нормальная форма (2НФ):
- Таблица находится в 1НФ.
- Каждый неключевой атрибут полностью зависит от всего составного первичного ключа (а не от его части).
- Пример: Таблица
OrderDetails(OrderID, ProductID, ProductName, Quantity).ProductNameзависит только отProductID, а не от всей пары(OrderID, ProductID). Нарушение. Исправление: вынестиProductID, ProductNameв таблицуProducts.
-
Третья нормальная форма (3НФ):
- Таблица находится в 2НФ.
- Нет транзитивных зависимостей. Неключевые атрибуты не должны зависеть от других неключевых атрибутов.
- Пример: Таблица
Employees(EmployeeID, DepartmentID, DepartmentLocation).DepartmentLocationзависит отDepartmentID, который не является ключом. Нарушение. Исправление: вынестиDepartmentID, DepartmentLocationв таблицуDepartments.
Практический пример преобразования:
-- Исходная денормализованная таблица (нарушает 1НФ, 2НФ, 3НФ)
CREATE TABLE CustomerOrders (
OrderID INT,
CustomerName VARCHAR(100),
CustomerPhone VARCHAR(20), -- Зависит от CustomerName, а не от OrderID (3НФ)
ProductID INT,
ProductName VARCHAR(100), -- Зависит только от ProductID (2НФ)
Quantity INT
-- Первичный ключ? Составной (OrderID, ProductID)
);
-- Нормализованная схема (до 3НФ)
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
CustomerName VARCHAR(100) NOT NULL,
CustomerPhone VARCHAR(20)
);
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100) NOT NULL
);
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT NOT NULL,
OrderDate DATE,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
CREATE TABLE OrderDetails ( -- Разрешает составной PK для связи M:M
OrderID INT NOT NULL,
ProductID INT NOT NULL,
Quantity INT NOT NULL,
PRIMARY KEY (OrderID, ProductID),
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID),
FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);
Зачем это нужно? Нормализация минимизирует дублирование, обеспечивает целостность данных и упрощает поддержку. Однако для сложных аналитических запросов (OLAP) часто применяется контролируемая денормализация для повышения скорости чтения за счет избыточности.