Autor Zpráva
Grovik
Profil *
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
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 *
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 *
Take resim podobny problem a zatim jsem nevyresil.
Leo
Profil
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
Zkuste tohle, necetl jsem to:

http://www.codango.com/php/dir/webapps/miscella/familytr/

Leo
ninja
Profil
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 *
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
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 *
no kazdy rodokmen roste mocninou ;-) Prece jsou Dva rodice, 4 prarodice 8 praprarodicu 2 na 1, 2 na 2, 2 na 3 ;-)).
Leo
Profil
"Prece jsou Dva rodice"

No prave ne? Dve nadrazene polozky. Leo
Aleš Janda
Profil
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 *
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
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
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
http://interval.cz/clanky/metody-ukladani-stromovych-dat-v-relacnich-d atabazich/
Grovik
Profil *
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
Aleš Janda
Cyklem se stromové struktury vypisovat nedají :-)
Ale dají.
Aleš Janda
Profil
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
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
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 *
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
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 *
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0