2012-01-03 4 views
3

Я работаю над дизайном базы данных для базовой фотогалереи, которую каждый пользователь может загрузить несколько изображений.MySQL Design for User Photo Gallery

Прямо сейчас вот то, что у меня есть:

photo_gallery

photo_id - image    - sort_order - user_id 
1  - test.jpg   - 1   - 1 
2  - another_photo.jpg - 2   - 1 

И тогда на моей структуре папок Я хотел бы создать новую папку, например, так: изображений/фото-галерея/ и сохраните изображения там. Теперь я должен создать папку для каждого user_id и хранить их конкретные изображения в этой папке/

Так что в этом случае: изображения/фото-галерея/1/test.jpg и все фото пользователя 1 будет там?

Кроме того, для повторного калибровки, я думаю об использовании smart image resizer, поэтому я могу просто сохранить исходную фотографию, и если я хочу изменить ее размер до определенного размера, я могу просто вызвать ее, используя сценарий, например:/image. php? width = 200 & height = 200 & image = test.jpg.

Должен ли я быть хэшированием этих имен файлов? Я что-то пропустил? Любые предложения о том, как улучшить это?

Спасибо!

ответ

4

Теперь, следует ли создать папку для каждого user_id и сохранить их конкретные изображения в этой папке?

Да, было бы неплохо отделить загрузку каким-либо образом, чтобы вы не попали в один каталог с десятками тысяч файлов. Вы можете разделить их по идентификатору пользователя, с помощью первых букв (например, images/t/te/test.jpg) или с помощью хеша (например, images/0e/0e4fab12.jpg).


Должен ли я быть хэширования эти имена файлов?

Это зависит от того, что вы пытаетесь выполнить. Так как вы собираетесь обратиться к именам файлов в URL, сохраняя имя файла с известным набором «безопасные» символы могут быть преимуществом:

image.php?image=c/ca/cat%20farting%20On%20a%20lemon.jpg 
-- vs -- 
image.php?image=0a/0a1b2c3d.jpg 

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

photo_id | image   | orig_fn   | sort_order | user_id 
1  | 0a/0a1b2c3d.jpg | charginLazors.jpg | 1   | 2 

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


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

Используя метод хеширования, который создает шестнадцатеричные имена файлов означает, что ваше максимальное количество вложенных папок будет быть кратным 16:

  • Один символ — 16 подпапок
  • Два символа — 256 подпапки
  • Три символа — 4096 подпапки

Если вы используете более двух символов, я хотел бы предложить вложенности папки еще дальше: 0a/0a12/0a12bd31.jpg-или-0a/12/0a12bd31.jpg. Это делает навигацию/управление файлами несколько более управляемыми (IMO)

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

+0

Это хороший ответ. Я просто хотел подчеркнуть возможность дублирования имени файла/файла. Если есть вероятность, что пользователь загрузит изображение с тем же именем или что пользователи загружат одно и то же изображение (в случае, если вы основываете имя файла на хеше самого изображения), вам необходимо убедиться, сначала проверяем дублирование (file_exists()) и обрабатываем его каким-то образом. Вы также можете добавить mysql photo_id в конец файла ('_'.photo_id), чтобы сохранить его уникальным и, возможно, использовать его как ярлык идентификации в будущем. –

+0

Спасибо за отличный ответ. Всего пару вопросов. Для сохранения пути лучше не хранить его как: 0a/0a1b2c3d.jpg вместо того, чтобы включать папку с изображениями, если я когда-либо ее изменю? А также, какая польза в этой ситуации для хранения исходного имени файла? – Drew

+0

@ Дрю: Хороший улов. Да, было бы лучше сохранить путь изображения в базе данных относительно корневого пути вашего изображения (который вы можете установить в файле конфигурации). Я пересмотрю ответ. Что касается исходного имени файла, это действительно зависит от цели галереи. Если пользователю было бы полезно просмотреть исходное имя файла (или загрузить изображение с его исходным именем, а не как казалось бы случайное имя), включите его. Если имя файла не имеет значения, пропустите его. Это красота создания вашей собственной системы: вы можете идеально ее использовать по своему предназначению. –

0

Теперь я должен создать папку для каждого user_id

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

Кроме того, для изменения размера, я имею в вид с помощью смарт-Resizer

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

Я пропустил что-нибудь еще?

Ну, возможно, это разрешение пользователя, которое может управлять тем, как вы храните изображения.

Любые предложения по улучшению этого?

Я работал над этими идеями и создали фотоблог, который вы можете найти here это с открытым исходным кодом, так не стесняйтесь, чтобы бросить взгляд на PHP и исходный код JavaScript.