Хранить картинки в виде файлов или в базе данных для веб-приложения? - PullRequest
119 голосов
/ 18 февраля 2009

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

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

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

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


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

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

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

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

Ответы [ 10 ]

169 голосов
/ 18 февраля 2009

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

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

  1. Вы сможете подавать изображения в виде статических файлов.
  2. Для извлечения фотографий не требуется доступ к базе данных или коду приложения.
  3. Для повышения производительности изображения могут подаваться с другого сервера.
  4. Это уменьшит узкое место в базе данных.
  5. База данных в конечном итоге хранит свои данные в файловой системе.
  6. Изображения могут быть легко кэшированы при сохранении в файловой системе.
11 голосов
/ 18 февраля 2009

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

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

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

7 голосов
/ 18 февраля 2009

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

6 голосов
/ 18 февраля 2009

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

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

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

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

4 голосов
/ 23 февраля 2009

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

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

3 голосов
/ 18 февраля 2009

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

0 голосов
/ 27 сентября 2015
  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. Обратите внимание на этот контроллер.
0 голосов
/ 09 ноября 2011

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

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

Пока ваши rdbms все еще остаются маленькими.

0 голосов
/ 18 февраля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...