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