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

125

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

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

Большое спасибо, Стефан

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


КОММЕНТАРИЙ: Спасибо за много хороших ответов. Я выберу файловое решение, даже если мне нравится идея решения, основанного на базе данных. Кажется, что сегодня есть хорошие решения, чтобы делать то, что я хочу с базами данных и т. Д., Но у меня есть несколько причин не делать этого.

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

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

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

Стефана
источник
1
Пожалуйста, укажите базу данных, которую вы используете.
Джерри Шенк,
1
Я намерен использовать MSSQL более поздней версии.
StefanE
1
@StefanE, Файловая система - это, по сути, специализированная база данных, оптимизированная для хранения файлов.
LukeH

Ответы:

175

Сохраняйте изображения в файловой системе, а места расположения изображений в базе данных.

Зачем? Так как...

  1. Вы сможете использовать изображения как статические файлы.
  2. Для получения изображений не потребуется доступа к базе данных или кода приложения.
  3. Изображения могут обслуживаться с другого сервера для повышения производительности.
  4. Это уменьшит узкое место в базе данных.
  5. В конечном итоге база данных хранит свои данные в файловой системе.
  6. Изображения можно легко кэшировать при хранении в файловой системе.
Акбар ибрахим
источник
1
Кроме того, в SQL Server, когда вы сохраняете изображение как поле «Изображение», это фактически то, что делает SQL - где-то на диске сохраняется указатель на файл. Вот как можно обойти ограничение страницы в 8 КБ.
Zhaph - Бен Дугид
9
На самом деле это было решено в SQL Server 2008. Был введен новый тип FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx, который позволяет использовать преимущества "производительности файловой системы и в то же время поддерживать согласованность транзакций между неструктурированными данными и соответствующими структурированными данными »
Кристоф
Да, ты прав. у меня вопрос, каков размер капли? или сколько памяти он может хранить?
Ameer
11

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

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

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

devio
источник
Вы уже тестировали функциональность Filestream?
StefanE
1
На самом деле, при удалении записи БД, также можно закодировать удаление из файловой системы. Так что лучше хранить в ФС, а не в БД
kailash19
9

Пословица всегда была «Файлы в файловой системе, метаданные файлов в базе данных».

Мэтт Дарби
источник
6

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

При обслуживании изображений <img src = файл, который уже существует на сервере, вероятно, будет быстрее, чем создание временного файла из поля базы данных и указание на него тега <img.

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

sparklewhiskers
источник
1
указанный пост кажется немного устаревшим.
devio
6

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

  • целостность данных: нет файла, на который нет ссылок, нет пути в базе данных без связанного файла
  • согласованность данных: сделайте дамп базы данных и все. no "О, я забыл настроить таргетинг на этот каталог данных."
chburd
источник
4

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

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

Адам Хоуз
источник
3

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

Dillie-О
источник
0

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

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

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

MotoWilliams
источник
-1

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

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

В то время как rdbms еще оставайтесь маленькими.

Уилл Ву
источник
-1
  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 . Обратите внимание на этот контроллер.
Лорд Найтон
источник