複雑なサブ構造を持つ 100GB フォルダーの完全な構造を格納できる SQLite ベースのデータベースを実装しようとしています (50 ~ 100K ファイルが予想されます)。DB の主な目的は、このフォルダーのさまざまな側面 (合計サイズ、フォルダーのサイズ、フォルダーの履歴とそのすべてのコンテンツなど) に関する迅速なクエリを取得することです。
ただし、 parent_directoryフィールドだけで「ファイル」テーブルを作成するだけでは、再帰クエリなしでは、サブフォルダーのすべてを含むフォルダー内のすべてのファイルを見つけることができないことに気付きました。これは、コードに必要な最も重要な機能の 1 つだと考えているため、下の図に示すように、このための 2 つのスキーマ オプションを検討しました。
スキーマ 1 では、すべてのファイル名を 1 つのテーブルに格納し、ディレクトリ名を別のテーブルに格納します。どちらにも「parentdir」アイテムがありますが、ルートから特定のファイル/ディレクトリへのパス全体を保存する「FullPath」と呼ばれるテキスト(明らかにテキスト/ブロブはsqliteでは同じです)フィールドもあります( /etc/ など) abc/def/wow/longpath/test.txt)。最大サブフォルダー制限を想定していないため、理論的には最大 30K 文字を許可するフィールドになる可能性があります。私の考えは、親に属するすべてのファイルまたはディレクトリが必要な場合は、このフィールドで親のフルパスを照会して、ファイルIDを取得するだけです
スキーマ 2 では、ファイル名、ファイル ID、DirName、DirID のみをディレクトリとファイル テーブルにそれぞれ格納します。しかし、「Ancestors」と呼ばれる 3 番目のテーブルでは、ファイルごとに、その祖先である各ディレクトリの一連のエントリを保存します (上の例では、test.txt には 5 つのエントリがあり、フォルダの DirID などを指します。 abc、def、wow、および longpath をそれぞれ)。次に、任意のフォルダーの完全なコンテンツが必要な場合は、このテーブルで DirID を探し、すべてのファイル ID を取得します。
スキーマ 1 の主な制限は、可変長テキスト列の全文検索であり、スキーマ 2 の主な制限は、100 ディレクトリなどの奥深くに埋もれているファイルに大量のエントリを追加する必要があることです。 .
これらのソリューションの中で何が最善でしょうか? 私が思いつかなかったより良い解決策はありますか?