PHP Должен ли я хранить пути к изображениям в базе данных? - PullRequest
3 голосов
/ 19 августа 2011

У меня будет веб-сайт с кучей компаний, и каждая компания сможет загрузить свой логотип.Будет ли хорошей идеей просто создать папку для каждой регистрирующейся компании, чтобы это были
companies / user1 / logo.jpg и companies / user2 / logo.jpg и просто хранить всех в папке, поэтому мне не нужен путь для ссылки на изображение?

Или я должен хранить их в одной папке, например company_logos / gaegha724252.jpg ивсе они будут случайными именами файлов, и путь будет храниться в базе данных, связанной с этой компанией?

Каковы преимущества и недостатки?

Спасибо!

Ответы [ 5 ]

11 голосов
/ 19 августа 2011

Использование папок для организации

Преимущества : Они логически понятны кому-то, кто возится с системой на заднем плане - вот и все.

Недостатки : «сложнее» убирать при удалении компании и т. Д., И вы должны убедиться, что ни одно из имен каталогов не пересекается, как правило, больше работы с самого начала.

Использование изображений в одной папке

Преимущества Технически немного проще убрать и не так уж много работы.

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

Использование базы данных для хранения изображений

Внимание: в этом аргументе было потеряно много жизней!

Преимущества : Ссылочная целостность, резервное копирование / восстановление проще, классификация

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

I очень рекомендуем просто использовать хешированное имя файла и сохранить его (имя файла) в базе данных, а затем сохранить изображения в папке (или нескольких папках) на диске. Это должно быть намного проще в долгосрочной перспективе и лучше работать в целом, не становясь слишком сложным.

6 голосов
/ 19 августа 2011

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

vv 1st level
61f57fe906dffc16597b7e461e5fce6d.jpg
  ^^ 2nd level

Поскольку алгоритм хеширования имеет одинаковое распределение, это будет равномерно распределять ваши файлы по папкам.(Идея исходит из того, как Squid организовывает свой файловый кеш).Сервер должен возвращать URL-адрес примерно так (например, без понятия о каталогах):

http://server.com/images/61f57fe906dffc16597b7e461e5fce6d.jpg

, и вы можете применить mod_rewrite, чтобы фактически переписать этот URL-адрес примерно так:

/ storage / images / 61 / f5 / 7fe906dffc16597b7e461e5fce6d.jpg

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

1 голос
/ 19 августа 2011

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

Вы можете сохранить местоположение изображения в базе данных или использовать решение ID. Вы также можете сохранить само изображение в базе данных, если хотите, используя тип «blob». Хотя другие вопросы решали эту проблему: Хранение изображений в БД - да или нет?

Я думаю, что было бы лучше либо сохранить имя изображения в базе данных, либо использовать метод ID.

1 голос
/ 19 августа 2011

сохраните их как "company_logos / 125.jpg", где 125 - уникальный идентификатор (первичный ключ в вашей базе данных).

0 голосов
/ 19 августа 2011

Если это будет всего несколько сотен записей или около того, я бы не стал хранить фотографии вне БД.

...