Что такое транзитивная зависимость и с какими проблемами она связана
Что проверяют
Термин живёт в двух мирах: в проектировании схемы и в сборке проекта. По теме вопроса речь про нормализацию, и проверяют, умеете ли вы увидеть скрытую зависимость между атрибутами и назвать, чем она вредна. Сильный кандидат одной фразой уточняет, о каком смысле спрашивают, и отвечает по существу.
Как отвечать
Зависимость транзитивна, когда ключ определяет атрибут не напрямую, а через другой неключевой атрибут: ключ определяет B, B определяет C, значит ключ определяет C. Пример: в таблице сотрудников номер сотрудника определяет код отдела, а код отдела определяет название отдела и его адрес.
Чем это плохо:
- избыточность: название отдела повторяется в каждой строке сотрудника;
- аномалия обновления: отдел переименовали, часть строк исправили, данные противоречат сами себе;
- аномалия вставки: новый отдел без единого сотрудника записать некуда;
- аномалия удаления: уволился последний сотрудник, и вместе с ним из базы исчез отдел.
Лечение: вынести зависимый набор атрибутов в собственную таблицу и оставить ссылку внешним ключом, то есть привести отношение к третьей нормальной форме. В коде на Java это ровно та же граница: отдельная сущность и связь @ManyToOne вместо продублированных полей.
Про второй смысл хватит фразы: транзитивная зависимость сборки это библиотека, приехавшая через другую библиотеку, и проблемы там иные: конфликт версий, вес, уязвимости в чужом коде.
Где спотыкаются
Путают транзитивную зависимость с частичной. Зависимость от части составного ключа это нарушение второй нормальной формы, а не транзитивность. Классический пример про студентов и курсы, который приводят чаще всего, как раз про частичную зависимость.
Считают, что суррогатный ключ решает проблему. Технический идентификатор строки делает ключ компактнее, но связь между названием отдела и его кодом никуда не девается, дубли и аномалии остаются на месте.
Не могут назвать цену решения. Разбиение добавляет соединения, и в отчётных сценариях осознанная денормализация допустима, но тогда за согласованность отвечает код или триггер. Ответ «нормализуем всегда до упора» так же слаб, как «денормализуем ради скорости» без единого замера.