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 :-)