2012-10-24 47 views
0

我有使用嵌套集合模型存儲在mySql數據庫中的分層數據(類別)。在嵌套集的兄弟姐妹前的mySql強制項目

所有工作完全只是我現在需要一個屬性添加到任何節點(force_to_top)將設置節點暫時迫使它的兄弟姐妹的頂部的能力,我不是100%肯定該怎麼辦這沒有在物理上改變lftrgt的值。

當一個節點force_to_top屬性被打開,我不希望在其他地方存儲原始lftrgt值,改變lftrgt值將節點移動到正確的位置,然後重置其原始lftrgt值一旦force_to_top屬性被刪除。我認爲這會導致更嚴重的問題,再加上它似乎是一個非常迂迴的做事方式? (糾正我,如果這實際上是最簡單的方式!但我想找到另一個,最好只使用SQL不更新任何值的數據庫)

我想知道是否有可能以某種方式操縱輸出sql取決於force_to_top屬性?

例如,如果我們有如下的結構

 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 

當我們輸出 '汽車' 的子節點,我們倒是給出:

Audi 
Ford 
VW 

但是讓我們說點‘大衆’有其force_to_top財產小號等來true,我會真正需要的是的子節點的輸出「汽車」現在是:

VW 
Audi 
Ford 

正如我所說,我想過存儲原始lftrgt價值和重置後他們該force_to_top屬性被刪除。不是做這種方式的有利的一面是關閉force_to_top屬性的速度,這將意味着比實際的force_to_top值再次設置爲false和節點會立即回落到原來的位置沒有其他數據操作。也意味着我不需要爲每個節點的原始值lftrgt創建存儲區域/額外表格/額外字段。

我也想過,我獲取的結果後,在PHP這樣做,但對於大型數據集可能會很慢下來。

我本來到force_to_top節點設置爲所有的頂部,這是非常容易的,只需ORDER BY force_to_top, lft,但是現在只能迫使其兄弟姐妹的頂部要複雜得多,因爲節點可能是在中心一個巨大的層次結構。

任何建議或正確的方向點將不勝感激。

回答

0

只是爲了防止任何人在這裏遇到類似的問題(非常不可能!):

最終,我發現實現此功能的唯一方法是將parent_idnearest_sibling_idforce_to_top值設置爲true時存儲該類別的當前值。

這樣我可以通過更新其lftrgt值移動的類別,以其父的頂部,然後當force_to_top被刪除,我可以檢查nearest_sibling_id仍然存在,而且它仍然是原來的parent_id內。如果是這樣,請將該類別移回nearest_sibling_id;如果沒有,只需將該類別移至其原始parent_id的底部,因爲我們無法確定它的原來位置,因爲我們的nearest_sibling_id值已過時。