Autor | Zpráva | ||
---|---|---|---|
TUL Profil * |
#1 · Zasláno: 30. 4. 2008, 09:32:59
Zdravim,
mám stromové menu uložené v databázi [id, polozka_menu, titulek, odkaz, id_rodice]; Může mít n úrovní. Pomocí rekurzivní funkce ho dokažu vypsat do seznamu (ul, li). S výsledek jsem spokojen. Dejme tomu, že jsem nastánce, kde odkaz = "http://www.example.com/kontakt/detail/". Pořád nemůžu přijít na to, jak z toho jediného údaje sestavit drobečkovou navigaci. Neporadili byste mi s tím trochu? Také bych rád vypsal menu tak, aby se strom vypsal do úrovně, kde odkaz = "http://www.example.com/kontakt/detail/" s jednou pod úrvovní (id_rodice = xx), pokavad by existovala. Hledám co nejjednodušší řešení, proto Vám píši. Díky za typy. |
||
ninja Profil |
#2 · Zasláno: 30. 4. 2008, 10:59:30
TUL: jestli pouzivas rekuzri, tak preci uplne stejne, ne? Na zacatku znas informace aktualni polozky menu.
1. Zjistim si id_rodice a jeho data. 2. Ulozim 3. Pokud ma nove ulozene take id_rodice, goto 1. |
||
Joker Profil |
#3 · Zasláno: 30. 4. 2008, 11:29:08
ninja
Pokud se tohle dělá častěji, je výhodnější si zvolit nějaký lepší způsob ukládání stromových dat, viz: http://interval.cz/clanky/metody-ukladani-stromovych-dat-v-relacnich-d atabazich/ Na tohle bude asi nejlepší traverzování kolem stromu (Modified Preorder Tree Traversal algorithm), předpokládám, že přidání nové kategorie bude v poměru ke čtení seznamu kategorií spíše výjimečná událost. |
||
ninja Profil |
#4 · Zasláno: 30. 4. 2008, 13:41:43
Joker: s tim souhlasim, proto pisi "jestli pouzivas rekurzi".
|
||
MaxwellDemon Profil |
#5 · Zasláno: 1. 5. 2008, 06:38:18
Joker, ninja: osobně hlasuju pro starou dobrou klasiku parent_id - rekurze ... všechny ostatní metody obsahujou natrvrdo dopočítávaný prvky (a naprosto nadbytečný), což je nejoblíbenější zdroj chyb vůbec
|
||
Joker Profil |
#6 · Zasláno: 1. 5. 2008, 09:10:04
MaxwellDemon
To je sice pravda, jenže s tímhle způsobem uložení jsou i takové maličkosti jako třeba: - vypsat cestu k dané kategorii (právě ta drobečková navigace) - vypsat strom kategorií - určit, zda se určitý prvek nachází v určité kategorii jsou docela problém. Třeba s traverzováním stromu na každý ten úkol stačí jeden SQL dotaz. Jinak jestli jsou ty sloupce "nadbytečné", to je otázka, protože je sice lze dopočítat z ostatních dat, ale není to právě jednoduché. Třeba u traverzování stromu je pravda, že při každé změně struktury kategorií je potřeba "přeindexovat" strom. Nicméně zrovna u kategorií se to podle mě vyplatí- třeba já na svém webu dělal změnu struktury kategorií za toho půl roku co existuje asi třikrát, zatímco výběry z tabulky kategorií se dělají skoro na každé stránce několikrát. |
||
MaxwellDemon Profil |
#7 · Zasláno: 1. 5. 2008, 12:08:07 · Upravil/a: MaxwellDemon
Joker
nevim ... asi je to každému dle jeho potřeb a schopností ... já třeba ty rekurze nedělám v php vůbec a mám na to napsaný stored procedures přímo na databázi ... takže mi nic z toho do phpka neprobublává a volám vždycky akorát triviální select na tý proceduře (která mi vrací například i celou tu postupnou kaskádu pro jednotlivý id v jakýkoli úrovni) ... a v mým případě se ty kategorie (položky v menu) měněj způsobem, ze kterýho by mi časem zcela určitě hráblo, kdybych to měla pořád nějak růčo v databázi managovat ... a navíc tim generovat fakt zbytečný a navíc nebezpečný redundantní data takže odpověď je jednoduchá ... za použití stored procedures ti na každej ten úkol stačí taky jeden jedinej naprosto triviální sql dotaz ... a i bez nadbytečných tvrdých dat ... jde jenom o čistej třívrstvej designovej návrh a jasný interfacy |
||
Joker Profil |
#8 · Zasláno: 1. 5. 2008, 13:30:39
MaxwellDemon
já třeba ty rekurze nedělám v php vůbec a mám na to napsaný stored procedures přímo na databázi No ale jestli se z PHP volají přímo ty dotazy, nebo ta procedura, která je provede, přece nic nemění na tom, že databáze je musí zpracovat a tedy oproti traverzování stromu bude několikanásobně víc vytížená. v mým případě se ty kategorie (položky v menu) měněj způsobem, ze kterýho by mi časem zcela určitě hráblo, kdybych to měla pořád nějak růčo v databázi managovat Probůh, to ne- žádné takovéhle činnosti se samozřejmě nedělají v databázi ručně! Akorát se příslušně upraví funkce/metody na přidávání a přesouvání kategorií. Traverzování stromu vlastně ve srovnání s ukládáním rodiče obrátí náročnost: zatímco při ukládání rodiče můžete velmi jednoduše strom upravovat, ale na vybírání potřebujete rekurzi, u algoritmu traverzování stromu naopak na výběr stačí jediný dotaz, ale na změnu stromu potřebujete většinou o dva dotazy navíc oproti ukládání rodiče (při ukládání rodiče jen ten dotaz co chcete udělat, při traverzování stromu pak ještě 2xUPDATE pro přenastavení levých a pravých indexů- ovšem i ty dva jednoduché UPDATE dotazy jsou výhodnější než rekurze, IMHO). |
||
MaxwellDemon Profil |
Joker
hmmmmm .... pochybuju, že bys to provedení rekurze na databázi, kde v tomhle připadě jde z hlediska performance o velice levnou proceduru na primárních klíčích v řádech několika milisekund na tisíce položek, vůbec poznal ... a jestli se z php volá postupně x dotazů na databázi v rámci rekurzivní php funkce nebo jestli se zavolá jedna procedura na databázi, která tu rekurzi provede přímo na databázi bez přenášení dat a vrátí jenom už celej hotovej výsledek, to už mi připadá z hlediska performance sakra rozdíl ... ovšem srovnání volání tý procedury s voláním dotazu na traverzovanej strom vyjde prakticky nastejno ... ten případnej rozdíl (if any) v rámci veškerých přenosů dat v rámci webový aplikace vůbec nepostřehneš ... a vyhneš se tý hromádce redundantních a zbytečných dat |
||
Časová prodleva: 16 let
|
0