Где хранить справочник
Что проверяют
Понимаете ли вы, что справочник это не одна задача, а несколько: насколько он большой, кто и как часто его меняет, завязана ли на его значения логика кода. Следом спрашивают, как обновить справочник без перезапуска и как не получить разные данные на разных экземплярах сервиса.
Как отвечать
Отвечайте через критерии, а не перечислением хранилищ:
- enum в коде: значения меняются только вместе с кодом, и логика на них завязана (статусы заказа, типы операций). Компилятор поможет со
switch, но новое значение означает релиз. В базе такой enum храните строкой,@Enumerated(EnumType.STRING); - таблица в основной базе: справочник правит бизнес (валюты, регионы, категории), и на него ссылаются другие таблицы. Внешние ключи дают целостность, начальные данные катятся миграциями Flyway или Liquibase;
- отдельный сервис справочников: один и тот же справочник нужен десятку сервисов, и у него есть владелец. Цена: сетевой вызов и ещё одна точка отказа;
- конфигурация или файл в ресурсах: маленький статичный набор, который удобно ревьюить в Git.
Поверх таблицы почти всегда ставят кэш: справочник читают намного чаще, чем меняют. В Spring это @Cacheable с Caffeine в памяти процесса, для сущностей Hibernate можно пометить класс @Immutable и включить кэш второго уровня. Если экземпляров сервиса несколько, выберите способ обновления: короткий TTL, событие об изменении через брокер или общий Redis. Для большинства справочников TTL в несколько минут вполне достаточно.
Отдельно продумайте историю. Если на запись ссылаются старые документы, её нельзя удалить или переименовать задним числом. Помогают флаг активности и поля valid_from и valid_to.
Где спотыкаются
Оставляют маппинг enum по умолчанию. JPA тогда пишет в базу порядковый номер, и вставка нового значения в середину списка тихо меняет смысл всех старых записей.
Кэшируют справочник в памяти без плана инвалидации. После правки в админке один экземпляр отдаёт новые данные, а два других старые, до перезапуска.
Удаляют устаревшие значения физически и ломают внешние ключи или отчёты за прошлые периоды. Отключение флагом почти всегда лучше удаления.