Dnes: 17. srpna 2017    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    Databázový stroj
    (Database Engine)

    Pod pojmem Database Engine (tedy pod databázovým strojem) se obvykle rozumí jádro databázového serveru a základní obslužné programy tohoto jádra (například zajišťující vzdálené připojení uživatelů). Lze tedy říci, že databázový stroj je podmnožinou databázového serveru, přičemž pod pojmem databázový server je nutné vidět vybavení (typicky softwarové) pracující nad danou databází a zajišťující veškeré činnosti (včetně všech potřebných komunikací), které nad danou databází mají být zajišťovány.

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    Hypotrachelion


    [Technologie] - Velmi oblíbenou činností – kromě zálohování databází – je ukládání dat do stromu kategorií. Ať chceme nebo ne, stromová struktura je velmi oblíbená, ačkoli "tagy" a "labely" se nám snaží dokázat opak. O tom, jak uložit "takovouto ošklivou věc" do relační databáze bylo napsáno mnohé. My se dnes podíváme na možnosti, jak si tento "výtvor" trochu více užít. Jako základ použijeme velice přímočarou konstrukci tabulky – (#id, id_parent, název...), neboť tato reprezentace je velmi obecná a často používaná pro svoji relativní jednoduchost.



    Jednou ze základních činností je výpis celého (nebo části) stromu, což odpovídá klasickým úlohám na procházení stromu do hloubky nebo do šířky. Vzhledem k jasné rekurzivní definici tohoto problému, se přímo nabízí použití uložených procedur, případně podobných programových bloků.

    Nicméně není to vždy nutné. Například Oracle (ale i jiné databázové platformy – například Firebird od verze 2.1, MS SQL 2005 ve formě CTE) umožňují provádět tzv. rekurzivní dotazy. Vypsání celé struktury tedy může vypadat následovně (záznam 0 není vypisován, neboť jde o kořen):

    select level, id, id_parent, nazev 
    from strom
      where id <> 0
      start with id = 0 
      connect by nocycle id_parent = prior id
      order by level, id_parent;
    

    Sloupec level není v databázi přímo uložen, ale jedná se o pseudo-sloupec, ukazující aktuální úroveň zanoření. Velmi jednoduše je tento příkaz možné rozšířit na možnost odsazení podle hloubky zanoření nebo výpis od určené úrovně. Podobně můžeme modifikovat dotaz, za použití CTE (Common Table Expressions):

    with recursive
      tree as (
        select id, id_parent, nazev, 
               cast('' as varchar(255)) as depth 
          from strom where id = 0
       union all
         select strom.id, strom.id_parent, 
                strom.nazev, depth || '_' as depth 
           from strom inner join tree on strom.id_parent = tree.id
      )
    select * from tree;  
    

    Co ale v případě, že takovouto konstrukci daná databázová platforma nenabízí, případně chceme postupovat obecněji – například pro hladší přechod na jinou platformu? Uložené procedury jsou pak jasnou volbou.

    Protože máme přímo ukázkové rekurzivní zadání, není konstrukce těžká (hlavička funkce je ponechána čtenáři jako cvičení):

      select id, id_parent,nazev 
        from strom 
        where id = :input_id into :id, :id_parent, :nazev
      suspend;
    
      for select id 
            from strom 
            where id_parent = :input_id 
            into :proc_id 
      do begin 
        for select id, id_parent, nazev 
              from traverse(:proc_id) 
              into :id, :id_parent, :nazev
        do begin 
          suspend; 
        end 
      end
    

    Rekurzivní procházení je dobrá věc, především pro zorientování ve struktuře (například v elektronickém obchodě je to k nezaplacení). Ale mnohem častěji budeme potřebovat vypsat všechny větve, které vybrané předcházejí. Mimo jiné, toto je také velmi častý požadavek (a velmi častý dotaz v diskuzích), když webová aplikace zobrazuje drobečkovou navigaci. Řešení díky předchozímu zahřívacímu kolu není obtížné. Jde vlastně o neustálé postupování k předchůdci (hlavička je opět ponechána jako cvičení):

    select id, id_parent, nazev 
      from strom 
      where id = :current_id 
      into :id, :id_parent, :nazev;
      suspend;
    
      if (:id_parent is null) then 
        exit;
    
      for select id, id_parent, nazev 
        from all_parents(:id_parent) 
        into :id, :id_parent, :nazev
      do begin
        suspend;
      end
    

    Výše uvedené bloky de facto ukazují, jak procházet strom "dovnitř" a "ven". Není tedy obtížné přidat další funkcionalitu jako např. počítání produktů v dané kategorii a podkategoriích. Na druhou stranu je ale zapotřebí upozornit, že při rozsáhlých strukturách, může procházení trvat o něco déle, případně lze narazit na limit zanoření rekurze pro danou databázovou platformu.

    Diskutovat o tomto článku můžete na našem diskusním fóru.

    ( Celý článek! | Autor: Jiří Činčura | Počet komentářů: 0 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (1392 hl.)
    Do 1 000,- Kč 
     (979 hl.)
    Do 10 000,- Kč 
     (924 hl.)
    Do 25 000,- Kč 
     (1179 hl.)
    Do 50 000,- Kč 
     (938 hl.)
    Do 75 000,- Kč 
     (1077 hl.)
    Více než 75 000,- Kč 
     (922 hl.)

    Celkem hlasovalo: 7411


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Srpen  >>
    PoÚtStČtSoNe
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena