Хранить изображения в виде файлов или в базе данных для веб-приложения?

мой вопрос довольно общий, и я знаю, что на него не может быть 100% ответа. Я создаю веб-решение ASP .NET, которое будет включать в себя много фотографий и, надеюсь, достаточное количество трафика. Я действительно хочу добиться успеха.

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

большое спасибо, Стефан!--1-->

дублировать: хранение изображений в БД - да или нет?, как хранить изображения в файловой системе, хранение небольшого количества изображений: blob или fs? и, возможно, некоторые другие.


комментарий: Спасибо за много хороших ответов. Я пойду на решение на основе файлов, даже если мне нравится идея иметь 100% - ное решение, управляемое базой данных. Кажется, что сегодня есть хорошие решения, чтобы делать то, что я хочу с базами данных и т. д., Но у меня есть несколько причин не делать он.

  • Я буду на размещенном решении, у меня есть огромный объем памяти(10gb), но только 300mb для базы данных. Это будет стоить много для дополнительного хранения в БД.

  • Я не эксперт по БД и также не контролирую настройки БД. Решение на основе БД может нуждаться в пользовательской конфигурации, как это выглядит.

Если мы перейдем к запуску сайта на нашем собственном сервере, я мог бы рассмотреть базу данных решение. спасибо, Стефан!--1-->

10 ответов


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

Почему? Потому что...

  1. вы сможете обслуживать изображения в качестве статических файлов.
  2. для получения изображений не требуется доступ к базе данных или код приложения.
  3. изображения могут быть поданы с другого сервера для повышения производительности.
  4. это уменьшит узкое место базы данных.
  5. база данных в конечном счете хранит свои данные в файловой системе.
  6. изображения можно легко кэшировать при хранении в файловой системе.

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

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

используя сегодняшнюю технологию, я предлагаю вам храните изображения в Столбцах FILESTREAM SQL Server 2008 (по крайней мере, это то, что я собираюсь сделать с моим следующим проектом), поскольку они объединяют преимущество хранения данных в базе данных и наличия больших двоичных файлов в отдельных файлах (по крайней мере, в соответствии с рекламой ;) )


пословица Всегда была "файлы в файловой системе, метаданные файлов в базе данных"


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

при обслуживании impages

Я нашел этот ответ в гугле вашего вопроса и прочитал комментарии на http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html


Мне обычно нравится иметь двоичные файлы в базе данных, потому что:

  • целостность данных: нет unreferenced файла, нет пути в БД без какого-либо файла, связанного
  • согласованность данных: возьмите дамп базы данных и все. нет " O я забыл targz этот каталог данных."

хранение изображений в базе данных добавляет накладные расходы БД для обслуживания отдельных изображений и затрудняет загрузку в альтернативное хранилище (S3, Akami), если вы достигнете этого уровня. Хранение их в базе данных значительно упрощает перемещение приложения на другой сервер, так как теперь нужно переместить только БД.

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


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


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

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

с веб-стороны, я бы предположил, так как вы вопрос помечен asp.net что вы пойдете по маршруту использования обработчика http для обслуживания изображений. Тогда у вас есть все преимущества фреймворка в вашем распоряжении, и вы можете держать вас домен logic cleaner только с тем, чтобы передать ключ к вашему образу в обработчик http.


Почему бы не выбрать отдельную базу данных NoSql для хранения файлов.

это приносит вам целостность данных, согласованность данных, как упоминалось @chburd.

пока вы РСУБД все еще держите небольшой.


  1. вот пошаговый пример (общий подход, реализация Spring,Eclipse) хранения изображений в файловой системе и хранения их метаданных в БД -- http://www.devmanuals.com/tutorials/java/spring/spring3/mvc/Spring3MVCImageUpload.html
  2. вот пример тоже -- http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. Также вы можете изучить тексты этой проект -- https://github.com/jdmr/fileUpload . Обратите внимание на этой контроллер.