Система галереи изображений - какой подход лучше? - PullRequest
5 голосов
/ 23 января 2012

Я внедряю систему загрузки изображений на PHP, необходимо следующее:

  • Есть категории
  • Разрешить пользователям комментировать изображения
  • Разрешить оценку изображений

Для этого я имею в виду 2 подхода:

1. Реализовать категоризацию по папкам

Каждая категория будет иметь свою собственную папку, и PHP будет определять категории через эти папки.

Плюсы

  • Структурированный вид, легко обнаруживаемые изображения.
  • Использование собственных функций PHP для манипулирования и сбора информации о папках и файлах

Минусы

  • Многократная категоризация - это боль
  • Необходимо сохранить полный путь в базе данных

2. Реализация категоризации по базе данных

Каждое изображение в базе данных будет иметь catID (или несколько идентификаторов catID), и PHP запросит базу данных, чтобы получить изображения

Плюсы

  • Легко реализуемые мультикатегории
  • Сохранено только имя изображения

Против

  • кажется более грязным
  • Требуется много запросов к базе данных.

Как вы думаете, что лучше? Или есть третий, совершенно другой подход, который мне не хватает?

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

Хотелось бы услышать от вас.

Ответы [ 6 ]

3 голосов
/ 23 января 2012

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

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

Дело в том, что Db более грязный, извините, я не могу найти причину того, как он будет более грязным, возможно, вы имеете в виду, что файлы не организованы в файловой системе, но вам все равно нужно организовать файлы на файловую систему и разделите их на несколько папок для лучшей производительности, и если вы хотите получить все загруженные изображения, вы запрашиваете у них все базы данных, что будет намного быстрее, чем ls для всех папок категорий.
Под организацией файлов в файловой системе при использовании подхода БД я имею в виду, что вам нужно разделить их на несколько папок, на самом деле это зависит от того, как вы прогнозируете загрузку изображений:

  1. Если вы прогнозируете, что загрузка будет продолжаться долго, я думаю, что лучше поместить файлы в каталоги по диапазону по времени (день, неделя, месяц), например, если я загружаю изображение сейчас, оно перейдет к «/web_path/uploaded_photos/week4_2012/[some_generated_string].jpg"
  2. Если вы не знаете, как предсказать загрузку, я предлагаю вам разделить файлы на папки на что-то общее, например, первые две буквы в хеше MD5 в имени изображения, например, если мое имя файла "photo_2012" .jpg "хеш будет" c02d73bb3219be105159ac8e38ebdac2 ", поэтому путь в файловой системе будет" /web_path/uploaded_photos/c/0/[some_generated_string].jpg"

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

Удачи.

PS Не забудьте сгенерировать новое имя файла для любого загруженного изображения, чтобы не возникало коллизий при загрузке разными пользователями одного и того же имени изображения или одного и того же пользователя.

2 голосов
/ 23 января 2012

Второе решение (база данных) на самом деле представляет собой систему классификации данных TAG / LABEL.И это путь, самые большие примеры - Gmail и Stackoverflow.Единственное, о чем нужно быть осторожным, это как моделировать теги.Если теги не нормализованы должным образом, запросы из базы данных становятся дорогостоящими.

2 голосов
/ 23 января 2012

Я был бы склонен пойти с подходом базы данных.Вы перечисляете необходимость большого количества запросов к базе данных, но для этого и создаются базы данных.Как вы указали сами, иерархическая структура имеет серьезные ограничения, когда речь идет об элементах, попадающих в более чем одну категорию, и хотя вы можете использовать встроенные функции PHP для навигации по дереву, это действительно будет быстрее или эффективнее, чем выполнение запросов SQL?

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

1 голос
/ 23 января 2012

Поскольку вам нужна база данных для хранения комментариев и оценок, вы должны также хранить категории в базе данных. Некоторое время спустя вы также можете сохранить заголовки и описания изображений; База данных позволяет вам сделать это. И я не стал бы беспокоиться о том, чтобы много обращаться к базе данных.

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

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

дата загрузки: месяц / год

/uploaded_images
    /2010/01
    /2010/02

дата загрузки: месяц-год

/uploaded_images
    /2010-01
    /2010-02

md5 хэш имени изображения: первый символ

/uploaded_images
    /0/
    /1/
    .
    .
    .
    /e/
    /f/

партии тысяч

/uploaded_images
    /00001000/
    /00002000/
    /00003000/
1 голос
/ 23 января 2012

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

/b/e/beach001.jpg

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

0 голосов
/ 04 февраля 2012

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

Это работает как шарм. Спасибо за все ответы!

...