Хранение изображений: БД или файловая система - - PullRequest
15 голосов
/ 05 августа 2009

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

Мой сайт будет одновременно предоставлять контент и изображения 100-1000 пользователям .

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

Лично мне нравится идея иметь все мои изображения в БД, но любое предложение будет очень полезно :)

Как вы думаете, в моем случае правильный подход к БД?

Ответы [ 7 ]

22 голосов
/ 05 августа 2009

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

Оставьте кеширование файлов до ОС и / или вашего обратного прокси-сервера - им будет лучше.

15 голосов
/ 05 августа 2009

Некоторые другие причины для хранения изображений в файловой системе:

  • Серверы изображений могут работать, даже если база данных занята или не работает.
  • Файловые системы созданы для хранения файлов и довольно эффективны в этом.
  • Сброс данных в вашу базу данных означает более медленное резервное копирование и другие операции.
  • Для обслуживания образа не требуется кодирование на стороне сервера, просто старый IIS / Apache.
  • Вы можете быстрее масштабироваться с помощью недорогих веб-серверов или, возможно, CDN.
  • Вы можете выполнять связанную работу (генерирование миниатюр и т. Д.) Без использования базы данных.
  • Ваш сервер базы данных может хранить больше «реальных» данных таблицы в памяти, где вы получаете скорость базы данных для запросов. Если он использует свою драгоценную память для хранения файлов изображений в кэше, это вряд ли принесет вам пользу в скорости по сравнению с большим количеством индексной фотографии в памяти.
11 голосов
/ 05 августа 2009

Большинство крупных сайтов используют файловую систему.

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

5 голосов
/ 05 августа 2009

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

4 голосов
/ 05 августа 2009

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

3 голосов
/ 05 августа 2009

Какую базу данных вы используете? MS SQL Server 2008 предоставляет хранилище FILESTREAM

обеспечивает хранение и эффективный доступ к данным BLOB с использованием комбинации SQL Server 2008 и файловой системы NTFS. В нем рассматриваются варианты хранения больших двоичных объектов, настройки Windows и SQL Server для использования данных FILESTREAM, рекомендации по объединению FILESTREAM с другими функциями, а также подробности реализации, такие как разбиение и производительность.

подробности

0 голосов
/ 05 августа 2009

Мы используем FileNet, сервер, оптимизированный для работы с изображениями. Это очень дорого. Более дешевое решение - использовать файловый сервер.

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

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

...