В нашем приложении мы сохраняем двоичные данные в базе данных (ужасно, я знаю, но это устаревшие вещи, и это было не мое решение). Мы пытаемся перенести эти данные на внешнее устройство, и я пытаюсь найти схему для сохранения этих файлов.Схема сохранения двоичных данных (сохранение загруженных пользователем файлов)
У нас есть несколько арендаторов, я хотел бы иметь каталог для каждого арендатора. Моя схема состоит в том, чтобы построить путь, используя первые три буквы арендатора. Поэтому, если у вас есть арендатор под названием apple
, его файлы будут находиться в /a/p/p/apple
. В этих каталогах я сохраню файлы. Для файлов я хочу сгенерировать случайное 6-значное буквенно-цифровое имя (только строчные буквы в настоящее время по внутренним причинам). Поэтому, если мы создадим имя файла под названием 6a8jxo
, оно будет сохранено как <tenant>/6/a/6/6a8jxo
. С помощью этой стратегии каждый арендатор может иметь максимум около 916 миллиардов уникальных файлов (не то, что мы пытаемся сэкономить много), с максимальным количеством 46 656 файлов в каталоге. Если я поеду на 5-значное имя, у нас будет максимум 60,5 миллиардов уникальных файлов с 1 296 файлами в каталоге.
Есть ли недостатки в этом подходе? Я понимаю, что некоторые каталоги могут содержать только один или два файла, но, на мой взгляд, это не проблема.
Мой коллега не хочет этого делать; он хочет использовать автоинкрементное поле в базе данных, а затем основывать структуру каталогов на шестнадцатеричном (предположим, 32-разрядном), что вместо использования арендатора. С его стратегией шестнадцатеричное значение будет использоваться следующим образом: файл будет храниться в каталоге, расположенном по адресу <tenant>/aa/bbb
, где aa
- это первые два символа (наиболее значимые полубайты) шестнадцатеричного значения, а bbb
- следующие три. Его рассуждение состоит в том, что он только хочет создавать новые каталоги, когда заполняется, а не содержит множество частично заполненных каталогов.
Этот подход вводит многочисленные трудности с кодовой стороны вещей, и я не вижу, чтобы полностью заполненные каталоги были аргументом, который оправдывает дополнительные усилия, необходимые для этого.
Есть ли какие-либо другие стратегии или подходы, которые я не рассматривал?
Это маршрут, по которому мы закончили. Некоторые из проблем, которые я испытывал по поводу того, что я сделал (которые были действительно связаны с особенностями в нашем коде), были решены. –