Хранение файлов изображений в базе данных Mongo, это хорошая идея? - PullRequest
11 голосов
/ 09 октября 2011

При работе с mysql плохая идея хранить изображения как BLOB в базе данных, так как это делает базу данных достаточно большой, что вредно для обычного использования базы данных.Затем лучше сохранить файлы изображений на диске и сохранить ссылку на них в базе данных.

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

Считаете ли вы, что лучше сохранять файлы изображений на MongoDB (как GridFS), чтобы уменьшить количество файлов, хранящихся на сервере;или все же лучше держать базу данных как можно меньше?

Ответы [ 4 ]

13 голосов
/ 09 октября 2011

Проблема не столько в том, что база данных становится большой, базы данных могут справиться с этим (хотя MongoDB не так хорош, как многие другие в этом отношении). Проблема заключается в том, что для отправки данных клиенту их сначала необходимо перенести в ОЗУ с помощью базы данных, затем скопировать в память приложения, а затем передать ядру для отправки через сокет. Это тратит много памяти и циклов процессора. Причина, по которой лучше иметь большие файлы в файловой системе, заключается в том, что их легче обойти, вы можете попросить ядро ​​потоковую передачу файла с диска в сокет напрямую.

Недостатком хранения больших файлов в файловой системе является то, что их намного сложнее распространять. Использование базы данных и что-то вроде GridFS от Mongo делает возможным масштабирование. Вам просто нужно убедиться, что вы копируете не весь файл в память приложения сразу, а порцию за раз. Большинство каркасов веб-приложений в настоящее время имеют некоторую поддержку для отправки фрагментированных HTTP-ответов.

7 голосов
/ 11 августа 2015

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

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

Поскольку у нас все еще есть файлы, нам нужно их где-то поместить. Есть несколько решений: nfs, наша база данных, кто-то еще использует базу данных.

  • nfs - это «сетевая файловая система», которая позволяет вам выполнять файловый ввод / вывод на сетевых ресурсах. Если вы в любом случае имеете дело с сетью, ИМХО, это не принесет особой пользы, если только это не то, что вы уже знаете.

  • Наша база данных - Для MongoDB есть два варианта : (файл> 16 МБ)? GridFS: BinData

  • Кто-то использует базу данных - Некоторые являются базовыми, например Amazon S3 , а некоторые предлагают дополнительные услуги, такие как Cloudinary или Dropbox.

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

Если вы беспокоитесь о производительности:

1) Использование прокси (например, nginx) или CDN для размещения вашего контента для клиентов. Ваш сервер должен просто обслуживать ошибки кэша.

2) Использование потокового ввода-вывода В Nodeschool есть классное руководство для Node.js .

2 голосов
/ 09 октября 2011

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

0 голосов
/ 06 октября 2017

Хранение изображений не является хорошей идеей в любой БД, потому что:

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

Последние два настоящие убийцы.

Источник: Три вещи, которые вы никогда не должны помещать в свою базу данных .

Так что, если вы можете сделать свое приложение хитрым, то лучше не загружать свои фотографии в MongoDB .

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

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