0

入れ子集合モデルを使用して、mySqlデータベースに階層データ(カテゴリ)を保存しています。

すべてが完全に機能しているだけです。ノード(force_to_top)にプロパティを追加して、ノードを一時的に兄弟の先頭に強制するように設定する機能が必要です。物理的に変更せずにこれを行う方法が100%わかりません。lftrgt値。

ノードプロパティがオンになっている場合、元の値と値を他の場所force_to_topに保存したくないので、値を変更してノードを正しい位置に移動し、プロパティが削除されたら元の値と値をリセットします。それはさらに大きな問題を引き起こすだろうと思います、そしてそれは物事を行うための非常に回りくどい方法のように思えますか?(それが実際に最も簡単な方法である場合は訂正してください!しかし、別の方法を見つけたいと思います。できれば、データベース内の値を更新せずにSQLのみを使用してください)lftrgtlftrgtlftrgtforce_to_top

force_to_topプロパティに応じてSQLの出力をなんとか操作できるのではないかと思っていました。

たとえば、次の構造がある場合

        Cars
        |
-----------------
|       |       |
Audi    Ford    VW

次のlft/rgt/force_to_top値があります。

node    lft    rgt  force_to_top
Cars    1      8    false
Audi    2      3    false
Ford    4      5    false
VW      6      7    false

'Cars'の子ノードを出力すると、次のようになります。

Audi
Ford
VW

しかし、ノード「VW」のforce_to_topプロパティがに設定されてtrueいるとしましょう。私が本当に必要とするのは、「Cars」の子ノードの出力です。

VW
Audi
Ford

前述したように、元lftの値と値を保存し、プロパティが削除されrgtた後にそれらをリセットすることを考えました。force_to_topこの方法を行わないことのプラス面は、プロパティをオフにする速度です。これは、実際に値を再度force_to_top設定する以外にデータ操作がないことを意味し、ノードはすぐに元の位置に戻ります。また、各ノードの元の値と値に対して、ストレージ領域/追加のテーブル/追加のフィールドを作成する必要がないことも意味します。force_to_topfalselftrgt

結果を取得した後、phpでこれを行うことも考えましたが、データセットが大きい場合は、処理速度が大幅に低下する可能性があります。

もともとはforce_to_topノードをすべての最上位に設定する必要がありましたが、これは非常に簡単でしたがORDER BY force_to_top, lft、ノードが大規模な階層の中心にある可能性があるため、兄弟の最上位に強制するだけではるかに複雑になりました。

任意の提案や正しい方向へのポイントをいただければ幸いです。

4

1 に答える 1

0

誰かが同様の問題でここでつまずいた場合に備えて(非常にありそうもないです!):

結局、この機能を実現するために私が見つけた唯一の方法は、カテゴリの現在の値parent_idnearest_sibling_idそのforce_to_top値がtrueに設定されたときを保存することでした。

lftこのようにして、とのrgt値を更新することでカテゴリを親の一番上に移動できます。次に、force_to_topが削除されたときに、nearest_sibling_idまだ存在していることと、元のカテゴリ内にあることを確認できparent_idます。その場合は、カテゴリをその横に戻しnearest_sibling_idます。parent_idそうでない場合は、値が古くなっているため、カテゴリが元の場所に実際に配置されていた場所を特定できないため、カテゴリを元のカテゴリの一番下に移動しますnearest_sibling_id

于 2012-11-01T11:01:24.503 に答える