Подтвердить что ты не робот

Сохранять изображения профиля пользователя на диске или в базе данных?

Я создаю приложение 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 для изображений, выведенных из базы данных, как это. Поэтому я закончил кэширование файла на диске, когда он читается, если местоположение этого файла не найдено в кеше приложения.

Итак, я думаю, я пошел на гибрид,

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

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

4b9b3361

Ответ 1

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

reiserfs (устаревший) действительно потрясающий для поиска, zfs, xfs и NTFS имеют фантастические алгоритмы хеширования, linux ext4 также выглядит многообещающим.

Поклонник в системе не будет отличаться от чтения блоков. Вопрос в том, что быстрее поиск запросов, который возвращает имя файла (может быть хеш?), Который, в свою очередь, осуществляется с помощью отдельного открытого, закрытия файла? или просто выкидывать каплю?

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

Подумайте об этом, и помните, что бит-бенчмаркинг никого не повредил:-), так что проверьте его с типичным размером набора данных и учтите такие вещи, как одновременные запросы и т.д.

Ответ 2

Хранить ссылки на файлы в базе данных и хранить файлы на диске.

Этот подход является более гибким и более простым в масштабировании.

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

Flickr работает таким образом.

Надеюсь, что это поможет.