Хранение изображения в БД vs файловой системе для загруженных пользователем изображений на веб-сайте
Я создаю веб-сайт, где пользователям будет разрешено загружать изображения . Существует также ограничение на максимальный объем пространства, который может использовать каждый пользователь .
У меня на уме две идеи .
- для хранения изображения в NoSQL db, как mongoDB с помощью GridFS .
- чтобы сохранить изображение в файловой системе и иметь путь, хранящийся в БД .
Что из вышеперечисленного лучше? и почему?
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, вероятно, хороший выбор. Для хранения изображений, миниатюр и т. д., Я бы просто бросил изображение в свой собственный документ.