Тест на вакансию

Нормальные формы (NF) в теории реляционных баз данных

10 сентября 2025 г.
Нормальные формы (NF) в теории реляционных баз данных - это правила, определяющие структуру таблицы, чтобы уменьшить избыточность данных и улучшить целостность данных. Они помогают бороться с аномалиями, возникающими при операциях обновления, вставки и удаления данных.

Вот основные нормальные формы с примерами:

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

  • Описание: Таблица находится в 1NF, если:

    • Каждая ячейка таблицы содержит только одно атомарное значение (не содержит списки, массивы, повторяющиеся группы).
    • Все столбцы содержат атомарные значения.
       
  • Пример нарушения (не в 1NF):
    ID Имя Телефоны
    1 Иван 123-456-7890, 987-654-3210
    2 Мария 555-123-4567

    В столбце “Телефоны” хранятся несколько значений в одной ячейке.
     
  • Пример в 1NF (исправлено):

    ID Имя Телефон
    1 Иван 123-456-7890
    1 Иван 987-654-3210
    2 Мария 555-123-4567

    Теперь каждый номер телефона находится в отдельной строке.

2. Вторая нормальная форма (2NF)

  • Описание: Таблица находится в 2NF, если она находится в 1NF, и каждый неключевой атрибут (столбец, который не является частью первичного ключа) функционально зависит от всего первичного ключа, а не от его части.

  • Пример нарушения:

    Предположим, у нас есть таблица Заказы_с_товарами:
    OrderID ProductID Product_Name Product_Price Quantity
    1 10 Книга 20 2
    1 20 Ручка 5 1
    2 10 Книга 20 1

    Здесь OrderID и ProductID являются составным первичным ключом (PK). Product_Name и Product_Price зависят только от ProductID (части PK), а не от всего PK.
     
  • Пример в 2NF (исправлено):
    • Таблица Заказы_с_товарами (частично):

      OrderID ProductID Quantity
      1 10 2
      1 20 1
      2 10 1
    • Таблица Товары:

      ProductID Product_Name Product_Price
      10 Книга 20
      20 Ручка 5


    Теперь информация о товарах хранится в отдельной таблице. В Заказы_с_товарами мы храним только информацию о количестве товаров в заказе, связанную с ProductID.

3. Третья нормальная форма (3NF)

  • Описание: Таблица находится в 3NF, если она находится в 2NF и ни один неключевой атрибут не зависит транзитивно от первичного ключа. Транзитивная зависимость означает, что столбец зависит от другого неключевого столбца, который, в свою очередь, зависит от первичного ключа.
  • Пример нарушения:
    EmployeeID EmployeeName DepartmentID DepartmentName
    1 Иван 10 Продажи
    2 Мария 20 Маркетинг
    3 Петр 10 Продажи

    Здесь EmployeeID - первичный ключ. DepartmentName зависит от DepartmentID, который, в свою очередь, зависит от EmployeeID. Это транзитивная зависимость.
     
  • Пример в 3NF (исправлено):
    • Таблица Сотрудники:

      EmployeeID EmployeeName DepartmentID
      1 Иван 10
      2 Мария 20
      3 Петр 10
    • Таблица Отделы:

      DepartmentID DepartmentName
      10 Продажи
      20 Маркетинг


    Теперь информация об отделах хранится в отдельной таблице, и связь между таблицами осуществляется через DepartmentID.

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

  • Описание: Более строгая, чем 3NF. Таблица находится в BCNF, если для каждой функциональной зависимости (X -> Y), X является суперключом. Суперключ — это атрибут или набор атрибутов, которые однозначно идентифицируют строку.
  • Пример нарушения:
    StudentID Course Instructor
    1 Math Professor X
    1 Physics Professor Y
    2 Math Professor X
    2 History Professor Z

    Здесь StudentID и Course вместе определяют Instructor. Но в тоже время, один студент может посещать несколько курсов, и один курс может вести несколько преподавателей. Course не является суперключом.
     
  • Пример в BCNF (исправлено):
    • Таблица Ученик-Преподаватель:

      StudentID Instructor
      1 Professor X
      1 Professor Y
      2 Professor X
      2 Professor Z
    • Таблица Курсы: (Если важна информация о курсах)

      Course Instructor
      Math Professor X
      Physics Professor Y
      History Professor Z

    или:
     
    • Таблица Курсы_с_преподавателями:

      StudentID Course
      1 Math
      1 Physics
      2 Math
      2 History
    • Таблица Курс-Преподаватель:

      Course Instructor
      Math Professor X
      Physics Professor Y
      History Professor Z


    В этом случае, каждый преподаватель связан с одним курсом.
Поделиться: