Ответ
Нормализация — процесс организации данных в реляционной БД для минимизации избыточности и устранения аномалий, что приводит к следующим преимуществам:
Ключевые преимущества:
- Устранение избыточности данных: Каждый факт хранится в одном месте. Это экономит место и, что важнее, предотвращает возможность противоречивых данных.
- Устранение аномалий:
- Аномалия обновления: Необходимость обновлять одни и те же данные в нескольких местах. Риск неполного обновления и рассогласованности.
- Аномалия удаления: Удаление одних данных может нежелательно повлечь удаление других (потеря информации).
- Аномалия вставки: Невозможность добавить данные, пока не добавлены какие-то другие (например, нельзя добавить заказ без клиента).
- Упрощение поддержки и модификации: Изменения вносятся только в одном месте.
- Улучшение целостности данных: Легче поддерживать ссылочную целостность с помощью внешних ключей (FOREIGN KEY).
Пример нормализации (от 0NF к 1NF):
-- Денормализованная таблица (проблемы: повторение, аномалии)
CREATE TABLE Orders_NonNormalized (
OrderID INT,
CustomerName VARCHAR(100),
CustomerPhone VARCHAR(20), -- Повторяется для каждого заказа
Product1 VARCHAR(100), -- Нарушение 1NF: несколько значений в ячейке
Product2 VARCHAR(100)
);
-- Нормализованная структура (1NF, 2NF, 3NF)
-- Разделение на сущности и использование связей
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
Name VARCHAR(100) NOT NULL,
Phone VARCHAR(20)
);
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
Name 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 OrderItems ( -- Разрешение связи many-to-many
OrderID INT,
ProductID INT,
Quantity INT,
PRIMARY KEY (OrderID, ProductID),
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID),
FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);
Компромисс: Чрезмерная нормализация (выше 3NF/BCNF) может усложнить запросы и снизить производительность из-за большого количества JOIN. Для оптимизации чтения часто применяется контролируемая денормализация.