Хранение изображения в БД vs файловой системе для загруженных пользователем изображений на веб-сайте

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

У меня на уме две идеи .

  1. для хранения изображения в NoSQL db, как mongoDB с помощью GridFS .
  2. чтобы сохранить изображение в файловой системе и иметь путь, хранящийся в БД .

Что из вышеперечисленного лучше? и почему?

1 ответов


вздох почему все прыгают в GridFS?

в зависимости от размера изображений и точного варианта использования, я бы рекомендовал хранить изображения напрямую в БД (не через GridFS). Вот почему:

Файловой Системы

  • хранение изображений в файловой системе доказано, что работает хорошо, но это не тривиально
  • вам понадобятся различные системы резервного копирования, отказоустойчивости, репликации и т. д. Это может будьте хитрыми DevOps-мудрыми
  • вам нужно будет создать интеллектуальную структуру каталогов, которая является дырявой абстракцией, потому что разные файловые системы имеют очень разные характеристики. У некоторых нет проблем с хранением файлов 16k в одной папке, другие начинают задыхаться от простых файлов 1k. Общий подход заключается в использовании конвенции как af/2c/af2c2ab3852df91.jpg, где папки af и 2c выводятся из имени файла (которое само по себе может быть хэшем содержимого для дедупликации нужда.)

GridFS

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

  • для каждого файла, вам понадобится один fs.file и fs.chunk документ. Chunking полностью требуется для больших файлов, но если ваши файлы ниже 256k в среднем, нет реального chunking происходит (по умолчанию размер куска 256k). Поэтому при хранении небольших файлов в GridFS вы получаете накладные расходы без преимущества. Мошенничество. Для этого также требуется два запроса вместо одного.
  • он накладывает определенную структуру на вашу коллекцию, например, чтобы иметь "имя файла". Это зависит от варианта использования, но я часто использую хэш в качестве идентификатора и храню хэш в пользователе, например. Это дедуплицирует, легко реализовать, красиво выравнивается с кэшированием и не требует придумывания каких-либо соглашений. Это также очень эффективно, потому что индекс является массивом байтов.

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