Какие знаешь нормальные формы БД
Python
Middle
Без компании
Какие знаешь нормальные формы БД
Ответы
Нормальные формы (НФ) — это правила проектирования реляционных баз данных, которые помогают избежать аномалий при операциях с данными. Основные нормальные формы:
- **1НФ** — все атрибуты атомарны (неделимы), нет повторяющихся групп.
Пример: вместо столбца `Телефоны` с данными `"123, 456"` создаются отдельные записи для каждого телефона.
- **2НФ** — выполняется 1НФ + все неключевые атрибуты зависят от всего первичного ключа (нет частичной зависимости).
Пример: в таблице `Заказы(OrderID, ProductID, ProductName, Quantity)` поле `ProductName` зависит только от `ProductID` — нарушение. Нужно разделить на `Заказы` и `Продукты`.
- **3НФ** — выполняется 2НФ + нет транзитивных зависимостей (неключевые атрибуты не зависят от других неключевых атрибутов).
Пример: в `Сотрудники(EmployeeID, Department, Manager)` поле `Manager` зависит от `Department` — нарушение. Нужно выделить таблицу `Отделы`.
- **НФБК (Бойса-Кодда)** — частный случай 3НФ, где любая детерминанта (атрибут, от которого зависит другой) является потенциальным ключом.
- **4НФ** — выполняется НФБК + нет многозначных зависимостей.
Пример: в `Студенты-Курсы(StudentID, CourseID, Hobby)` хобби не зависит от курса — нарушение. Нужно разделить.
- **5НФ (ПНФ)** — выполняется 4НФ + отсутствуют зависимости соединения.
Пример приведения к 3НФ:
```
-- Исходная таблица (нарушает 2НФ и 3НФ)
CREATE TABLE Orders (
OrderID INT,
ProductID INT,
ProductName VARCHAR(100),
CustomerName VARCHAR(100),
PRIMARY KEY (OrderID, ProductID)
);
-- Нормализованная структура
CREATE TABLE Orders (OrderID INT PRIMARY KEY, CustomerName VARCHAR(100));
CREATE TABLE Products (ProductID INT PRIMARY KEY, ProductName VARCHAR(100));
CREATE TABLE OrderItems (OrderID INT, ProductID INT, PRIMARY KEY (OrderID, ProductID));
```