Объясните принципы третьей нормальной формы в проектировании баз данных
Ответ от нейросети
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НФ.
- В исходной таблице
Employeesсмешаны данные о сотруднике и отделе. - Поле
department_nameзависит отdepartment_id, а не от самого сотрудника. - Если название отдела изменится, его придется обновлять во всех строках, где этот отдел указан.
- После разбиения на две таблицы:
- информация о сотруднике хранится отдельно;
- информация об отделе хранится отдельно;
- связь реализуется через внешний ключ
department_id.
- Это устраняет дублирование и делает обновления безопаснее.
Ключевые моменты:
- 3НФ устраняет транзитивные зависимости.
- Все неключевые атрибуты должны зависеть только от ключа таблицы.
- 3НФ уменьшает дублирование данных и риск несогласованности.
- Нормализация улучшает целостность, но может увеличить число JOIN-запросов.
- На практике иногда сознательно отступают от 3НФ ради производительности, если это оправдано.