Upload файлов на сервер - DB vs HDD

  • Автор темы webdeveloper
  • Дата начала
Статус
В этой теме нельзя размещать новые ответы.

webdeveloper

Guest
Upload файлов на сервер - DB vs HDD

Уважаемые коллеги, сижу и мучаюсь - не могу решить как именно организовать загрузку графических файлов на сервер для своей CMS. Не то что бы я не знал как это сделать. Я не знаю что именно лучше. Вот решил посоветоватся.

Итак есть два пути: писать в базу данных или писать на диск. Оба способа имеют свои недостатки и свои достоинства.

Начнем с базы данных. Недостаток, на мой взгляд, тут один - размер базы данных. С другой стороны, на хостинге все равно место отводится под базу и скрипты совместно а не раздельно. Так что какая разница гда хранить это все.

Зато достоинств множество.

Во-первых нам абсолютно безразлично какое расширение имет данный файл - GIF, JPG или PNG. Мы к нему обращаемся не по его имени а через php-скрипт. Типа так:

<img src=http://someserver.com/getImage.php?id=1213 border=0 alt="Image">

Если мы в какой то момент рашим заменить картинку и поменять GIF на JPG (или наоборот) то нам не придется отыскивать все ссылки на эту картинку и править их.

Мы можем сделать одну базу данных и использовать ее для нескольких проектов лежащих на разных серверах. Все картинки будут всегда совпадать. Например сайт с несколькими языковыми версиями.

Нам не нужны permissions на запись в каталог сервера.

В случае хранеия файлов на диске мы не имеем большой базы данных. Но при этом мы имеем большое колличество проблем дргого рода.

Во-первых: нам нужно установить разрешения на запись в каталог сервера.

Во-вторых: при замене одного файла другим у нас меняются ссылки на эти файлы, что может привести к тому что часть информации на сайте может выглядеть некорректно.

В-третьих: для того что бы обеспечить уникальность имен файлов приходится устраивать пляски с бубном.

В-четвертых: если у меня есть обна база данных и несколько сайтов работющих с ней, то придется каким то образом синхронизировать все эти файлы. Как это сделать я даже и не представляю.

В-пятых: если мне нужно удалить целую галлерею картинок, то мне нужно сначала найти все файлы которые там находятся, удалить все что касается этих файлов из базы данных, и с диска. Это все не сложно, но колличество операций увеличивается практически в два раза. Соответсвенно надежность всего этого процесса уменьшается.


Хотелось бы услышать мнение почтенной публики по этому вопросу. Может быть кто то подкинет какие то "за" и "против". Комментарии и замечания are very welcome!
 

.des.

Поставил пиво кому надо ;-)
Вот для базы ты предполагаешь такой вывод картинок
<img src=http://someserver.com/getImage.php?id=1213 border=0 alt="Image">
а что тебе мешает скриптом отдавать файлы из каталога - тогда проблемы с заменой ссылок не возникнет.
вообще отдели хранение картинок от программы. - то есть меняя скрипт getImage ты можешь хранить их в файлах, а если понадобится в базе.
насчет уникальности имен - ну а что опять же мешает добавлять к имени уникальный идентификатор.
плюсы файловой системы - скорость - но правда она уменьшается при отдаче файлов скриптом. но getImage не обязательно должен быть скрипт на php это очень и очень несложный скрипт можно написать на быстром C тогда скорость сохранится.
 

[VS]

Guest
Один простой аргумент.
Если у тебя посещений не много и загрузки нет - делай как хочешь, хоть в ююкоде храни картинки.

А вот если сервер загружается, много хитов - то вариант с базой намного тормознее и не подходит.
 

webdeveloper

Guest
Автор оригинала: .des.
Вот для базы ты предполагаешь такой вывод картинок
<img src=http://someserver.com/getImage.php?id=1213 border=0 alt="Image">
а что тебе мешает скриптом отдавать файлы из каталога - тогда проблемы с заменой ссылок не возникнет.
Кароший идея! :) Правда это тоже не решает многих вопросов. Как быть с разными зеркалами?

вообще отдели хранение картинок от программы. - то есть меняя скрипт getImage ты можешь хранить их в файлах, а если понадобится в базе.
насчет уникальности имен - ну а что опять же мешает добавлять к имени уникальный идентификатор.
плюсы файловой системы - скорость - но правда она уменьшается при отдаче файлов скриптом. но getImage не обязательно должен быть скрипт на php это очень и очень несложный скрипт можно написать на быстром C тогда скорость сохранится.
Я согласен. Сделать это очень просто. Да и именя отследить тоже не сложно. Я это удже сделал. Все работает. Но все равно это не так элегантно, что ли, как с базой данных. Там все очень просто.

Интересно, какие могт возникунуть проблемы при хранени этого всего в базе данных? Чем это может обернутся? Кроме того что база будет большая.

Меня размер базы кстати совсем не пугает. Видел базу данных на мускуле на 200 мегов и все раоботает прекрасно. Никаких проблем.
 

webdeveloper

Guest
Автор оригинала: [VS]
Один простой аргумент.
Если у тебя посещений не много и загрузки нет - делай как хочешь, хоть в ююкоде храни картинки.

А вот если сервер загружается, много хитов - то вариант с базой намного тормознее и не подходит.
то есть это просто медленнее? тогда встречный вопрос - это медленнее всегда или тоько когда размер базы увеличивается? ты сам с этим экперементировал? у меня просто никакой информации на эту тему нет.
 

Stek

Guest
базу данных на мускуле на 200 мегов и все раоботает прекрасно. Никаких проблем
База на два гига - работает так же прекрастно. Хранить картинки в базе удобно для всевозможных каталогов. Для простого сайта все таки лучше файлы.
 

aloner

Guest
1. Картинки - в базу, иначе управление ими станет кошмаром.
2. Хороший алгоритм выгрузки картинок с кешированием занимает около 50 строк кода.

Картинки отдавать нельзя НИ В КОЕМ СЛУЧАЕ напрямую из базы - слишком накладно. Кешируй в каталог и все будет супер.
 

webdeveloper

Guest
Автор оригинала: aloner
1. Картинки - в базу, иначе управление ими станет кошмаром.
2. Хороший алгоритм выгрузки картинок с кешированием занимает около 50 строк кода.

Картинки отдавать нельзя НИ В КОЕМ СЛУЧАЕ напрямую из базы - слишком накладно. Кешируй в каталог и все будет супер.
а можно поподробнее про кеширование картинок в каталог?
 

aloner

Guest
Скрипт get_pic.php:

1. Смотрит в базе дату модификации картинки.
2. Смотрит есть ли картинка в каталоге кеша и ее время.
3. Если картинки нет или время не совпадает - ложит из базы картинку в кеш и делает touch() с временем из базы.
4. Отдает заголовок "Moved Temporarily, Location: blah-blah".
5. В HTML пишешь "img src=get_pic.php?pic_id=12345".

Вся штука в том, чтобы отдавать правильные заголовки времени модификации картинки.

P.S. Делать запросы в базу можно через раз(два, три и т.п.) - при большой нагрузке.
 

aloner

Guest
Помню где-то пробегала статья про скорость работы с картинками в базе/на диске.

На zend.com, по-моему.
 

aloner

Guest
Кстати, если постараться, то можно прикрутить обработку картинок через ImageMagick "на лету", управляемую параметрами get_pic.php.

Очень хорошие штуки получаются тогда.
 

webdeveloper

Guest
Интересный подход. Нужно почитать побробнее про заголовки HTTP. ЩАс наверное и займусь этим.

Я вообще задумался - может быть и обычные файлы для downlod'a в базу переложить?
 

aloner

Guest
Автор оригинала: si
Если все равно кеш в файлах, почему бы с DB не хранить только имена ?
Краткий список: :)
1. Проблемы с переносом базы. То есть, проблем нет, просто больше работы.
2. Бэкап файлов нужно делать отдельно. Тоже не проблема в принципе, но геморно.
3. Сделать INSERT/DELETE/UPDATE проще, чем копировать/удалять файлы.
4. В случае повреждения ФС - риск потери файлов - нужен дополнительный скрипт, который будет искать битые.
5. GUI-клиент, который конектится напрямую к базе.

Из личного опыта - с поддержкой нескольких десятков тысяч файлов в каталогах (имена в БД) - проблем и головной боли больше, чем когда файлы внутри базы.
Намного больше.
 

aloner

Guest
База она хороша тем, что её один раз дампнул, упаковал - и перетаскивай.
 

webdeveloper

Guest
Автор оригинала: aloner
Из личного опыта - с поддержкой нескольких десятков тысяч файлов в каталогах (имена в БД) - проблем и головной боли больше, чем когда файлы внутри базы.
Намного больше.
Убедил однозначно :)
 

[VS]

Guest
Автор оригинала: aloner
Краткий список: :)
1. Проблемы с переносом базы. То есть, проблем нет, просто больше работы.
За 1 минуту пишется скрипт который tar/gzip'ит директории с картинками и бэкапит архив.

2. Бэкап файлов нужно делать отдельно. Тоже не проблема в принципе, но геморно.
см выше. 1 минута изначально + запускт скрипта для бэкапа.

3. Сделать INSERT/DELETE/UPDATE проще, чем копировать/удалять файлы.
чем?

4. В случае повреждения ФС - риск потери файлов - нужен дополнительный скрипт, который будет искать битые.
В случае повреждения ФС скорее всего база умрет и ее придется базу доставать из последнего бэкапа.
Картинки можно аналогично достать из бэкапа.

5. GUI-клиент, который конектится напрямую к базе.
FTP клиент который конектица "напрямую к файловой системе".
Из личного опыта - с поддержкой нескольких десятков тысяч файлов в каталогах (имена в БД) - проблем и головной боли больше, чем когда файлы внутри базы.
Намного больше.
Комментировать не могу, честно признаю, у меня такого опыта нет. Тем не менее аргументы мне кажутся не убедительными.
 

.des.

Поставил пиво кому надо ;-)
VS и Aloner да блин это дело религии.
выводы: если без кэширования то файловая система однозначно - а то слишком большая нагрузка на базу.
Если есть кэширование то кому как удобнее.
Скорость у файлов всегда будет выше это априори в этом VS однозначно прав.
но и накладных расходов - писание ручками основных операций, тоже побольше.

кстати я тут подумал, что реализация кэширования, сводит на нет все накладные расходы при работе с файлами, так что я за файлы - а имена файлов в базе!
 

aloner

Guest
> Сделать INSERT/DELETE/UPDATE проще, чем копировать/удалять файлы.
> чем?

Имеется в виду копирование/удаление/изменение файлов с параллельным обновлением информации о них в базе данных.

> FTP клиент который конектица "напрямую к файловой системе".

Покажите мне FTP-клиент, который умеет на ходу прописывать название/время/размер файла в базу - я на нем женюсь! :)

Вообще, я никого ни в чем не пытаюсь убедить.

Мне довелось нахватать проблем с хранением файла в каталогах - врагу не пожелаю.

В конторе, где я тружусь, базу ведет менеджер, который не будет лазать по FTP - проще в GUI-клиенте нажать кнопку "добавить изображение". :)

Тут ведь вопрос не только религиозный, а еще и практический. :)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху