Задать вопрос
@phpcoder81

Какие имена директорий сделать для крупного проекта?

Всем привет. Есть некий проект, где регистрируются люди и выкладывают фото.
В планах для каждого юзера будет отводиться папка /pictures/000001/x.jpg, где 000001 это номер пользователя шестизначный (на перспективу), с заполненными нулями, а x.jpg имена файлов. Всего 1 юзер грузит по 30-100 таких файлов.

Столкнулся с проблемой недавно, тк сейчас все фото лежат в одной папке (/pictures/x.jpg). Файлов уже 25.000+, и папка при открытии жестко тупит, я представляю, что будет дальше.

Вот я и решил сделать разделение проекта логически на данную структуру, чтобы в каждой папке были записи одного юзера. Подскажите, НА БУДУЩЕЕ, универсальна ли данная схема (в плане расширения)?

Правильно ли я задумал идею? /pictures/000001/x.jpg
  • Вопрос задан
  • 307 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
27cm
@27cm
TODO: Написать статус
Хранить ведущие нули в именах папок - лишнее. В целом решение вполне норм, вот только если пользователей, как вы написали, в перспективе станет 100 000+, то это это уже 100 000+ папок и опять возникает та же проблема.

Можно делать, например, как в git: берем хеш sha1 от данных файла, создаем папку из первых двух (или более) символов этого хеша, а внутрь заливаем данные. Получится что-то вроде:
/a4/b7fce097055c3cbd6879db9625f9a3890cc409.jpg
/a4/a66ce019422c3cbcbd69db9625f9a3890cda83.jpg
/8c/3c7fbcd903744b20fd7567a1fcefa99133b5bc.jpg
/e9/65047ad7c57865823c7d992b1d046ea66edf78.jpg
(Всего не более 256 папок)

Или если все файлы пронумерованы:
/a4/1.jpg
/a4/2.jpg
/8c/3.jpg
/e9/4.jpg

При таком подходе вы сами сможете регулировать количество папок, уровень вложенности и среднее число файлов в папках.
Ответ написан
Комментировать
thewind
@thewind
php программист, front / backend developer
Также вы можете просто разбивать пользователей на группы. Например, для пользователей с ID от 1 до 1000 хранить в папке /0/, для 1001 - 2000 в папке /1/
Таким образом номер папки будет получаться просто floor(id/1000)
Ответ написан
Комментировать
2ball
@2ball
Хардкор кодер
Папки организовать от id пользователя. Складывая по 1000 в каждую дочернюю. Т.е. принцип следующий:

/ceil($userId / 1000)/$userId/{files}

На выходе
/0/59/{files}
/1/1088/{files}

Этой организации хватит под ваш проект. Ни одна из директорий не превысит 1000 по содержимому и быстродействие сохраниться при вполне логичной структуре.
Ответ написан
Комментировать
@acspro
Не рекомендую называть папки с помощью user id. Все же это информация и она вполне может пригодиться при взломе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы