Sobes.tech
Назад к вопросам
Junior — Middle
55

Когда рекомендуется применять нормальные формы при проектировании базы данных?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

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

Определение:

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

Пример использования:

Например, в системе заказов не стоит хранить в одной таблице и данные заказа, и данные клиента, и список товаров в строках с повторяющимися полями. Лучше разделить на Customers, Orders, OrderItems, чтобы данные клиента не дублировались в каждом заказе.

CREATE TABLE Customers (
    CustomerId INT PRIMARY KEY,
    Name NVARCHAR(100) NOT NULL,
    Email NVARCHAR(100) NOT NULL
);

CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    CustomerId INT NOT NULL,
    OrderDate DATETIME NOT NULL,
    FOREIGN KEY (CustomerId) REFERENCES Customers(CustomerId)
);

CREATE TABLE OrderItems (
    OrderItemId INT PRIMARY KEY,
    OrderId INT NOT NULL,
    ProductName NVARCHAR(100) NOT NULL,
    Quantity INT NOT NULL,
    Price DECIMAL(18,2) NOT NULL,
    FOREIGN KEY (OrderId) REFERENCES Orders(OrderId)
);

Пояснение кода:

Код показывает нормализованную структуру:

  • Customers хранит только данные клиента.
  • Orders хранит только сам заказ и ссылку на клиента.
  • OrderItems хранит позиции заказа отдельно, без повторения данных заказа для каждой позиции.

Такое разбиение уменьшает дублирование и позволяет менять email клиента в одном месте, а не в десятках строк заказов.

Ключевые моменты:

  • Нормализация нужна в первую очередь для целостности данных и уменьшения избыточности.
  • Чаще всего схема доводится минимум до 3НФ, если нет особых причин иначе.
  • Сильная нормализация упрощает сопровождение и уменьшает аномалии обновления.
  • Для высокой скорости чтения иногда допускают денормализацию отдельных мест.
  • Решение всегда зависит от баланса между качеством данных и требованиями к производительности.