Недавно я начал разрабатывать довольно огромный сайт. На сайте я хотел бы разрешить пользователям загружать свои образцы. В настоящий момент мы довольно ограничены, поэтому изображения будут храниться на нашем сервере.
Я немного зациклен на логике. Таким образом, моя логика была бы такой.
Пользователь создает папку с именем, которое хранится в базе данных с прикрепленным к ней users id
таблица папок
Ряды
id | folder | user_id 1 | Some folder | 1 2 | New folder | 4 3 | Nother folder | 7
Таблица изображений
Ряды
id | image_name | folder_id | 1 | image1.jpg | 1 2 | image2.jpg | 1 3 | image3.jpg | 1 4 | image4.jpg | 2 5 | image5.jpg | 2 6 | image6.jpg | 2
связи
class Folder extends Eloquent { public function images() { return static::has_many('Images'); } } class Image extends Eloquent { public function folder() { return static::belongs_to('Folder'); } }
структура папок на сервере
- samples -user_id - folder_id - image1 - image2 - image3
так как вы можете видеть, пользователь создает папку после создания папки, user
загружает имя изображения в базу данных с folders id
и показывает изображения, как описано выше с реализацией.
Так что мои вопросы.
И то, что я самый священный, – это 2 вещи.
Я думаю, что это приведет к огромной базе данных, во-вторых, к id's
, после x времени, когда будет больше пользователей, количество id's
увеличится, и я знаю, что это будет звучать странно, но поскольку много пользователей загрузит изображения, это приведет к огромным id, что я имею в виду, возможно, он достигнет миллионов, есть ли способ решить эту проблему?
Спасибо вам за помощь
Ok – позволяет разбить это на несколько суб-ответов;
Вопрос:
- Is this a good logic in your opinion - Can this lead problems in the future - What would you offer for this functionality
Ответ:
Логика кажется звуковой – но мне любопытно, где вы будете хранить изображения? Внутри public_html – или вне веб-корня? Если у вас есть изображения внутри public_html – и разрешить браузеру обращаться к ним напрямую, это позволит пользователям «угадывать» другие пользовательские папки и получать к ним доступ. Вам необходимо безопасно хранить данные.
Чтобы сделать изображения вне веб-корня , и убедитесь, что к ним доступны только авторизованные пользователи – вы должны использовать readfile () . Что-то вроде этого будет делать трюк
function user_file($file_name = "") { if ($file_name) { // Ensure no funny business names to prevent directory transversal etc. $file_name = str_replace ('..', '', $file_name); $file_name = str_replace ('/', '', $file_name); // now do the logic to check user is logged in if (Auth::check()) { // Serve file via readfile() - we hard code the user_ID - so they // can only get to their own images readfile('../your_app/samples/'.Auth::user()->id.'/'.$file); } } }
Вопрос:
Я думаю, что это приведет к огромной базе данных, во-вторых, к id, после x времени, когда будет больше пользователей, количество идентификаторов увеличится, и я знаю, что это будет звучать странно, но поскольку много пользователей загрузит изображения, это приведет к огромным id, что я имею в виду, возможно, он достигнет миллионов
Ответ:
Согласно странице функций mySQL :
Мы используем MySQL Server с базами данных, которые содержат 50 миллионов записей. Мы также знаем пользователей, которые используют MySQL Server с 200 000 таблицами и около 5 000 000 000 строк.
Так что 5 миллиардов строк. Вы, возможно, доберетесь до нескольких миллионов. Таким образом, вы здесь в безопасности (в зависимости от вашего оборудования).
Вопрос:
… но так как много пользователей загрузит изображения, это приведет к огромным id, что я имею в виду, возможно, это достигнет миллионов, есть ли способ решить эту проблему?
Ответ:
Если вы не хотите хранить миллионы записей и беспокоитесь о производительности, одним из вариантов является сохранение таблицы папок, но падение таблицы изображений. Вместо этого вы можете использовать scandir () в папке – и получить PHP для получения имен файлов из самой директории. Тогда у вас не так много накладных расходов.
<?php $list_of_user_files = scandir("$user_id/$folder_id"); foreach ($list_of_user_files as $file) { echo "File: $file <br>"; } ?>
Методом сохранения таблицы папок и использования функции scandir является стандартная процедура. И позвольте php извлекать имена файлов из папки. Если у вас есть несколько файлов, попробуйте классифицировать их с порядком года и месяца, как в wordpress. подобно
2012 01 02 03 2013 01 02 03
etc внутри идентификатора папки. Таким образом, общее количество изображений в папке будет относительно меньше.