Хранение файлов в MySQL и их быстрая раздача
3 мин
Думаю у многих возникала необходимость хранить файлы, связанные с записью в таблице. Это может быть картинка к новости, аватар, загруженный пользователем файл — да все, что угодно. Обычно в этому случае поступают просто — файл ложится в файловую систему, а ссылка на него — в запись БД.
Но у такого классического похода множество недостатков:
Больше о проблемах, возникающих при хранении файлов отдельно от БД можно почитать в презентации SQL Antipatterns, раздел Phantom Files, страница 60. Кстати, автор презентации предлагает решение — хранить файлы прямо в БД, в поле типа BLOB. Правда следует замечание, что это должно быть взвешенное решение в каждом конкретном случае. Ведь при таком способе хранения файлов вебсервер должен при каждом запросе вызывать некий скрипт, который будет извлекать файл из БД и отдавать пользователю, что неминуемо отрицательно скажется на производительности.
Для поиска решения данной проблемы был проведен мозговой штурм и придумано несколько вариантов решения проблемы:
Но у такого классического похода множество недостатков:
- файлы не удаляются при удалении соответствующей записи БД
- проблемы при одновременной попытке обновления файла
- нарушение синхронизации между БД и файловой системой при откате транзакции
- при резервном копировании и восстановлении информации в БД может возникнуть рассинхронизация с файловой системой
- файлы не подчиняются ограничениям доступа, наложенным с помощью БД
Больше о проблемах, возникающих при хранении файлов отдельно от БД можно почитать в презентации SQL Antipatterns, раздел Phantom Files, страница 60. Кстати, автор презентации предлагает решение — хранить файлы прямо в БД, в поле типа BLOB. Правда следует замечание, что это должно быть взвешенное решение в каждом конкретном случае. Ведь при таком способе хранения файлов вебсервер должен при каждом запросе вызывать некий скрипт, который будет извлекать файл из БД и отдавать пользователю, что неминуемо отрицательно скажется на производительности.
Для поиска решения данной проблемы был проведен мозговой штурм и придумано несколько вариантов решения проблемы:
Речь в статье пойдет о такой, казалось бы изжеваной и изъезженой теме, как валидация веб-документа по одной из DTD-схем, которые в свою очередь определяются с помощью 

Если вы разрабатываете проекты на ExtJS, то наверняка в вашем дереве исходных кодов есть сам дистрибутив библиотеки и вы его подключаете на всех страницах, где используются ее возможности. И храните саму библиотеку также у себя на хостинге. Это, конечно, правильный и простой подход, но имеет свои ограничения. Во-первых, в большинстве случаев именно ExtJS будет самым большим компонентом страницы, ведь его общий объем около 1 Мб, а значит и будет тормозить страницу, пока браузер не загрузит всю библиотеку. Как выход, все рекомендуют настраивать сжатие (например, mod_deflate, хорошо, что браузеров, которые не понимают сжатый контент, теперь почти нет, а у кого есть, тот, как говорится, сам себе злобный буратино), теги кеширования и т.п. Ну и на крайний случай — собирать под свой проект, или даже под каждую страницу, свою версию библиотеки, включая туда необходимые компоненты. 