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

Объясните принципы третьей нормальной формы в проектировании баз данных

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

sobes.tech AI

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

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

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

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

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

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

Допустим, есть таблица сотрудников:

Employees(
    employee_id,
    employee_name,
    department_id,
    department_name
)

Здесь department_name зависит не напрямую от employee_id, а от department_id. Это избыточно: название отдела будет повторяться у всех сотрудников одного отдела.

Правильнее разделить на две таблицы:

Employees(
    employee_id,
    employee_name,
    department_id
)

Departments(
    department_id,
    department_name
)

Теперь данные о названии отдела хранятся один раз, а связь идет через department_id.

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

Код выше показывает типичный переход к 3НФ.

  1. В исходной таблице Employees смешаны данные о сотруднике и отделе.
  2. Поле department_name зависит от department_id, а не от самого сотрудника.
  3. Если название отдела изменится, его придется обновлять во всех строках, где этот отдел указан.
  4. После разбиения на две таблицы:
    • информация о сотруднике хранится отдельно;
    • информация об отделе хранится отдельно;
    • связь реализуется через внешний ключ department_id.
  5. Это устраняет дублирование и делает обновления безопаснее.

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

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