Я бы сделал и то, и другое: убедитесь, что изображения хранятся в базе данных, чтобы все данные были централизованы для простого резервного копирования, но также кэшировали данные и во внешнем виде, чтобы повторные запросы больших изображений не перебивали буферный кеш база данных. Если все сделано правильно, вы можете подключить новые веб-серверы внешнего интерфейса, которые будут прозрачно заполнять их локальный кэш изображений из базы данных после запуска.
Наличие централизованного хранилища для изображений также полезно для гарантии того, что вы отправляете хорошие заголовки ответов Last-Modified и ETag для изображений в системе с несколькими веб-серверами, поскольку эти заголовки могут быть созданы из содержимого базы данных, а не взяты из объекты локального кэша.
Только примечание к реализации для PostgreSQL, а именно: вы можете установить «режим хранения» столбца, содержащего данные вашего изображения, на «внешний»: это остановит PostgreSQL, пытающийся сжать данные изображения (используя zlib, что маловероятно) для обеспечения какой-либо выгоды) и заставит его хранить данные изображения во вспомогательной таблице TOAST, обеспечивая лучшую производительность, если вы просто запрашиваете метаданные изображения. См. Предложение «SET STORAGE» команды ALTER TABLE , например ::
ALTER TABLE media.image ALTER COLUMN content SET STORAGE EXTERNAL