Dnes: 29. dubna 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?
    Datový sklad
    Tento pojem poprvé formuloval koncem 80. let William Inmon jako strategii přístupu k datům určeným pro rozsáhlé analýzy. V případě datového skladu hovoříme o historických, časově rozlišených, agregovaných, průběžně rozšiřovaných datech uspořádaných pro podporu potřeb managementu.

    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.
    Cizí klíče bez cizích klíčů


    [Tipy - triky] - Referenční integrita založená na cizích klíčích je jedna ze skvělých vlastností mnoha databázových platforem. Ale jak to tak ve světě chodí, občas některá skvělá funkce překáží, případně její chování nám nemusí vyhovovat. Jedním z těchto případů může být index, který je zpravidla vytvářen při založení cizího klíče.



    Automatické vytváření indexů – mimochodem občas diskutované i na speciální Firebird konferenci – je zvláště zbytečné, pokud se jedná například o malý číselník, který je odkazován velkou tabulkou (případně pokud je referencí více). Potom tyto indexy mohou zabírat "zbytečně" místo.

    Pokud tedy máme následující struktury typu:

    create table a 
      (id int not null);
    
    create table b 
      (id int not null, 
       id_parent int);
    
    alter table a 
      add primary key(id);
    
    alter table b 
      add primary key(id);
    
    alter table b 
      add foreign key(id_parent) references a(id) 
        on update cascade 
        on delete cascade;
    

    potom se nad sloupcem id_parent vytvoří implicitně index. Je-li ale první tabulka malá a je-li ještě takovýchto "malých" referencí více, může být index za jistých okolností zbytečný.

    Pokud se ale nad problémem zamyslíme, zjistíme, že integritu dat můžeme udržet i jiným způsobem (obecně přechodem k většímu objemu "ruční" práce). Pro naše potřeby nám krásně poslouží triggery. Připravme si strukturu:

    create table aa 
      (id int not null);
    
    create table bb 
      (id int not null, 
       id_parent int);
    
    alter table aa 
      add primary key(id);
    
    alter table bb 
      add primary key(id);
    

    Uvedené tabulky evidentně cizí klíče nepoužívají. Pokusme se cizí klíče nasimulovat – budeme za tímto účelem používat triggery. Při vkládání do tabulky bb potřebujeme, aby v tabulce aa záznam existoval, proto vytvoříme trigger (syntaxe je pro databázovou platformu Firebird):

    CREATE TRIGGER BB_BI0 FOR BB
      ACTIVE BEFORE INSERT POSITION 0
    AS
      declare variable idexists int;
    begin
      idexists = 0;
      select 1 
        from rdb$database 
        where exists(select * 
                       from aa 
                       where aa.id = new.id_parent)
      into :idexists;
      if (idexists = 0) then
      begin
        exception FK_VIOLATION;
      end
    end
    

    Tento trigger v případě, že žádný takový záznam neexistuje vyvolá výjimku a vložení je tím přerušeno. Protože první definice prováděla kaskádní updaty a kaskádní mazaní (obecně je možné pomocí tohoto postupu použít i k simulaci ostatních on update/delete definic), musíme ještě řešení vylepšit. Tentokráte nad tabulkou aa vytvoříme tento trigger:

    CREATE TRIGGER AA_BUD0 FOR AA
      ACTIVE BEFORE UPDATE OR DELETE POSITION 0
    AS
    begin
      if (updating) then
      begin
        update bb 
          set bb.id_parent = new.id 
          where bb.id_parent = old.id;
      end
      if (deleting) then
      begin
        delete from bb 
          where bb.id_parent = old.id;
      end
    end
    

    Tento trigger nad tabulkou bb provede požadované kaskádní operace.

    Tento vzorový postup je možné i rozšířit a do triggerů přidat další výkonnou logiku, kterou by nebylo jednoduché pomocí "klasických" cizích klíčů zařídit. Dokonce lze tento postup dobře aplikovat, pokud pro zvýšení výkonu využíváte de-normalizace struktury databáze, například do 2. normální formy. Záleží pak jen na vašich potřebách a preferencích jaký postup použijete.

    Věděli jste že … Jim Starkey implementoval kaskádní triggery poprvé v platformě InterBase?

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

    Vyhledávání
     

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

    Nic 
     (1128 hl.)
    Do 1 000,- Kč 
     (821 hl.)
    Do 10 000,- Kč 
     (786 hl.)
    Do 25 000,- Kč 
     (1048 hl.)
    Do 50 000,- Kč 
     (809 hl.)
    Do 75 000,- Kč 
     (943 hl.)
    Více než 75 000,- Kč 
     (788 hl.)

    Celkem hlasovalo: 6323


    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ář
    <<  Duben  >>
    PoÚtStČtSoNe
         12
    3456789
    10111213141516
    17181920212223
    24252627282930

    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