Какие нормальные формы существуют в базах данных
Что проверяют
Умеете ли вы проектировать схему, а не только писать запросы к готовой. Формулировки нормальных форм легко заучить, поэтому интервьюер обычно проверяет применение. Следом почти всегда идёт вопрос, до какой формы вы доводите схему на практике и когда осознанно денормализуете.
Как отвечать
Идите от зависимости к форме, каждую подкрепляя примером:
- 1НФ: значения атомарны, нет повторяющихся групп и списков внутри ячейки, у строки есть ключ. Колонка
phonesсо строкой из двух телефонов через запятую это нарушение; - 2НФ: нет частичной зависимости неключевого атрибута от части составного ключа. Актуально только при составном ключе: в
order_items(order_id, product_id)колонкаproduct_nameзависит лишь от товара и должна уехать вproducts; - 3НФ: нет транзитивных зависимостей. В
employee(id, dept_id, dept_name)название отдела определяется его идентификатором, значит нужна отдельная таблица; - НФБК (Бойса-Кодда): усиление 3НФ, где каждая нетривиальная детерминанта обязана быть потенциальным ключом. Ловит редкие случаи с пересекающимися ключами-кандидатами;
- 4НФ и 5НФ: многозначные зависимости и зависимости соединения. На практике нужны редко, но формулировку знать полезно.
Главное скажите отдельно: цель нормализации это исключить аномалии вставки, обновления и удаления, а не соответствие учебнику. В боевых схемах обычно доводят до 3НФ или НФБК, а затем денормализуют осознанно: витрины под отчёты, сохранённая сумма заказа, кэш агрегата. Сразу объясните, кто поддерживает согласованность такого поля: триггер, код приложения или пересчёт по расписанию.
Для Java-собеседования уместно добавить, что нормализованная схема оборачивается джойнами, а JPA легко превращает их в N+1 запросов.
Где спотыкаются
Пересказывают определения, но не могут применить их к таблице, которую показали на доске.
Путают 2НФ и 3НФ, не замечая, что при односоставном первичном ключе вторая форма выполняется автоматически.
Занимают крайнюю позицию. Либо «нормализация всегда хорошо» без единого примера денормализации, либо «положим всё в JSONB, потом разберёмся», без ответа, как по такому полю искать и чем гарантировать структуру.