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

Search the boards