← Назад к вопросам

Какие знаешь формы нормализации данных?

2.3 Middle🔥 121 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Формы нормализации данных в реляционных базах данных

Нормализация — это процесс организации данных в базе данных для уменьшения избыточности и улучшения целостности. Основные формы нормализации (нормальные формы) представляют собой последовательные шаги, каждый из которых устраняет определённые типы аномалий.

1NF: Первая нормальная форма

Первое правило: каждая таблица должна иметь уникальный идентификатор (первичный ключ).
Второе правило: все атрибуты (столбцы) должны быть атомарными (неделимыми) и не содержать повторяющихся групп.

-- Ненормализованная таблица (нарушение 1NF)
CREATE TABLE Orders (
    OrderID INT,
    CustomerName VARCHAR(100),
    Products VARCHAR(500) -- Неатомарное значение: "Product1, Product2, Product3"
);

-- Приведённая к 1NF
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerName VARCHAR(100)
);

CREATE TABLE OrderDetails (
    DetailID INT PRIMARY KEY,
    OrderID INT FOREIGN KEY REFERENCES Orders(OrderID),
    ProductName VARCHAR(100)
);

2NF: Вторая нормальная форма

Таблица должна находиться в 1NF, и все неключевые атрибуты должны полностью зависеть от всего составного первичного ключа, а не от его части.

-- Нарушение 2NF: ProductName зависит только от ProductID, а не от всего ключа (OrderID, ProductID)
CREATE TABLE OrderItems (
    OrderID INT,
    ProductID INT,
    ProductName VARCHAR(100), -- Частичная зависимость
    Quantity INT,
    PRIMARY KEY (OrderID, ProductID)
);

-- Приведённая к 2NF
CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName VARCHAR(100)
);

CREATE TABLE OrderItems (
    OrderID INT,
    ProductID INT,
    Quantity INT,
    PRIMARY KEY (OrderID, ProductID),
    FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);

3NF: Третья нормальная форма

Таблица должна быть в 2NF, и все неключевые атрибуты должны быть независимы друг от друга (нет транзитивных зависимостей).

-- Нарушение 3NF: Discount зависит от Category, а не напрямую от ProductID
CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName VARCHAR(100),
    Category VARCHAR(50),
    Discount DECIMAL(5,2) -- Транзитивная зависимость через Category
);

-- Приведённая к 3NF
CREATE TABLE Categories (
    CategoryID INT PRIMARY KEY,
    CategoryName VARCHAR(50),
    Discount DECIMAL(5,2)
);

CREATE TABLE Products (
    ProductID INT PRIMARY KEY,
    ProductName VARCHAR(100),
    CategoryID INT FOREIGN KEY REFERENCES Categories(CategoryID)
);

Дополнительные нормальные формы

BCNF (Нормальная форма Бойса-Кодда)

Усиленная версия 3NF, которая устраняет аномалии, когда детерминант не является потенциальным ключом. Все нетривиальные функциональные зависимости должны иметь в левой части суперключ.

-- Пример нарушения BCNF: преподаватель определяет предмет, но не является ключом
CREATE TABLE Teaching (
    StudentID INT,
    Subject VARCHAR(50),
    Teacher VARCHAR(50), -- Детерминант, но не ключ
    PRIMARY KEY (StudentID, Subject)
);

4NF: Четвёртая нормальная форма

Таблица должна быть в BCNF и не содержать многозначных зависимостей, кроме ключа. Устраняет ситуации, когда несколько независимых многозначных атрибутов размещены в одной таблице.

-- Нарушение 4NF: студент может изучать несколько предметов и иметь несколько увлечений
CREATE TABLE StudentInfo (
    StudentID INT,
    Subject VARCHAR(50),
    Hobby VARCHAR(50) -- Многозначная зависимость
);

-- Приведённая к 4NF
CREATE TABLE StudentSubjects (
    StudentID INT,
    Subject VARCHAR(50),
    PRIMARY KEY (StudentID, Subject)
);

CREATE TABLE StudentHobbies (
    StudentID INT,
    Hobby VARCHAR(50),
    PRIMARY KEY (StudentID, Hobby)
);

5NF (Нормальная форма проекции-соединения)

Устраняет зависимости соединения, гарантируя, что таблица может быть восстановлена без потерь из её проекций.

Практическое применение нормализации

Преимущества нормализации:

  • Устранение избыточности данных — экономия дискового пространства
  • Снижение аномалий при обновлении — избегание противоречивых данных
  • Улучшение целостности данных — через внешние ключи и зависимости
  • Упрощение поддержки — чёткая структура данных

Когда нормализация может быть излишней:

  • Системы OLAP (аналитические) часто используют денормализованные схемы (звёздные, снежинки)
  • Высоконагруженные OLTP-системы с преобладанием чтения
  • Ситуации, когда производительность критична, а данные относительно статичны

В C# Backend-разработке понимание нормализации помогает:

  1. Проектировать эффективные модели Entity Framework
  2. Оптимизировать запросы LINQ с учётом структуры БД
  3. Реализовывать репозитории, которые учитывают связи между сущностями
  4. Принимать осознанные решения о денормализации для конкретных сценариев

Нормализация — это баланс между теоретической чистотой данных и практической производительностью. Опытный разработчик знает, когда строго следовать нормальным формам, а когда допустимо отступить от них в пользу производительности.

Какие знаешь формы нормализации данных? | PrepBro