Объясните концепцию третьей нормальной формы в реляционной базе данных и зачем она нужна.
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Третья нормальная форма нужна, чтобы убрать избыточность и зависимость неключевых полей друг от друга. Таблица в 3НФ не должна содержать транзитивных зависимостей: каждый неключевой атрибут должен зависеть только от ключа, а не от другого неключевого атрибута. Это упрощает поддержку данных и снижает риск аномалий при вставке, обновлении и удалении.
Определение:
Третья нормальная форма (3НФ) — это свойство реляционной таблицы, при котором она уже находится во второй нормальной форме и в ней отсутствуют транзитивные зависимости между неключевыми столбцами. Иными словами, любой неключевой столбец должен зависеть только от первичного ключа, а не от другого неключевого столбца.
Практический смысл 3НФ — хранить один факт в одном месте. Если одно и то же значение дублируется в нескольких строках, появляются риски рассинхронизации и лишние обновления.
Пример использования:
Допустим, есть таблица Orders:
| OrderId | CustomerId | CustomerName | CustomerCity |
|---|---|---|---|
| 1 | 10 | Иван | Москва |
| 2 | 11 | Анна | Казань |
Здесь CustomerName и CustomerCity зависят не от OrderId, а от CustomerId. Это транзитивная зависимость, и таблица не в 3НФ.
Лучше разделить данные:
CREATE TABLE Customers (
CustomerId INT PRIMARY KEY,
CustomerName NVARCHAR(100) NOT NULL,
CustomerCity NVARCHAR(100) NOT NULL
);
CREATE TABLE Orders (
OrderId INT PRIMARY KEY,
CustomerId INT NOT NULL,
FOREIGN KEY (CustomerId) REFERENCES Customers(CustomerId)
);
Теперь данные о клиенте хранятся отдельно, а заказ ссылается на клиента по CustomerId.
Пояснение кода:
Код нужен, чтобы показать, как 3НФ выглядит на практике.
- В
Customersхранится информация только о клиенте. - В
Ordersхранится только сам заказ и ссылка на клиента. - Имя и город клиента не дублируются в каждой строке заказов.
- Если город клиента изменится, достаточно обновить одну запись в
Customers. - Если удалить заказ, данные о клиенте не потеряются.
Ключевые моменты:
- 3НФ устраняет транзитивные зависимости.
- Каждый неключевой атрибут должен зависеть только от ключа.
- Нормализация уменьшает дублирование данных.
- 3НФ снижает риск аномалий вставки, обновления и удаления.
- На практике 3НФ часто достигается разбиением одной широкой таблицы на несколько связанных таблиц.
- Иногда в реальных системах допускают денормализацию ради производительности, но осознанно.