> Скорость. Пожалуй, одно из самых важных преимуществ. Дело в том, что при хранении в БД нам надо произвести следующие действия для вывода изображения: считать стрим из базы, создать временный файл, записать в него стрим. Из файловой же системы его достаточно только считать.
Зачем нам записывать данные в файл, если их надо отдать клиенту (речь ведь про веб-сервер)? Надо их считать и выдать в поток (сокет), через которых их получит клиент.
> Универсальность. Обычные изображения можно использовать для множества приложений: переслать через фтп, добавить в письмо, показать в браузере. Бинарные данные из базы необходимо сначала конвертировать.
Мы все еще говорим про веб-сервер? Он всем этим не занимается. Он только может отдавать изображения клиентам, в исходном виде или после какой-либо обработки «на лету»
> Простота реализации. Закачать файл на сервер и сохранить ссылку на него в таблицу легче, чем реализовывать логику сохранения бинарных данных в ту же таблицу. А простота — это скорость разработки и внесения изменений. Время — деньги.
В случае с файлом нужно совершить два действия (записать файл и поместить ссылку на него в таблицу), в случае с хранением в БД — только одно.
> И если база вдруг накроется (представим, что бэкапов не было), то хотя бы изображения не потеряются.
Вы совершенно верно заметили, что и то и другое бэкапить нужно, от этого никуда не деться.
Реально у хранения изображений в файловой системе (т.е. статически!) есть одно важное преимущество — web-сервер (программа, например nginx или apache) хорошо (быстро и эффективно) умеют работать со статическими ресурсами, выдавать их клиентам, указывать, необходимо ли обновить этот ресурс или достаточно прочитать из кэша клиента и т.п. В случае с БД этот функционал придется писать самому (или пользоваться готовыми решениями), если он нужен.
Поэтому:
— если Вы однажды помещаете изображение на сервер и дальше будете его только выдавать клиентам в неизменном виде, то лучше хранить его в файле.
— если же изображение будет обрабатываться перед выдачей, меняться в зависимости от запросов клиента и вообще вести бурную жизнь, то лучше его хранить в БД.
Я примерно то же самое и хотел сказать, что у вас в последнем параграфе.
Только насчет «бурной жизни» не совсем понятно. Вы хотите операции напрямую над бинарными данными проводить? Если нет, то разницы где хранить изображение нет.
а что это минус?
возрастает скорость работы с данными особенно когда их много
разбивать на каталоги это хорошо, но когда кол-во файлов, как я написал исчисляется тысячами лучше хранить в базе
Что-то ни_о_чем статья у Вас получилась. Вывод какой-то странный…
Например, что мешает шифровать файлы, и выдавать через скрипт дешифрованный стрим?
Основные проблемы хранения изображений в файлах это:
— при большом кол-ве файлов, файловая система начинает тормозить (СУБД, как правило хранят все с физически одном файле);
— целостность базы при удалении (надо заботиться об удалении файла, а не только записи в БД).
Но первое решается созданим структуры каталогов, и раскидыванием в них файлов,
и второе, не такой уж «гемморой», для большинства задач лечится периодической «сборкой мусора» из крона.
Как вариант хранение база + кеш в файловую систему
Для маленького проекта — плохое решение
Зато для большого — когда куча серверов и нужно масштабирование — очень даже ничего )
Этот документ совершенно не учитывает нюансы веб-разработки. СУБД не понимают (и не должны) протокола HTTP — а значит программисту приходится учитывать их в коде.
Где хранить изображения