Здесь нет серебряной пули.
Но я, вероятно, получу следующий дизайн:
IBinaryDataService:
Для общего сохранения данных в двоичном формате. Сохраняемые объекты должны иметь метод, помогающий записать его в OutputStream. Должен быть удобный метод для загрузки его в исходный объект.
IDataIndexService:
Для индекса атрибутов данных / тегов, чтобы помочь в поиске, а также. Точно соответствуют данным рис., Который вы описали.
IPicRepo:
Только интерфейс, выставленный клиенту. Клиенты должны использовать это, и никогда не знать о вышеупомянутых двух услугах.
FileSystemBinaryDataServiceImpl:
Реализация службы IBinaryDataService выше.
DbDataIndexServiceImpl:
Реализация службы IDataIndexService выше.
PicRepoImpl:
Реализация IPicRepo выше. Используйте Spring для внедрения FileSystemBinaryDataServiceImpl и DbDataIndexServiceImpl в качестве зависимостей.
Дополнительные расширения, если вы хотите:
IPersistentModel:
Представление объекта, который может быть сохранен. Имеет методы write (OutputStream), read (inputStream) и getAttributes (): Map
PicModel:
Реализация IPersistentModel выше.
PS. Это просто общий обзор высокого уровня.