Я не знаю, можно ли сделать общие замечания по поводу такого рода решений, поскольку все зависит от того, что вы пытаетесь сделать, и от того, насколько высоки NFR списка приоритетов, такие как производительность и время отклика, для вашего приложения.
Если у вас много пользователей, загружающих много двоичных файлов, с системой, обслуживающей большое количество этих загруженных двоичных файлов, то возникает ситуация, когда затраты на хранение файлов в базе данных включают:
- Бинарные файлы большого размера
- Дорогие запросы
Преимущества
- Атомные коммиты
- Масштабирование идет с базой данных (хотя у MySQL есть некоторые проблемы с мультиузлом и т. Д.)
- Менее сложный и сложный код для управления файловыми системами и т. Д.
Учитывая ту же пользовательскую ситуацию, когда вы сохраняете данные в файловой системе, вам нужно будет обратиться к
- Масштабирование
- Управление именем файла (пользователь загружает один и тот же файл имени дважды и т. Д.)
- Создание соответствующих записей в БД для сопоставления с файлами на диске (и кодом, окружающим все это)
- Забота о ваших конфигах apache, чтобы они работали с файловой системы
Нам пришлось решить аналогичную проблему для нашего сайта Grails, где редакторы контента загружают сотни изображений в день. Мы знали, что направлять весь этот спрос через приложение, когда его можно было бы лучше использовать, занимаясь другой обработкой, было расточительно (учитывая, что ожидаемый спрос на страницы будет в миллионах в неделю, мы определенно не хотели, чтобы изображения наносили нам вред).
В итоге мы создали решение для загрузки -> файловой системы. Для каждого загруженного файла была создана запись метаданных БД, которая управлялась в тандеме с процессом загрузки (и, наоборот, считывала эту запись при создании ссылки на контент GSP на изображение). Мы обслуживали запросы с диска через Apache напрямую на основании ссылки, запрашиваемой браузером. Но, и всегда есть, но помните, что с такими вещами, как файловые системы, у вас есть контент только на одну машину.
У нас была головная боль, связанная с повторной синхронизацией изображений на каждом сервере, поскольку в отличие от БД, которая находится за кластером и позволяет кластеру вести себя одинаково, файлы привязаны к физическим расположениям на сервере.
Другая проблема, с которой вы можете столкнуться при работе с файловыми системами, - это размер содержимого папки. Когда вы начинаете иметь папки, в которых буквально десятки тысяч файлов, сканирование папок на уровне операционной системы начинает по-настоящему тянуться. Чтобы избежать этой проблемы, нам пришлось написать код, который управлял загрузкой изображений в структуры папок yyyy / MM / dd / image.name.jpg, чтобы ни одна папка не накапливала сотни тысяч изображений.
Я имею в виду, что, хотя мы получили желаемую производительность, не используя БД для хранения больших двоичных объектов, это связано с затратами на разработку и управление системами.