2

重複の可能性:
php / Mysql の最適なツリー構造

現在、PHP と MySQL でファイル システムをコーディングしています。

フォルダは、フィールド「id」、「name」、「parent_id」を持つデータベース テーブル「folders」に格納されます。これが一番手っ取り早いと思いました。

ファイルはシステムに保存され、フィールド「id」、「name」、「parent_id」、および「realUrl」を持つデータベース テーブル「files」によってリンクされます。

One/Folder/After/Another/Folder のようなパスを作成するとします。これはテーブル「フォルダ」です。

+++++++++++++++++++++++++++++
+ id |   name   | parent_id +
+----|----------|-----------+
+ 1  | One      |     0     +
+ 2  | Folder   |     1     +
+ 3  | After    |     2     +
+ 4  | Another  |     3     +
+ 5  | Folder   |     4     +

フォルダーのパスなどを見つけるのはそれほど簡単ではないことは明らかです。フォルダー「Folder」のデータを要求するとき、この特定のフォルダーへのパスを知りたいと思います。データベーステーブルのすべてのコンテンツを選択してから、PHP で反復処理する以外に、MySQL で良い方法を見つけることができませんでした。しかし、何千ものフォルダがある場合、それには非常に時間がかかる可能性がありますか?

何を提案しますか?すべての依存関係を保存する別のテーブル「親」を作成することを考えました。

++++++++++++++++++++++++++
+ folders_id | parent_id +
+------------|-----------+
+     2      |      1    +
+     3      |      1    +
+     3      |      2    +
+     4      |      1    +
+     4      |      2    +
+     4      |      3    +
+     5      |      1    +
+     5      |      2    +
+     5      |      3    +
+     5      |      4    +

したがって、「One」から「Folder」へのパスを取得したい場合は、

SELECT parent_id FROM parents WHERE folders_id=5

エラーが発生する大きなリスクがあり、もちろん冗長なデータです。では、よりインテリジェントなソリューションがあるのではないでしょうか? MySQLコマンドでテーブル「フォルダ」を直接反復処理することさえできますか?

もちろん、私の質問も速度に関するものです。複数の簡単なクエリを作成する方が速いですか、それとも 1 つの大きなクエリだけを作成してデータを取得する方がよいですか?

テーブル「親」を使用すると、1 つのクエリ (両方のテーブルをマージ) といくつかの PHP でフォルダーのパスを見つけることができます。テーブル「親」がなければ、すべてを選択する以外に方法がわかりません。これは解決策になりませんか?

4

0 に答える 0