Расположение магазина загрузки изображений ASP.NET MVC (db vs filesystem) - PullRequest
7 голосов
/ 28 апреля 2010

Я пишу веб-приложение с использованием стека ASP.NET MVC + NHibernate + Postres. Интересно, должны ли загруженные изображения храниться в базе данных в виде двоичных объектов или в файловой системе (и ссылаться только на БД). Одно из преимуществ хранения БД, о котором я могу подумать, - это простое резервное копирование / восстановление всех данных без обращения к инструментам копирования файловой системы. С другой стороны, я подозреваю, что доступ к файловой системе может быть быстрее (но особенно ли это при работе со многими одновременными запросами?) Каковы ваши предложения?

Ответы [ 3 ]

3 голосов
/ 29 апреля 2010

Я бы сделал и то, и другое: убедитесь, что изображения хранятся в базе данных, чтобы все данные были централизованы для простого резервного копирования, но также кэшировали данные и во внешнем виде, чтобы повторные запросы больших изображений не перебивали буферный кеш база данных. Если все сделано правильно, вы можете подключить новые веб-серверы внешнего интерфейса, которые будут прозрачно заполнять их локальный кэш изображений из базы данных после запуска.

Наличие централизованного хранилища для изображений также полезно для гарантии того, что вы отправляете хорошие заголовки ответов Last-Modified и ETag для изображений в системе с несколькими веб-серверами, поскольку эти заголовки могут быть созданы из содержимого базы данных, а не взяты из объекты локального кэша.

Только примечание к реализации для PostgreSQL, а именно: вы можете установить «режим хранения» столбца, содержащего данные вашего изображения, на «внешний»: это остановит PostgreSQL, пытающийся сжать данные изображения (используя zlib, что маловероятно) для обеспечения какой-либо выгоды) и заставит его хранить данные изображения во вспомогательной таблице TOAST, обеспечивая лучшую производительность, если вы просто запрашиваете метаданные изображения. См. Предложение «SET STORAGE» команды ALTER TABLE , например ::

ALTER TABLE media.image ALTER COLUMN content SET STORAGE EXTERNAL
3 голосов
/ 29 апреля 2010

Мы используем хранилище оригиналов в базе данных для резервного копирования, но генерируем уменьшенные изображения, которые кэшируются в файловой системе на веб-серверах.

Тем не менее, мы стараемся избегать любых обращений к базе данных, если это возможно, потому что это создает огромную нагрузку, поскольку одна страница обычно вызывает несколько запросов изображения для просмотра одной страницы.

В одной заметке о хранении больших двоичных объектов в базе данных я предлагаю сохранить фактические столбцы больших двоичных объектов в выделенной таблице с сопоставлением «один к одному» с вашей сущностью / сущностями. Это облегчит резервное копирование, а также внесение изменений в ваши таблицы. Когда таблица становится большой, любые изменения потребуются «навсегда» для завершения, и блокировка является большой проблемой даже во время резервного копирования.

Если у вас есть вся информация об изображениях (кроме двоичных данных), выбор этих данных не повлияет, если вам не нужны двоичные данные (которые вам нужны редко, поскольку они будут кэшироваться в файловой системе).

Только мои два цента.

1 голос
/ 28 апреля 2010

Это зависит. Вы цените возможность прямой ссылки на изображение или хотите всегда использовать ресурсы на стороне сервера для вызова БД, а затем записывать двоичные данные для изображения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...