Хранение ext3 в базе данных sql

Можно ли было хранить ext3-подобную систему в mysql? Например, чтобы построить систему метаданных файлов, которая будет включать пути и разрешения? Если да, то каков пример этого формата? Я предполагаю, что начальный денормализованный маршрут будет здесь:

-rw-r--r--@  1 david  staff   552B Nov  2 15:55 wsgi.py
-rw-r--r--   1 david  staff   113B Oct 30 20:45 ~.bash_profile

Таким образом, у нас будет 7 столбцов:

permissions | links | user | group | size | date | filename

Я полагаю, нам понадобятся еще два для "управления":

fileId | directoryId

Кажется ли это далеко от базы, или это будет возможно? Что было бы лучшим и более нормализованным способом сохранить это?

1 ответ

Конечно, вы можете сканировать файловую систему и собирать метаинформацию о каждом файле и каталоге, а затем сохранять ее в базе данных. Но эта информация не может заменить информацию файловой системы, только ее "копию".

Я бы имел (как минимум) 2 таблицы: Files а также Directories, Файл будет иметь dir_id. Каталог будет иметь как dir_id для себя, так и parent_id для перехода по дереву каталогов. Верх дерева ("корень") будет нулем или нулем.

Мягкие ссылки, жесткие ссылки, устройства, монтирование, /proc и т. Д. Добавили бы проблемы, но, может быть, вас это не волнует?

size должен быть BIGINT, permissions, если закодировано, может вписаться в SMALLINT UNSIGNEDили может быть сохранен в виде строки. user а также group может быть идентификатором или строкой; вам может понадобиться таблица id:name для пользователей и одна для групп. За date, рассматривать TIMESTAMP или, может быть DATETIME; имейте в виду, что ОС может делать что-то ближе к TIMESTAMP иметь дело с часовыми поясами. (Windows, возможно, отличается.)

Если вы храните копии файлов, я рекомендую использовать другую таблицу, связанную с Files с помощью file_id, Но будьте осторожны, LONGBLOB ограничено 4 ГБ, и есть другие настройки, которые затрудняют хранение чего-либо большего, чем 16 МБ. Итак, я мог бы предложить разбить на куски что-нибудь больше, чем 64 КБ, сжать куски и т. Д. (Для этого, вероятно, потребуется еще одна таблица)

Что касается восстановления полного пути из "иерархии", которую я предложил выше, это всего лишь небольшой объем кода. Это может быть сделано в коде вашего приложения или в хранимой процедуре. В MySQL 8.0 или MariaDB 10.2 доступны "CTE" для облегчения детализации дерева.

(Да, я делал большинство этих вещей в нескольких проектах в прошлом.)

Другие вопросы по тегам