Ответ
Нормальные формы (НФ) — это набор правил и требований к структуре реляционной базы данных, направленных на устранение избыточности данных и аномалий (проблем при вставке, обновлении и удалении). Нормализация — это процесс приведения таблиц к этим формам.
Основные и наиболее часто используемые нормальные формы:
-
Первая нормальная форма (1НФ)
- Правило: Все атрибуты (столбцы) должны быть атомарными, то есть содержать неделимые значения. В таблице не должно быть повторяющихся групп столбцов.
- Проблема: Невозможность эффективно запрашивать и индексировать составные данные.
- Пример:
- Нарушение: Таблица
Сотрудникисо столбцомТелефоны, содержащим'8-800-..., 8-900-...'. - Решение: Создать отдельную таблицу
Телефоны_Сотрудников(СотрудникID, Телефон).
- Нарушение: Таблица
-
Вторая нормальная форма (2НФ)
- Правило: Таблица должна быть в 1НФ, и все неключевые атрибуты должны полностью зависеть от всего составного первичного ключа (а не от его части).
- Проблема: Избыточность данных и аномалии обновления.
- Пример:
- Нарушение: Таблица
Заказы(OrderID, ProductID, ProductName, Quantity)с первичным ключом(OrderID, ProductID).ProductNameзависит только отProductID, а не от всего ключа. - Решение: Разделить на две таблицы:
Заказы(OrderID, ProductID, Quantity)иПродукты(ProductID, ProductName).
- Нарушение: Таблица
-
Третья нормальная форма (3НФ)
- Правило: Таблица должна быть в 2НФ, и все неключевые атрибуты должны зависеть только от первичного ключа, а не от других неключевых атрибутов (отсутствие транзитивных зависимостей).
- Проблема: Аномалии обновления и удаления.
- Пример:
- Нарушение: Таблица
Сотрудники(EmployeeID, DepartmentName, DepartmentPhone).DepartmentPhoneзависит отDepartmentName, который не является ключом. - Решение: Разделить на
Сотрудники(EmployeeID, DepartmentID)иОтделы(DepartmentID, DepartmentName, DepartmentPhone).
- Нарушение: Таблица
-
Нормальная форма Бойса-Кодда (НФБК/BCNF)
- Это усиленная версия 3НФ. Требует, чтобы любая детерминанта (атрибут, от которого функционально зависят другие) была потенциальным ключом.
На практике для большинства систем достаточно достижения 3НФ, так как это обеспечивает хороший баланс между устранением избыточности и сложностью запросов.
Ответ 18+ 🔞
Слушай, ну это ж классика, блядь! Нормальные формы, ёпта! Это как инструкция по сборке шкафа из Икеи, только если её не соблюдать, у тебя не просто полка криво встанет, а вся твоя база данных накроется медным тазом, и ты будешь неделю выковыривать из неё аномалии вилкой.
Представь, ты хранишь данные как попало. Вот тебе таблица Заказы:
CREATE TABLE Заказы_Хаос (
OrderID INT,
ProductID INT,
ProductName VARCHAR(100), -- Название товара
CustomerName VARCHAR(100),
CustomerPhone VARCHAR(200) -- "8-800, 8-900, 8-495"
);
1НФ (Первая нормальная форма): Атомарность, ёбана!
Смотри на CustomerPhone. Что это за хуйня? "8-800, 8-900, 8-495"? Это ж три телефона в одной клетке! Как тебе найти все заказы, где был номер 8-900? Придётся строку парсить, блядь! Пиздец.
1НФ орёт: «Дели всё на атомы, мудак!» Один телефон — одна запись. Либо выноси в отдельную таблицу Телефоны.
2НФ (Вторая нормальная форма): Полная зависимость, а не частичная!
Допустим, первичный ключ тут — (OrderID, ProductID). Но ProductName (название товара) вообще похуй на OrderID! Оно зависит только от ProductID. Получается, если один и тот же товар в 100 заказах, его название будет повторяться 100 раз. Обновил название в одном месте — иди теперь ищи все остальные, хитрая жопа. 2НФ говорит: «Вынеси эту хуйню (ProductName) в отдельную таблицу Продукты, чтобы она зависела от ВСЕГО ключа, а не от его куска!»
3НФ (Третья нормальная форма): Без транзитивности, ёпта!
Теперь у нас в Заказах остались CustomerName и, допустим, CustomerDiscount (скидка клиента). Но скидка-то привязана не к ID заказа, а к самому клиенту! Это транзитивная зависимость: OrderID -> CustomerName -> CustomerDiscount. Если клиент поменял скидку, тебе опять надо бегать и обновлять все его старые заказы? Да ты охуел? 3НФ рубит с плеча: «Клиента — в отдельную таблицу! Пусть CustomerDiscount зависит от CustomerID, а не болтается как манда с ушами в таблице заказов».
-- Вот так уже похоже на правду, блядь
CREATE TABLE Заказы (
OrderID INT PRIMARY KEY,
CustomerID INT,
-- ... остальное
);
CREATE TABLE Позиции_Заказа (
OrderID INT,
ProductID INT,
Quantity INT,
PRIMARY KEY (OrderID, ProductID)
);
CREATE TABLE Продукты (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100)
);
CREATE TABLE Клиенты (
CustomerID INT PRIMARY KEY,
CustomerName VARCHAR(100),
CustomerDiscount DECIMAL(5,2)
);
Вот и вся магия, блядь. Если дойти до 3НФ — уже герой. BCNF (Бойса-Кодда) — это уже для перфекционистов, у которых терпения ебать ноль, а времени овердохуища. Главное — понять суть: резать эту хуйню (данные) так, чтобы каждая сущность отвечала за своё и не лезла в чужое, иначе будет пиздец с обновлениями и удалениями. В рот меня чих-пых, вот и вся нормализация!