Posted By: Jovo () on 'CZdatabases' Title: Jovo 8 Date: Thu Jan 4 19:09:18 2001 Z Jovova zapisniku - 8:"Rekurzivni struktury v DB" ================================================== pozn.: Rekurzivni (stromove) databazove struktury. No ... rikam stromove, aby se dalo dobre predstavit, o co jde. Vseobecne se da nasledujici pouzit na obecnou grafovou strukturu (struktury s vazanymi prvky). Sem tam se da v databazich narazit na stromovou definovanou strukturu. Co to vlasne je ? :-) Dam priklad: Mame auto. Auto lze rozpadnout na - kastli a podvozek Kastle je slozena z: - plechy, palubni deska, skla, svetla a ozdob Podvozek lze sestavit z: - motoru, prevodovky, kol, sedacek a chladice Motor se sklada z .... Vetsinou se daji vystopovat dva styly vytvareni databazovych struktur (tvrdaci mohou napsat dalsi dil - Ze zapisniku XXX - rekurze v objektovych databazich. Ja o jsem v objektech v db nikdy nedelal, takze nemam predstavu o co jde.) pokud mame data vsech veci nastrkana v jedne tabulce (tozn. je v ni jak motor, tak auto, sedadlo, kola i kastle ..) : a] Jednodussi - vse v jedne tabulce TABLE vec ( id serial, vyrobni_cislo integer, uroven_ve_stromu integer, popis char(20), evidencni_cislo integer, ukazatel_na_otce integer) ); takze mame neco jako auto = (1,12345000,1,"AUTO FELDA AHJ-38-65",20,NULL) kastle = (2,21324560,2,NULL,21,1) podvozek = (3,87321150,2,"podvozek AHJ-38-65",28,1) motor = (4,14993421,3,"motor AHJ-38-65",50,3) prevodovka = (5,54655461,3,"prevod. AHJ-38-65",51,3) plechy = (6,48766541,3,"plechy AHJ-38-65",74,2) skla = (7,15468732,3,"skla AHJ-38-65",75,2) - vyhody : jednoduchost - nevyhody : mensi flexibilita, spatne se s tim dela, snadno dochazi k zmatkum. Vsechny veci musi mit tytez atributy (nakonec je z toho tabulka velka jako Brno v niz ma kazda vec vyplneno jen par atributu a ostatni jsou NULL.) -> reseni: Mit v vec jen spolecne atributy a doplnkove zvlast v separatnich tabulkach (X3). b] slozitejsi - spojovaci tabulka TABLE vec ( id serial, vyrobni_cislo integer, popis char(20), evidencni_cislo integer, ); TABLE spojeni ( id_otce integer, id_syna integer, uroven integer, ); takze mame neco jako vec : auto = (1,12345000,"AUTO FELDA AHJ-38-65",20) kastle = (2,21324560,NULL,21) podvozek = (3,87321150,"podvozek AHJ-38-65",28) motor = (4,14993421,"motor AHJ-38-65",50) prevodovka = (5,54655461,"prevod. AHJ-38-65",51) plechy = (6,48766541,"plechy AHJ-38-65",74) skla = (7,15468732,"skla AHJ-38-65",75) spojeni: kastle-auto = (1,2,2) // (X1) podvozek-auto = (1,3,2) // (X2) motor-podvozek = (3,4,3) prevodovka-podvozek = (3,5,3) plechy-kastle = (2,6,3) skla-kastle = (2,7,3) - vyhody : spojeni se da pridat k vec, i kdyz to puvodne nebylo navrzeno. Pracuje se jen se spojenim (napriklad kdyz rozebereme auto na podvozek a kastli, tak smazeme jen radky oznacene X1,X2) - nevyhody : o dost hur se to ladi, musi se delat slozitejsi kod a vice formularu, neni hned videt kdo kam patri a jestli vubec. c] rozpady do vice tabulek TABLE auta ( id serial, vyrobni_cislo integer, popis char(20), evidencni_cislo integer, ); TABLE kastle ( id_otce integer, vyrobni_cislo integer, ); TABLE podvozky ( id_otce integer, vyrobni_cislo integer, popis char(20), evidencni_cislo integer, ); TABLE kola ...... TABLE skla ...... ...... - vyhody : Zde se nemusi pocitat uroven - nevyhody : fura tabulek, na kazdou jiny formular, ... Pouziva se jen ve velmi specifickych situacich. Lze zjednodusit treba tim, ze dame kola a skla dohromady, plechy budou mit stejne atributy s palubni deskou, ... d] super-slozity - spojovaci tabulka s nazvy (identifikaci) tabulek. TABLE auta ( // zde je klic dvojice vyrobni_cislo integer, [vyrobni_cislo,evidencni_cislo] popis char(20), evidencni_cislo integer, ); TABLE vlaky ( id serial, vyrobni_cislo integer, popis char(20), pocet_vagonu integer, nosnost decimal(10,2), rychlost smallint ); TABLE spojeni ( jmeno_tabulky_otce char(20), sloupce_otce char(50), klic_otce char(100), uroven integer, jmeno_tabulky_syna char(20), sloupce_syna char(50), klic_syna char(100), ); Vyhody a nevyhody jsou stejne jako u [b],[c]. - vyhody : lze "michat jablka a hrusky". Dovedeno do extremu lze do spojeni napsat i jmeno databaze a mit naprosto transparentni vazbu. - nevyhody : Toto je opravdu vyjimecne, pro zkusene harcovniky a vyjimecne situace. Slozitost tohoto postupu je znacna, ale mozna se nekomu bude hosit, az bude roubovat nejakou novou funkci na zastaraly system. Uz jsem videl v praxi [c], o [d] jsem jenom slysel (a jsem rad, ze jsem o tom jen slysel, protoze v tom delat ... to radsi hlavou do zdi :-). Posutup [a] jsem (myslim) zazil v jednom skolnim prikladu. S postupem [b] normalne pracujeme, je ovsem obohaceny o (X3) a funkcnost je zcela vyhovujici. Vas Jovo. PS: ... a vsimli jste si, ze uroven zanoreni je technicky vzato nadbytecny udaj ? Vzdy jde presne vypocitat. Ale je rozumne ji v databazi drzet z duvodu prehlednosti (hned vim, na ktere urovni trcim) a uspory casu (kdo to ma taky furt pocitat, ze :-)