Работя върху голяма софтуерна система, която е направила и двата механизма за съхранение на прикачени файлове и друго съдържание. Първата итерация на системата съхранява всички данни в BLOB в DB. Проклинах го навремето. Като програмист можех да пиша странични скриптове, за да оперирам незабавно с данните и да ги променям, когато пожелая.
Напред около 10 години и все още управлявам същия софтуер, но архитектурата се промени и беше написана с указатели на файловата система. Проклинам го сега и ми се иска да се върне в БД. Имам допълнителна полза от няколко години и след като работих с това приложение с много по-голям капацитет в много повече и много по-големи ситуации, смятам, че сега мнението ми е по-добре образовано. Промоцията или системната миграция на приложението изисква обширни скриптове и копиране на милиони файлове. Веднъж сменихме операционната система и всички указатели на файлове имаха грешен разделител на директория или името на сървъра се променя къде се намира файлът и трябваше да напишем и планираме прости инструкции за актуализиране на SQL с DBA през уикенда, за да го коригираме. Друго е, че файловата система и DB записите излизат от синхрон, защо е несигурно, но след хиляди дни работа, понякога не-транзакционните системи (файловата система и DB не споделят транзакционен контекст) просто стават несинхронизирани. Понякога файлове мистериозно изчезват.
Когато всичко това беше в БД, миграцията или насърчаването на средата беше въпрос на изхвърляне и импортиране на БД. Промените в редовете могат да бъдат правилно одитирани, всичко в синхрон и регистрационните файлове могат да бъдат възпроизведени до момента, ако е необходимо. Разбира се, DB става голяма, но това е 2011 г. и тези неща просто не са предизвикателство за базите данни.
За какво си струва, имахме някои подобни проблеми с големи буфери за данни при поточно предаване на някои данни, но A) можехме да изпомпваме данните в байтови буфери с Input|OutputStream в JDBC и B) когато използвахме други инструменти, написахме съхранена процедура което ще раздели BLOB във временна таблица и итеративно ще обслужва парчетата от временната таблица. Работи чудесно.
Не ме интересува каква е техническата причина за не поставям тези неща в DB, но е много по-лесно за да управлявам на консолидирано място, бих могъл да удвоя и утроя хардуера или да разпределя базата данни за времето, загубено от консултанти и клиенти само за кратък период от време, управлявайки различни файлове.
Актуализация:по-спокойно с коментиращите, те просто дават мнението си по въпроса.