Что такое нормальные формы в базах данных и какие из них основные

Ответ

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

Основные и наиболее часто используемые нормальные формы:

  1. Первая нормальная форма (1НФ)

    • Правило: Все атрибуты (столбцы) должны быть атомарными, то есть содержать неделимые значения. В таблице не должно быть повторяющихся групп столбцов.
    • Проблема: Невозможность эффективно запрашивать и индексировать составные данные.
    • Пример:
      • Нарушение: Таблица Сотрудники со столбцом Телефоны, содержащим '8-800-..., 8-900-...'.
      • Решение: Создать отдельную таблицу Телефоны_Сотрудников(СотрудникID, Телефон).
  2. Вторая нормальная форма (2НФ)

    • Правило: Таблица должна быть в 1НФ, и все неключевые атрибуты должны полностью зависеть от всего составного первичного ключа (а не от его части).
    • Проблема: Избыточность данных и аномалии обновления.
    • Пример:
      • Нарушение: Таблица Заказы(OrderID, ProductID, ProductName, Quantity) с первичным ключом (OrderID, ProductID). ProductName зависит только от ProductID, а не от всего ключа.
      • Решение: Разделить на две таблицы: Заказы(OrderID, ProductID, Quantity) и Продукты(ProductID, ProductName).
  3. Третья нормальная форма (3НФ)

    • Правило: Таблица должна быть в 2НФ, и все неключевые атрибуты должны зависеть только от первичного ключа, а не от других неключевых атрибутов (отсутствие транзитивных зависимостей).
    • Проблема: Аномалии обновления и удаления.
    • Пример:
      • Нарушение: Таблица Сотрудники(EmployeeID, DepartmentName, DepartmentPhone). DepartmentPhone зависит от DepartmentName, который не является ключом.
      • Решение: Разделить на Сотрудники(EmployeeID, DepartmentID) и Отделы(DepartmentID, DepartmentName, DepartmentPhone).
  4. Нормальная форма Бойса-Кодда (НФБК/BCNF)

    • Это усиленная версия 3НФ. Требует, чтобы любая детерминанта (атрибут, от которого функционально зависят другие) была потенциальным ключом.

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