Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Nested Sets - przenoszenie węzłów i liści góra/dół
grz16w
post
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.07.2009
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


Witam.

Czy ktoś wie lub posiada przykład działającej poprawnie funkcji przesuwania liści i węzłów w strukturze Nested Sets wewnątrz jednej gałęzi (rodzica)? Mam tabelę posiadającą kolumny `id`, `nazwa`, `lft`, `rgt`, `parent`. W jaki sposób zamienić miejscami dwa węzły lub liście wewnątrz tego samego rodzica (uwzględniając, że te węzły mogą posiadać również swoje dzieci itd.)? Z góry dziękuję serdecznie za odpowiedzi (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Zanim zapomnę: o ile dobrze pamiętam phpBB3 albo jakiś inny PHP-owski skrypt forum ma drzewo kategorii oparte o ten właśnie model i jest tam kod do przenoszenia - możesz podejrzeć.

Ogólnie to jest to trochę... zamotane. Bo trzeba zmieniać klucze LFT i RGT w połowie drzewa przy próbie przeniesienia jakiegoś węzła. Sprawy nie ułatwia fakt, że właściwie każdy rodzaj czy nawet wariant operacji wymaga nieco innego podejścia.

Przede wszystkim musisz wyliczyć deltę, czyli fragment drzewa który przenosisz (różnica RGT i LFT). Następnie musisz pomniejszyć indeksy LFT / RGT wszystkich elementów występujących po przenoszonej gałęzi właśnie o wartość delty. Teraz drzewo ponownie jest spójne - nie ma żadnych "dziur". Kolejny krok to zrobienie miejsca na przenoszoną gałąź. Musisz indeksy LFT / RGT wszystkich elementów które będą miały występować po wklejanym elemencie zwiększyć o wartość delty. Ostatni krok to zmienienie indeksów LFT / RGT przenoszonej gałęzi tak by pasowały do swojej nowej lokacji.

I jeszcze kilka rad:
1. W przypadku nested set warto również przechowywać w bazie informacje o poziomie zagłębienia konkretnego elementu - bardzo ułatwia to wiele operacji.
2. Całość obejmij transakcją.
3. Mimo iż da się to skrócić czasami do mniejszej ilości ale bardziej skomplikowanych zapytań nie rób tego. 10 prostych UPDATE-ów jest po stokroć lepsze niż 2 skomplikowane, pełne CASE-ów i innych paskudnych konstrukcji.
Go to the top of the page
+Quote Post

Posty w temacie
- grz16w   Nested Sets - przenoszenie węzłów i liści góra/dół   10.04.2011, 22:42:12
- - Crozin   Zanim zapomnę: o ile dobrze pamiętam phpBB3 albo j...   10.04.2011, 23:13:45
- - jang   http://www.phpriot.com/articles/nested-trees-2/7 ...   11.04.2011, 08:18:26
- - JoShiMa   Cytat(grz16w @ 10.04.2011, 22:42:12 )...   11.04.2011, 10:24:51
|- - grz16w   Cytat(JoShiMa @ 11.04.2011, 11:24:51 ...   11.04.2011, 15:13:30
|- - JoShiMa   Cytat(grz16w @ 11.04.2011, 15:13:30 )...   11.04.2011, 21:38:11
|- - grz16w   Cytat(JoShiMa @ 11.04.2011, 22:38:11 ...   11.04.2011, 22:02:31
|- - JoShiMa   Cytat(grz16w @ 11.04.2011, 22:02:31 )...   11.04.2011, 22:37:33
- - Crozin   Można ale jest to dosyć skomplikowane, a trzymanie...   11.04.2011, 22:08:23
- - Crozin   @JoShiMa: Szkoda tylko, że nie dodałeś że dynamicz...   11.04.2011, 22:59:11
|- - JoShiMa   Cytat(Crozin @ 11.04.2011, 22:59:11 )...   11.04.2011, 23:08:01
- - Crozin   CytatLub podzapytania. I nie odwracaj kota ogonem....   11.04.2011, 23:32:32
|- - JoShiMa   Cytat(Crozin @ 11.04.2011, 23:32:32 )...   11.04.2011, 23:38:53
- - wiewiorek   Joshima napisal: "@Crozin naucz się wreszcie ...   12.04.2011, 07:55:05
|- - JoShiMa   Cytat(wiewiorek @ 12.04.2011, 07:55:0...   12.04.2011, 09:24:17
- - grz16w   Więc tak.. Użyłem metody: CytatSELECT node.name, ...   12.04.2011, 10:39:37
- - JoShiMa   A to zapytanie wywołujesz w bazie czy w skrypcie P...   12.04.2011, 11:03:46
- - grz16w   Wykonuję to zapytanie przez PHP. Gdy wykonuję w pa...   12.04.2011, 11:27:00
|- - JoShiMa   Cytat(grz16w @ 12.04.2011, 11:27:00 )...   12.04.2011, 21:52:17
- - Crozin   CytatCytatTo podzapytanie to o ile się nie mylę (j...   12.04.2011, 16:53:32
- - Crozin   Nic nie oszukuję. Przecież przy przenoszeniu i tak...   12.04.2011, 21:55:07


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.12.2025 - 13:33