Ваш первый вариант намного быстрее.
Думайте о каталоге в файловой системе как о текстовом файле с несортированным списком всех файлов в этом каталоге с адресом, где найти файл на диске. Чтобы прочитать файл, вам необходимо знать адрес файла на диске. Если у вас есть путь, например «/ myfilename», вам нужно найти файл /, который является каталогом и содержит все файлы в этом каталоге. Чем вам нужно отсканировать этот файл для записи «myfilename», которая в худшем случае может потребовать, чтобы вы просмотрели весь файл. В среднем это займет O (N / 2), в то время как N составляет примерно 1 миллиард (общее количество файлов в этом каталоге).
Если у вас есть несколько каталогов ... Скажем, всегда 1000 файлов в каталоге, чтобы у вас было 3 уровня каталогов и ваш путь к файлу теперь / A / B / myfilename, тогда вам сначала нужно будет открыть каталог /, найдите A (для этого требуется O (1000/2), откройте этот файл и найдите B (O (1000/2) снова) и снова откройте этот файл, чтобы найти myfilename (все же снова O (1000/2)). быть 3 * O (1000/2) = 1500, что НАМНОГО быстрее, чем O (500.000.000), который мы имели ранее.
Это очень важный аспект файловых систем, о котором всегда следует помнить. Если у вас есть каталог, риск которого может превысить 10 000 файлов, я настоятельно рекомендую подумать о стратегии сортировки этих файлов в подкаталогах.
Следует ли вам лучше использовать реляционную базу данных, зависит от других вопросов: вам нужны резервные копии (которые создаются одновременно)? Вам нужны транзакции помимо того, что предлагают простые файловые системы журналирования? Вам нужен контроль параллелизма? Вам нужно искать свои файлы? Как часто вам нужен доступ к файлам? Как часто вы меняете свои файлы?
Для дальнейшего чтения файловых систем я рекомендую книгу Tanenbaum «Современная операционная система» (глава 6 «Файловые системы»), которая доступна онлайн здесь: http://lovingod.host.sk/index.html?page=tanenbaum%2FOperating-Systems-Design.html