ディレクトリ構造に使用されるデータ構造?
-
05-07-2019 - |
質問
ユーザーがディレクトリ(Windowsではなくアプリ内)を作成するプログラムを作成しています。これらのフォルダーにはサブフォルダーなどがあります。すべてのフォルダーには、フォルダーまたはドキュメントのいずれかが含まれている必要があります。使用するのに最適なデータ構造は何ですか?ユーザーがサブフォルダーを選択し、その中およびそのサブフォルダー内のドキュメントを検索できることに注意してください。また、フォルダーまたはサブフォルダーのレベルを制限したくありません。
解決
これは私がしていることです:
データベースのすべてのレコードには、IDとParentIDの2つのフィールドがあります。 IDは4〜5文字です(Base36、a-z:0-9、または同様のもの)。親IDは、親の完全な構造を連結したものです...
そう...
この構造:
Root
Folder1
Folder2
Folder3
Folder4
Folder5
Folder6
このように表されます:
ID ParentID Name
0000 NULL ROOT
0001 0000 Folder1
0002 0000 Folder2
0003 00000002 Folder3
0004 0000 Folder4
0005 00000004 Folder5
0006 000000040005 Folder6
フォルダの下にあるすべてのファイルを見つける必要がある場合、次のようなクエリを実行できるため、この構造が気に入っています。
SELECT * FROM Folders WHERE ParentID LIKE '0000%' -- to find all folders under Folder1
フォルダーとそのすべての子を削除するには:
DELETE FROM Folders WHERE ID='0004' AND ParentID LIKE '00000004%'
フォルダーとその子を移動するには、同じ親を使用するすべてのレコードを新しい親に更新する必要があります。
そして、フォルダまたはサブフォルダレベルを初期化したくない
これに対する明らかな制限は、サブフォルダーの数がParentIDフィールドのサイズに制限されることです。
他のヒント
これを構造化する方法はいくつか考えられますが、明白なものに勝るものはありません。
実際のファイルシステムを使用します。
B +ツリーをお勧めします....インデックス(ページ、フォルダなど)とすべてを簡単に使用できます。
B +ツリーhttp://commons.wikimedia.org/wiki/File:Btree .png
詳細情報: http://ozark.hendrix.edu/~burch/ cs / 340 / reading / btree / index.html
質問がデータ構造を具体的に求めていることを知っていますが、...
オブジェクト指向言語を使用している場合、このタイプの階層ツリー構造に最適な複合設計パターンを使用できます。求めているものが得られます。
ほとんどのOO言語には、ファイルシステムの抽象化が含まれているため、どこから始めればよいかがわかります。必要に応じてサブクラス化します。
たとえば、ディレクトリはディレクトリまたはファイルであるオブジェクトの配列として期待されます。
m-wayツリーデータ構造を使用できます