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