Насколько хорошо вы можете хранить двоичные файлы или BLOB-объекты в базе данных, будет сильно зависеть от используемой вами СУБД.
Если вы храните двоичные файлы в файловой системе, вам необходимо учитывать, что происходит в случае коллизии имен файлов, когда вы пытаетесь сохранить два разных файла с одинаковым именем - и если это допустимая операция или нет. Таким образом, наряду со ссылкой на то, где файл находится в файловой системе, вам также может понадобиться сохранить исходное имя файла.
Кроме того, если вы храните большое количество файлов, помните о возможных падениях производительности при хранении всех ваших файлов в одной папке. (Вы не указали свою операционную систему, но вы можете посмотреть этот вопрос для NTFS или этот справочник для ext3.)
У нас была система, которая должна была хранить несколько тысяч файлов в файловой системе, в файловой системе, где нас беспокоило количество файлов в какой-либо одной папке (я думаю, это могла быть FAT32).
Наша система должна добавить новый файл и сгенерировать для него контрольную сумму MD5 (в шестнадцатеричном формате). Для этого потребуются первые два символа и первая папка, следующие два символа - вторая папка как подпапка первой папки, а затем следующие две - третья папка как подпапка вторая папка.
Таким образом, мы получили трехуровневый набор папок, и файлы были достаточно хорошо разбросаны, поэтому ни одна папка не заполнилась слишком сильно.
Если бы после этого у все еще возникла коллизия имени файла, мы просто добавили бы "_ n " к имени файла (до расширения), где n был просто увеличивающимся числом, пока мы не получили имя, которого не было (и даже тогда, я думаю, мы сделали атомарное создание файла, просто чтобы быть уверенным).
Конечно, тогда вам потребуются инструменты для периодического сравнения записей базы данных с файловой системой, пометки всех отсутствующих файлов и очистки любых потерянных файлов, в которых запись базы данных больше не существует.