Autor | Zpráva | ||
---|---|---|---|
Grovik Profil * |
#1 · Zasláno: 17. 2. 2008, 09:36:55
Zdravím,
mám takový dotaz chci udělat výpis rodokmenu z MySQL DB, ale stále se mi nedaří udělat smyčku tak, aby se mi zvířata správně vypsali. Je tam vždy nějaký problém, pokud bych to dělal natvrdo bez smyčky tak to není takový problém, ale já bych rád měl dynamickou hloubku toho rodokmenu. Předem díky za nápady a rady. |
||
Alphard Profil |
#2 · Zasláno: 17. 2. 2008, 09:49:58
na této stránce je uvedeno několik odkazů na články zabývající se stromovou strukturou, podívej se tam http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=28&topic=6 8931
|
||
Grovik Profil * |
#3 · Zasláno: 17. 2. 2008, 21:09:03
Diky za odkaza, bohuzel to nersi muj problem.
Ja se snazim generovat rodokment do hloubky X. Tam narazim na nekolik problemu. Vsude se bohuzel resi problem zbozi, ktery je ponekud odlisny. Mám DB, ktera obsahuje ocislovane zaznamy. Zaznam je jednoznacne jedinecny. Ve stejnem radku jako je cislo jsou jeste dve jina cisla, ktera odkazuji na jine radky v te DB, a tak porad dokola. Vzdy radek odkazuje na dva jine (maximalne na dva jine). Bohuzel narazim na nekolik problemu a popravde nedari se mi je rozlousknout. |
||
Arnost Profil * |
#4 · Zasláno: 19. 2. 2008, 11:12:28
Take resim podobny problem a zatim jsem nevyresil.
|
||
Leo Profil |
#5 · Zasláno: 19. 2. 2008, 11:21:25
Nejak me nenapada, jaky je zasadni rozdil mezi hierarchickou strukturou zbozi a rodokmenem, krome toho, ze dana polozka ma DVE nadrizene polozky. Leo
|
||
Leo Profil |
#6 · Zasláno: 19. 2. 2008, 11:26:21
|
||
ninja Profil |
#7 · Zasláno: 19. 2. 2008, 13:37:52
Grovik: a jakou metodu zkousite? Nekonecne zanorovani se v SQL dela dost spatne. Metod je vicero. Nektere jsou snadne na select ale narocne na inser/update, jine zase obracene.
Nejdrive je tedy potreba odhadnout jak s daty budete pracovat, kolik bude (vetsinou) pracovat, jake vztahy vas budou zajimat, atd. |
||
Grovik Profil * |
#8 · Zasláno: 19. 2. 2008, 23:44:38
to Leo:
Problem je v tom ze ona ta polozka nemam dve nadrizene ale podrizene. A s kazdou dalsi ma kazda dalsi dve. to ninja: Zatim zkousim metodu cyklu, dat neni zase tolik, v podstate pocitam ze maximalni hloubka bude cca 5 takze to neni tak hrozne. Data jsou v kazdem radku. V podstate ma kazdy radek jedinecne ID a potom dalsi dve polozky ktere obsahuji ID rodicu. Tzn odkaz zase nekam dal do te same tabulky. To proto ze i rodice jsou zvirata zadana v te tabulce.. a tak porad dokola. Zacykleni je osetrene uz pri ukladani se overuje. |
||
habendorf Profil |
#9 · Zasláno: 19. 2. 2008, 23:49:14 · Upravil/a: habendorf
Problem je v tom ze ona ta polozka nemam dve nadrizene ale podrizene. A s kazdou dalsi ma kazda dalsi dve.
Zřejmě rozmnožování dělením :o) To bude rodokmen bakterií? |
||
Grovik Profil * |
#10 · Zasláno: 20. 2. 2008, 08:22:58
no kazdy rodokmen roste mocninou ;-) Prece jsou Dva rodice, 4 prarodice 8 praprarodicu 2 na 1, 2 na 2, 2 na 3 ;-)).
|
||
Leo Profil |
#11 · Zasláno: 20. 2. 2008, 09:00:04
"Prece jsou Dva rodice"
No prave ne? Dve nadrazene polozky. Leo |
||
Aleš Janda Profil |
#12 · Zasláno: 20. 2. 2008, 12:21:37
Grovik
Zatim zkousim metodu cyklu Cyklem se stromové struktury vypisovat nedají :-) To je typická úloha pro použití rekurze. Tedy - uděláš funkci vypisující jednoho člověka a z vnitřku funkce zavoláš tu samou funkci na všechny potomky. |
||
Arnost Profil * |
#13 · Zasláno: 20. 2. 2008, 12:33:48
to Ales Janda:
To jsem zkousel vychazi to v podstate stejne jako ten cyklus. Proste misto abych volal tu funkci znovu tak mam vnoreny cyklus a ten se provadi X krat a to podle toho jaka je hloubka v nadrizenem cyklu. Je to trosku na nic, ale je tam naznak funkcnosti. Presto bych to rad vyrasil nejak lepe. |
||
Aleš Janda Profil |
#14 · Zasláno: 20. 2. 2008, 12:38:06
To jsem zkousel vychazi to v podstate stejne jako ten cyklus. Proste misto abych volal tu funkci znovu tak mam vnoreny cyklus a ten se provadi X krat a to podle toho jaka je hloubka v nadrizenem cyklu.
To nevychází stejně :-) Rekurzí jednak nemusíš ten samý cyklus pod sebe dávat několikrát a jednak nemůžeš vědět max. hloubku vnoření (pouze předpokládat). Rozhodně je to mnohem čistší a použitelnější. Co je tedy v tom za problém, když ne toto? |
||
ninja Profil |
#15 · Zasláno: 20. 2. 2008, 12:43:15
Arnost: rekurze je opravdu lepsi nez cyklus.
ZKus se podivat na takovouto strukturu, mazna by ti vyhovovala: http://www.sitepoint.com/article/hierarchical-data-database/2 |
||
Jan Tvrdík Profil |
#16 · Zasláno: 20. 2. 2008, 13:44:23
|
||
Grovik Profil * |
#17 · Zasláno: 20. 2. 2008, 20:59:06
Takze jsem to nejak dotvoril. Dekuji vsem pomoc to byla srdnata! Jakozto zastance toho, ze se ma neco vracet davam kod jak jsem ho nakonec vymyslel. Tereticky ho lze pouzit jakkoliv, staci zmenit nazvy polozek.
//funkce ma dva parametry prvni je ID zvirete a druhym je hloubka function rodokmen ($zvire,$hloubka) { $vysledek=mysql_query("SELECT jmenozvirete,chs,matkacislo,oteccislo FROM zvire WHERE cislo = $zvire") or die("Neco se nepovedlo"); //data se nacetli z DB jdeme na to je zpracovat while ($data = mysql_fetch_array($vysledek)) { echo $hloubka."-".$data[jmenozvirete]." - ".$data[chs]."<br/>"; if ($hloubka <= 0): return; else: $hloubka--; //tady je rekurze! funguje to dobre jen je treba si uvedomit v jakem poradi se data vysypou je mozne pouzit hloubku jako index pripadneho pole, dost to usnadni razeni dat rodokmen ($data[matkacislo],$hloubka); rodokmen ($data[oteccislo],$hloubka); endif; } } Jeste jednou diky za rada! Nektere byli vice prinosne jine mene, ale vsechny byli uzitecne! |
||
koudi Profil |
#18 · Zasláno: 20. 2. 2008, 21:01:34
Aleš Janda
Cyklem se stromové struktury vypisovat nedají :-) Ale dají. |
||
Aleš Janda Profil |
#19 · Zasláno: 20. 2. 2008, 21:09:32
Grovik
Podle mě by tam nemuselo být to if ($hloubka <= 0): return; protože rodokmen by měl končit spíš s tím, když už není žádný údaj v DB. koudi Opravdu? Tak mi napiš algoritmus vypisující stromovou strukturu obecné hloubky bez využití rekurze a nějakého šíleného pomocného zásobníkového pole. Žádné řešeín mě nenapadá, ale rád si rozšířím obzory ;-) |
||
koudi Profil |
#20 · Zasláno: 20. 2. 2008, 21:35:33
Aleš Janda
Odkážu tě např. sem. Sice je tam použit zásobník, ale určitě ne šilený :) http://service.felk.cvut.cz/courses/X36DSA/Lesson06pub.pdf |
||
Aleš Janda Profil |
#21 · Zasláno: 20. 2. 2008, 21:58:12
koudi
Jéé, koukám že jsi taky z FELu :-) DSAčka mě bavily ;-) Jestli myslíš slajdy 46 a 47, pak ano, stromová struktura jde udělat i bez použití rekurze. Ale v podstatě je to pakárna a celá rekurze se tam nasimuluje, je to horší zápis téhož :-) Napadá mě, že na svém diskusním fóru, které je vláknové, také vypisuji celou diskusi bez použití rekurze. Ale tam mám ty položky v DB uložené jinak než pisatel, má to také svá omezení. |
||
Grovik Profil * |
#22 · Zasláno: 20. 2. 2008, 22:18:24
to: Ales Janda
Je to tam z jednoho duvodu . Hloubka jde omezit. Kdyby to melo pokracovat az do uplneho konce... tak by to bylo moc dlouhe. Navic to by bylo treba na 15 generaci a dovedes si prdestavit tu tabulku? :-)) |
||
Leo Profil |
#23 · Zasláno: 20. 2. 2008, 22:21:07
Necetl jsem tuhle debatu podrobne, ale v takovyhle pripadech se spis resi (misto cyklus vs. rekurze) jestli to jde udelat jednim (resp. minimalnim poctem) selectu do db, nebo jich je hafo (pri kazdem volani fce nebo pruchodu cyklem) jeden, a tim se umerne zvysuje zatez db serveru.... Leo
|
||
Grovik Profil * |
#24 · Zasláno: 20. 2. 2008, 22:27:12
to Leo: ano bylo by to docela dobre udelat to tak ze by to cele oddrel SQL server, ale MySQL na tohle neni moc dobre. PL/SQL na to ma funkce.
Myslim ze reseni zde nacrtnute (rekurze) je celkem pouzitelne. Mohlo by byt i horsi a celkem lze rict ze pocet dotazu nebude zase tak zavratny. |
||
Časová prodleva: 16 let
|
0