Хранение 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" для облегчения детализации дерева.
(Да, я делал большинство этих вещей в нескольких проектах в прошлом.)