Я создаю приложение asp.net mvc, в котором пользователи могут прикреплять изображение к своему профилю, а также в других областях системы, таких как гаджет обмена сообщениями на приборной панели, отображающий последние сообщения и т. Д.
Когда пользователь загружает их, мне интересно, будет ли лучше хранить их в базе данных или на диске.
Преимущества базы данных
Простое резервное копирование всей базы данных и сохранение содержимого профиля / изображений с соответствующим профилем / пользовательскими таблицами
когда я позже создаю веб-службы, они могут просто извлекать все связанные с профилем данные из одного места (базы данных)
Преимущества файловой системы
загрузка файлов с диска, вероятно, быстрее
есть ли другие преимущества?
Где другие сайты хранят такую информацию. Правильно ли я немного обеспокоен производительностью базы данных для чего-то подобного?
Может быть, был бы способ кэшировать изображения, извлеченные из базы данных на определенный период времени?
В качестве альтернативы, как насчет идеи сохранения этих изображений в базе данных, но теневого копирования их на диск, чтобы веб-сервер мог загрузить их оттуда? Казалось бы, это обеспечивает как резервное копирование, так и удобство работы с БД, а также дает преимущество в скорости файлов на диске.
Инфраструктура, о которой идет речь
- Веб-сайт будет развернут в IIS на Windows Server 2003 с файловой системой NTFS.
- База данных будет SQL Server 2008
Резюме
Читая о многих связанных темах здесь, в SO, многие люди сейчас склоняются к типу файлового потока SQL Server. Однако из того, что я мог бы извлечь (я могу ошибаться), нет особой пользы, когда файлы довольно маленькие. Однако потоковая передача файлов значительно повышает производительность, когда файлы имеют размер в несколько МБ или больше.
Поскольку мои изображения профиля имеют тенденцию занимать около 5 КБ, я решил оставить их в хранилище файлов в базе данных как varbinary (max).
В ASP.NET MVC я обнаружил небольшую проблему с производительностью, возвращающую FileContentResults для изображений, извлеченных из базы данных, как это. Поэтому я закончил кэшировать файл на диске, когда он читается, если местоположение этого файла не найдено в кеше моего приложения.
Так что, думаю, я пошел на гибрид;
- Хранение базы данных для упрощения обработки данных, а файлы напрямую связаны с профилями
- Теневое копирование на диск для лучшего кэширования
В любой момент я могу удалить папку кеша на диске, и при повторном запросе изображений они будут повторно скопированы при первом обращении и затем будут отправлены из кеша.