Я пытаюсь реализовать базу данных на базе SQLite, которая может хранить полную структуру папки размером 100 ГБ со сложной субструктурой (ожидая 50-100 Кбайт файлов). Основной целью БД было бы получить быстрые запросы по различным аспектам этой папки (общий размер, размер любой папки, историю папки и все ее содержимое и т.д.).
Однако я понял, что найти все файлы внутри папки, включая все ее подпапки, невозможно без рекурсивных запросов, если я просто создаю таблицу "файлов" только с поля parent_directory. Я рассматриваю это как одну из наиболее важных функций, которые мне нужны в моем коде, поэтому я рассмотрел два варианта схемы для этого, как показано на рисунке ниже.
-
В схеме 1 я сохраняю все имена файлов в одной таблице и именах каталогов в другой таблице. Они оба имеют элемент "parentdir", но также имеют текстовое поле (очевидно, текстовое/blob-то же в sqlite), которое называется "FullPath", которое сохранит весь путь от корня до конкретного файла/каталога (например,/etc/а/Def/вау/LongPath/test.txt). Я не предполагаю максимальный лимит подпапки, поэтому теоретически это может быть поле, которое допускает до 30 тыс. Символов. Моя идея заключается в том, что если я хочу, чтобы все файлы или каталоги принадлежали любому родителю, я просто запрашиваю полный путь родителя в этом поле и получаю fileIDs
-
В схеме 2 хранятся только имена файлов, файловые идентификаторы и DirNames, DirIDs в каталогах и таблицах файлов, соответственно. Но в третьей таблице под названием "Предки" я храню для каждого файла набор записей для каждого каталога, являющегося его предком (так что в приведенном выше примере test.txt будет иметь 5 записей, указывая на DirIDs папок и т.д. abc, def, wow и longpath соответственно). Тогда, если я хочу полное содержимое любой папки, я просто ищу DirID в этой таблице и получаю все идентификаторы fileID.
Я вижу, что в схеме 1 основным пределом может быть полнотекстовый поиск столбца с переменной длиной текста, а в схеме 2 основной предел заключается в том, что мне, возможно, придется добавить тонну записей для файлов, которые захоронены глубоко в пределах 100 каталоги или что-то еще.
Каким будет лучшее из этих решений? Есть ли лучшее решение, о котором я не думал?