Какие имена директорий сделать для крупного проекта?
Всем привет. Есть некий проект, где регистрируются люди и выкладывают фото.
В планах для каждого юзера будет отводиться папка /pictures/000001/x.jpg, где 000001 это номер пользователя шестизначный (на перспективу), с заполненными нулями, а x.jpg имена файлов. Всего 1 юзер грузит по 30-100 таких файлов.
Столкнулся с проблемой недавно, тк сейчас все фото лежат в одной папке (/pictures/x.jpg). Файлов уже 25.000+, и папка при открытии жестко тупит, я представляю, что будет дальше.
Вот я и решил сделать разделение проекта логически на данную структуру, чтобы в каждой папке были записи одного юзера. Подскажите, НА БУДУЩЕЕ, универсальна ли данная схема (в плане расширения)?
Правильно ли я задумал идею? /pictures/000001/x.jpg
Хранить ведущие нули в именах папок - лишнее. В целом решение вполне норм, вот только если пользователей, как вы написали, в перспективе станет 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
При таком подходе вы сами сможете регулировать количество папок, уровень вложенности и среднее число файлов в папках.
Также вы можете просто разбивать пользователей на группы. Например, для пользователей с ID от 1 до 1000 хранить в папке /0/, для 1001 - 2000 в папке /1/
Таким образом номер папки будет получаться просто floor(id/1000)
Папки организовать от id пользователя. Складывая по 1000 в каждую дочернюю. Т.е. принцип следующий:
/ceil($userId / 1000)/$userId/{files}
На выходе
/0/59/{files}
/1/1088/{files}
Этой организации хватит под ваш проект. Ни одна из директорий не превысит 1000 по содержимому и быстродействие сохраниться при вполне логичной структуре.