Все зависит от целей. К примеру в моем проектике много фотографий. Сами оригиналы хранятся на диске , а их превью в базе данных вместе с другой информацией. Файлы можно хранить к примеру таким образом:
Например данные о файле записаны в базе данных с ID 35678. Тип данных поля ID в базе аналогичен типу int в Java . Значит максимальное количество символов в ID - 10. Переводим наш ID в строку вида 0000035678.
Далее разбиваем на директории: например по два знака C:\my_file_storage\ 00\00\03\56\78.
Создаем директорию по данному пути и кладем туда файл. (C:\my_file_storage\ 00\00\03\56\78\MyFile.dat)
Это в случае если у вас большое количество файлов и вы хотите уникальную директорию для каждого. Так мы гарантируем что в одной директории не будет более ста директорий.
Можно разбить покрупней.
Можно в конечную директорию класть не по одному файлу а по многу:
C:\my_file_storage\ 00\00\03\56\root_for_hundred_files\MyFile.dat
(В данном случае в конечной папке не будет более ста файлов).
Папки могут быть виртуальными - просто в БД надо хранить иерархию папок пользователя.
Но можно сделать и реальную файловую структуру, как юзер захотел. (Но мне такой подход не очень нравится )
Но повторюсь все зависит от целей, количества файлов, их размеров.