ユーザーがディレクトリを作成するプログラムを作成しています(ウィンドウではなく、アプリで)。これらのフォルダーにはサブフォルダーなどがあります。すべてのフォルダーには、フォルダーまたはドキュメントのいずれかが含まれている必要があります。使用するのに最適なデータ構造は何ですか? ユーザーはサブフォルダーを選択し、その中およびそのサブフォルダー内のドキュメントを検索できることに注意してください。また、フォルダーやサブフォルダーのレベルを制限したくありません。
7 に答える
これが私がすることです:
データベースのすべてのレコードには、ID と ParentID の 2 つのフィールドがあります。ID は 4 ~ 5 文字です (Base36、az: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+ Tree をお勧めします .... 索引付け (ページ、フォルダーなど) とすべてを簡単に使用できます。
B+ ツリー http://commons.wikimedia.org/wiki/File:Btree.png
詳細情報: http://ozark.hendrix.edu/~burch/cs/340/reading/btree/index.html
質問が具体的にデータ構造を求めていることは知っていますが...
オブジェクト指向言語を使用している場合は、このタイプの階層ツリーのような構造に最適な複合設計パターンを使用できます。あなたはあなたが求めているものを手に入れます。
ほとんどの OO 言語には、ファイル システムの何らかの抽象化が組み込まれているため、ここから始めます。次に、必要に応じてサブクラス化します。
たとえば、ディレクトリは、ディレクトリまたはファイルであるオブジェクトの配列として期待されます。
m-wayツリーデータ構造を使用できます