4

データ編成の問題があります。私は、サーバーがサーバー上に存在するデータベース内にクライアントのファイルシステム構造のコピーを保持する必要があるクライアント/サーバープロジェクトに取り組んでいます。アイデアは、AJAX 化された Web インターフェイスでサーバー側のファイルシステムの内容を表示することです。現在、ファイルが順番にダンプされるデータベースにファイルのリストをアップロードしているだけです。問題は、ファイルシステム構造がデータベースに入った後、サーバー側でファイルシステム構造を再キャプチャする方法です。ファイルの膨大なリストを反復処理して、サーバー側で親 - >子構造を再構築することは現実的ではないようです。ただし、ファイル オブジェクトが相互に参照していない場合は、それが唯一の選択肢のようです。

これを処理する方法が完全にはわかりません。私が知る限り、親や子へのポインターを保持するオブジェクトを使用して、サーバー側 (おそらく Btree 内) である種のファイルシステム データ構造を複製する必要があります。誰かが共有できる同様の過去の経験を持っているかどうか、または正しい方向に向けるための役立つリソースがあるかどうか疑問に思っています.

4

2 に答える 2

2

「データベース」がSQLデータベースを意味する場合、探している魔法の言葉は「自己参照テーブル」または「変更された事前順序付けされたツリートラバーサル」(MPTT)です

id基本的に、最初のアプローチは、、parent_idおよびname属性を持つ「ノード」を扱います。したがって、ルートレベルのディレクトリを選択するには、次のようにします

SELECT id, name from mytable WHERE parent_id IS NULL AND kind="directory";

あなたを返すと仮定しましょう

[(1, "Documents and Settings"), (2, "Program Files"), (3, "Windows")]

次に、「ドキュメントと設定」内のディレクトリを取得するには、別のクエリを発行します。

SELECT id, name from mytable WHERE parent_id=1 AND kind="directory";

等々。単純!

MPTT は少しトリッキーですが、Wikipediaなどで適切なチュートリアルを見つけることができます。このアプローチは、「特定のノードのすべての子を検索する」、「サブディレクトリを含むこのディレクトリにいくつのファイルがあるか」などのクエリには非常に効率的ですが、すべてを並べ替える必要があるため、ツリーが変更されると効率が低下します。ノード。

Python を使用しているので、ORM を使用する必要があります。それらのクエリを手動で作成するつもりはありませんよね? SQLAlchemy は、単一のクエリで特定の深さまでツリーを「熱心にロードする」など、自己参照関係をモデル化することができます。

于 2012-07-19T06:55:51.970 に答える
2

Unix のやり方に従うことをお勧めします。各ファイルはバイトのストリームと見なされ、それ以上でもそれ以下でもありません。各ファイルは、データの物理ストリームに関連するすべての情報 (属性、所有権などを含む) を保持するi ノード(インデックス ノード)と呼ばれる単一の構造によって技術的に表されます。

i ノードには、読み取り可能な名前については何も含まれていません。各 i ノードには、ファイルの技術名として機能する一意の番号 (永久に) が与えられます。同様の番号を使用して、データベース内のバイト ストリームに一意の ID を与えることができます。i ノードはディスク上の別の連続したセクションに格納されます。i ノード構造の配列 (抽象的な意味で)、またはデータベース内の別のテーブルについて考えてみてください。

ファイルに戻ります。このようにして、一意の番号で表されます。データベース表現では、番号が一意のキーになります。他の i ノード情報 (ファイル属性) が必要な場合は、テーブルに他の列を追加できます。1 つの列は BLOB 型になり、ファイルの内容 (バイトのストリーム) を表します。AJAX の場合、ファイルはかなり小さくなると思います。したがって、ブロブのサイズ制限に問題はありません。

これまでのところ、ファイルはフラットな構造(物理ディスクやリレーショナル データベースなど) として格納されています。

ファイルのディレクトリ名とファイル名の構造は、別のファイルに別々に保持されます (i ノードによって表される他のファイルと一緒に、同じ構造に保持されます)。基本的に、ディレクトリ ファイルはタプルをキャプチャします(bare_name, i-node number)。(このように、ハード リンクは Unix で実装されます。2 つの名前が同じ i-none 番号とペアになっています。) ルート ディレクトリ ファイルには、固定の技術的 ID、つまり予約された i ノード番号が必要です。

于 2012-07-19T06:06:08.133 に答える