2

OOP (まだ学習中) PHP で独自の単純なギャラリー スクリプトを作成中です。

現在のギャラリー スクリプト (Gallery2) はリソースを大量に消費するため、最も効率的な方法でデータベースからアルバムを取得しようとしています。現在のギャラリーには約 35,000 のアイテムと約 100 のアルバムがあります。

アルバムのレイアウト
(出典: iforce.co.nz )

上の画像でわかるように、無制限のサブアルバムが必要です (実際には、おそらく最大で 5 ~ 6 個のみです)。

データベースのレイアウトは、画像を表示するだけなので非常にシンプルです。

アルバムテーブル album_id (int/auto_increment) album_parent (int) album_name (tingtext)

アイテムテーブル item_id (int/auto_increment) item_album (int) item_name (int)

私が思いついたいくつかのクエリは、WHERE ステートメントを使用し、親アルバム ID を使用することに基づいています。

親 ID 0 = 最上位の親 ID 3 は、その ID を親とするすべてのアルバムを取得します。

私が抱えている問題は、アルバム (album_1/subalbum_1/etc) の名前とサブアルバムを使用してブレッドクラムと URL を作成したいのですが、現在のクエリを使用してそれらを一度にプルすることはできません。

何かを見落としていない限り、URL は script.php?album_id=1&album_id=3&album_id=6 のようにして、1 がトップレベル、3 がサブ、6 が 3 のサブであるかのようにそれらを取得する必要があります。

階層のセットアップに関する多くの記事を読みましたが、ほとんどはツリー階層レイアウトを対象としています。単一のパス階層に向けて、アルバムごとにすべてのアルバムのサブアルバムを一度に表示する必要はありません。

ありがとう

編集 アルバム名にはどんな名前でも付けられること、日付は実際のタイムスタンプではなく名前付けにのみ使用されたことを指摘しておく必要があると思いました。申し訳ありません

4

3 に答える 3

3

Retrieve path as ianhales suggested but store it into database table, and retrieve from there to display.

So store current node path into table, and only when moving, renaming nodes will need updating path.

This way will be more efficient reads.

于 2012-05-30T13:57:46.383 に答える
2

私があなたの質問を理解した場合、リーフ (「2 日目」など) からツリーのルート (アルバム データ) へのパスが必要になります。

それが正しければ、この質問への答えでそれを行う必要があります: mysql + php retrieve leaf children with path

于 2012-05-30T13:50:51.683 に答える
1

アルバムにMPTTテーブルを使用することを検討してください。そうすれば、好きな名前を付けて、無制限/無制限のネストを行うことができます。次に、IDでアルバムに写真を追加できます。ドラッグアンドドロップインターフェイスを使用して、このようなテーブルを管理できます。それらは、高速読み取り、低速更新を対象としています。

データに関しては、
アルバムテーブル:album_id(mediumint / unsigned auto_increment)、lft(mediumint / unsigned)、rgt(mediumint / unsigned)album_name(tingtext?)
itemsテーブル:item_id(mediumint / unsigned auto_increment)item_album_id(mediumint / unsigned)item_name (varchar)
Mediumintは、65,000アイテム/アルバムを超える可能性がありますが、1600万を超える可能性は低いと思われるためです。

編集:
優れたツールを使用すると、学習曲線を短縮できます。http://mjsarfatti.com/sandbox/nestedSortable/およびhttps://github.com/mjsarfatti/nestedSortableを参照してください。データベースに保存する必要のある値は、toArray()メソッドによって提供されます。非表示の入力を変更するなど、標準のjQueryUIsortable()イベントを使用できます。update

木またはその一部の選択は、基本的にleft値順に並べられています。leftサブツリーの場合、アイテムを親leftright値の間にあるアイテムに制限します。のように(相対的な)深さで制限することもできますdepth <= parent_depth + number_of_levels_down

データベースから取得したフラットリストを階層として表示するには、スタックを使用して前のアイテムの深さを記録します。アイテムを反復処理するときに、これを使用して、深くなると開くhtmlタグを作成し、深くなると閉じるタグを作成します。

于 2012-05-30T14:04:50.220 に答える