>

Хранение изображений в БД

31 октября 2008 // Хельги

Пять лет прошло, и, однако, ничего не изменилось.

Люди делятся на две категории: нормальные и Верующие в Чудесную Мощь Баз Данных. Первые используют базы данных, когда это удобно, вторые — всегда.

Для того, чтобы написать движок блога, можно воспользоваться БД, а можно обойтись без неё. Кто-то считает, что с базой удобнее работать, кому-то требование иметь БД для работы движка кажется завышенным. Это всё вопросы вкуса.

«Тёплый край» не использует баз данных в первую очередь потому, что когда я начинал его писать, он жил у меня на ноутбуке. Я рассудил, что поднимать тяжеловесные сервисы мне совершенно не надо, и поставил не «Денвер» и не IIS, а маленький лёгкий сервер под названием xitami. И отладочная версия «Индианы», между прочим, до сих пор у меня на ноутбуке именно под xitami и работает.

Между прочим, по этой же причине у меня в «Индиане» нет поддержки mod_rewrite. Зато и требований никаких нет: IIS, xitami, «Апач» — всё сгодится, была бы поддержка CGI.

Так вот, когда Рус говорит: «Когда я начинал писать этот движок, один хороший человек [то есть я — Х.] советовал мне вообще отказаться от MySQL в пользу самописного интерфейса к текстовым файлам», — он, конечно, лукавит. База так база, тем более что вопрос совместимости его мало когда волновал. Но хранить изображения в базе — это уже даже не благородное безумство, а некий способ-делать-всё-через-выхлопную-трубу.

…[Я] недолго заморачивался на способе хранения изображений на сервере, а просто сделал то, что хотел сделать давно: изображения хранятся в базе, а не на ФС.

Весёлые картинки

Если вы поленились сходить по самой первой ссылке, прочитайте прямо так:

When using a normal web server setup, images should be stored as files. That is, store only a file reference in the database. The main reason for this is that a normal web server is much better at caching files than database contents. So it it's much easier to get a fast system if you are using files.

Официальная документация MySQL, «5.2.12 Other Optimisation Tips»

Или, если угодно, из другого источника, по-русски:

Не старайтесь поместить в базы данных всю информацию, которая у вас есть. Например, не нужно хранить там картинки, хоть MySQL это и позволяет. Помещая в базу данных двоичные образы графических файлов, Вы только замедлите работу своего сервера. Прочитать файл с картинкой с диска гораздо проще и, с точки зрения потребляемых ресурсов, экономичнее, нежели соединиться из скрипта к SQL, сделать запрос, получить образ, обработать его и, выдав нужные http-заголовки, показать посетителю веб-сервера. Во втором случае операция выдачи картинки потребует в несколько раз больше ресурсов процессора, памяти и диска. Также стоит помнить о том, что существуют механизмы кэширования веб-документов, которые позволяют пользователю экономить на трафике, а при динамической генерации контента вы фактически лишаете своих посетителей этой удобной возможности.

Оптимальное использование MySQL

Дело не в том, что хранить изображения в базе маменька не велит, нет — дело в том, что организовать хранение не перректально, а обычным способом проще.

И первые грабли, на которые наступил Рус, это подтверждают. Если хранить изображения на диске, last-modified сервер отдаст сам.

Кстати, в проекте, над которым я работаю, есть необходимость хранения больших объёмов двоичных данных. И они — невероятно! — хранятся не в базе, а на диске. В виде файлов.

Тэги: indiana, webdev, мета
Комментарии (2)

Хэппи-энд в фильме «Тринадцатый этаж»Никогда не разговаривай с незнакомыми планетами

Обсуждение

1. nebula

Дело в том, что я не пишу промышленный движок, который будет использовать кто-то кроме меня. Явных неудобств этот способ на этом уровне не доставляет. Ещё раз: "просто сделал то, что хотел сделать давно". Когда меня это перестанет по каким-либо причинам удовлетворять -- я перепишу. Не раньше.

82.200.130.61   оставлено 5 ноября 2008 в 14:47  

 

2. Хельги (администратор)

Рус, никто не отнимает у тебя права собрать все грабли самому.

85.119.76.76   оставлено 6 ноября 2008 в 12:57  

 

Написать комментарий

На этот адрес будут приходить только уведомления о новых комментариях к этой записи.
Чтобы отправить комментарий, введите сюда слово «человек».
« »  
Высота поля:
Разрывы строк (Enter) будут сохранены. HTML не работает. Гиперссылки: вставьте URL.

Ваш комментарий появится после одобрения модератором.