Это интересный вопрос. В зависимости от уровня безопасности, который вы хотите применить, я бы порекомендовал следующее:
Выберите папку, доступную только вашему серверу приложений (если вы решили сохранить в FS)
Я бы всегда рекомендовал переименовывать файлы в произвольно сгенерированный хеш (или сгенерированное по инкременту имя, например, используемое в средствах сокращения URL, см. Реализацию rubyurl с открытым исходным кодом). Тем не менее, я не буду хранить их в базе данных, потому что файловые системы созданы для обработки файлов, так что пусть это сделает свою работу. Вы должны хранить метаданные в базе данных, чтобы иметь возможность установить правильное имя файла, когда пользователь загружает файл.
Вы должны разбить файлы на несколько папок. Это дает вам множество преимуществ. Во-первых, файловые системы не созданы для обработки миллионов файлов в одной папке. Если у вас есть операции, которые пытаются получить все файлы из папки, это занимает значительно больше времени. Если вы запутаете исходное имя файла, вы можете создать один каталог для каждой буквы в имени файла и получить довольно хорошее распределенное количество файлов в каталоге.
Последнее, что нужно учитывать, - это возможное столкновение имен файлов. Пользователь не должен иметь возможность угадать имя файла от другого пользователя. Так что здесь вам могут потребоваться дополнительные проверки.
В зависимости от уровня безопасности, которого вы хотите достичь, вы можете применять все больше и больше шаблонов.