Как добавлять записи в справочник
Что проверяют
Вопрос намеренно размытый: интервьюер смотрит, начнёте ли вы с уточнений или сразу напишете ArrayList. Под справочником почти всегда понимают таблицу редко меняющихся данных вроде валют, стран или статусов заказа. Следом спрашивают, кто добавляет записи, как их кешировать и что будет, если запись удалить.
Как отвечать
Уточните, кто и как часто добавляет значения, и от этого выберите способ:
enumв коде: если на значение завязана логика вродеswitchпо статусу, новое значение всё равно требует релиза;- миграция Flyway или Liquibase: значения, без которых приложение не работает, добавляются файлом вроде
V42__add_currency_kzt.sql, тогда все окружения совпадают; - админский API или интерфейс: если значения ведёт бизнес без участия разработчиков. Сервис на Spring с
@Transactional, валидацией через Bean Validation и сущностью JPA.
Дальше детали, которые показывают опыт:
- естественный ключ: у записи есть уникальный
codeс ограничениемUNIQUEв базе, а не только суррогатныйid. Повторная вставка ловится какDataIntegrityViolationExceptionи превращается в понятный ответ 409; - идемпотентность: в миграциях удобно
INSERT ... ON CONFLICT (code) DO NOTHINGв PostgreSQL илиMERGE, чтобы повторный прогон не падал; - кеш: справочники читают постоянно, поэтому их кешируют через
@Cacheableи Caffeine или Redis, а при добавлении сбрасывают через@CacheEvict; - отключение вместо удаления: флаг
is_activeили период действияvalid_from/valid_to, потому что на запись ссылаются старые документы; - аудит: кто и когда добавил значение.
Где спотыкаются
Сразу пишут класс с List в памяти и не спрашивают, где живут данные. Для справочника, который должен пережить перезапуск, это не ответ.
Забывают про кеш на нескольких экземплярах сервиса: @CacheEvict чистит локальный Caffeine только на том поде, где прошёл запрос, остальные ещё долго отдают старый список. Нужен TTL, общий Redis или рассылка события.
Удаляют записи физически. Внешние ключи либо не дадут это сделать, либо при каскаде вместе со значением уйдут исторические данные.