Dnes: 18. ledna 2018    | 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?
    Systémový katalog
    Struktury, ve kterých jsou uloženy informace o dané databázi, případně databázovém serveru. Někdy je možné se z anglického Data Dictionary setkat s pojmem datový slovník.

    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.
    db4o aneb objektové databáze v .NET


    [Vývoj] - Při plánování vývoje nového projektu vždy uvažujeme, jaké technologie bude nejvýhodnější využít. V některých případech bohužel nevíme, že je možné využít technologie, které jsou odlišné od těch konvenčních, které známe. Jednou z takových oblastí jsou i objektově orientované databázové platformy. Pojďme se podívat, jak k jedné z nich – k db4o – je možné přistupovat z Microsoft .NET.



    Platforma db4o je produktem americké společnosti db4objects a představuje jednoduchý OSŘBD, jehož doménou je perzistentní ukládání objektů. Jádro tvoří .NET knihovna a data jsou ukládána do souboru na disku. Na uložené objekty je možné se dotazovat pomoci jazyku/rozhraní "query by example" (QBE) nebo pomocí vnitřního dotazovacího rozhraní "Query API". Pro někoho možná zásadní nevýhodou je nemožnost dotazovat se na data pomocí SQL.

    Použití db4o v .NET si ukážeme na následujících příkladech. Všechny příklady jsou napsané v .NET Frameworku 2.0 a k jejich vytvoření bylo využito Visual Studio 2005 Beta 2. V příkladech bude využit následující objektový model (po klepnutí na obrázek se model zobrazí v plné velikosti):

    Použitý model

    Vkládání dat
    V db4o není objekt automaticky perzistentní. Je nutné jej uložit pomocí metody ObjectContainer.set(object obj). Spojení s databází učiníme prostým připojením ObjectContaineru k databázovému souboru, žádné přístupové heslo ani connection string není požadováno. Někomu budou možná chybět přístupová práva. Ta však nemají příliš velký význam v případě, že veškerá práva můžeme nastavovat až v aplikační vrstvě jako součást objektového modelu.

    ObjectContainer db = db4o.openFile("zahrada.yap");
    try
    {
      Rostlina snezenka = new Rostlina("sněženka", "podsněžník", 25); 
        // Vytvoření objektu snezenka
    
      db.set(snezenka); 	
        // Uložení objektu snezenka do databáze
    
      Console.WriteLine("Stored " + snezenka);
      Rostlina pelynek = new Rostlina("pelyněk", "pravý", 18); 	
        // Vytvoření objektu pelynek
    
      Rostlina pelynek2 = new Rostlina("pelyněk", "ladní", 23);	
        // Vytvoření objektu pelynek3
    
      Rostlina pelynek3 = new Rostlina("pelyněk", "černobýl", 22);	
        // Vytvoření objektu pelynek3
    
      Zahon zahon1 = new Zahon(1, 25);	
        // Vytvoření objektu zahon1
    
      Zahon zahon2 = new Zahon(2, 40);	
        // Vytvoření objektu zahon2
    
      zahon1.PridejRostlinu(snezenka);
      zahon1.PridejRostlinu(pelynek);
      zahon1.PridejRostlinu(pelynek2);
      db.set(zahon1);	// Uložení objektu zahon1 do databáze
    
      Console.WriteLine("Stored " + zahon1);
      zahon2.PridejRostlinu(pelynek2);
      zahon2.PridejRostlinu(pelynek3);
      db.set(zahon2);	// Uložení objektu zahon2 do databáze
      Console.WriteLine("Stored " + zahon2);
    }
    
    finally
    
    {
      db.close();
    }
    

    Jak je z příkladu patrné, není nutné ukládat každý objekt samostatně. Po uložení objektu se automaticky uloží i všechny v něm agregované objekty. Každý objekt bude uložen právě jednou. To znamená, že se v databázi budou nacházet právě čtyři objekty třídy Rostlina a právě dva objekty třídy Zahon.

    Využití QBE
    Objekt lze z databáze získat dvěma způsoby. Buď pomocí QBE nebo přes Query API. Použití QBE si popíšeme na následujícím příkladu:

    Rostlina proto = new Rostlina(null, null, 0); 
      // Vytvoření prototypu objektu
    ObjectSet result = db.get(proto); 	
      // Získání kolekce objektů z databáze
    
    listResult(result);
    

    K výpisu kolekce objektů můžeme použít následující funkci listResult, kterou budeme používat i v dalších příkladech:

    public static void listResult(ObjectSet result)
    {
      Console.WriteLine(result.size());
      while (result.hasNext())
      {
        Console.WriteLine(result.next());
      }
    }
    

    Nejprve se vytvoří nový objekt dané třídy, který má nataveny pouze ty vlastnosti, které mají mít i všechny vytažené objekty. Pokud má některá vlastnost v prototypu nulovou hodnotu, považuje se tato vlastnost za nepodstatnou při vyhledávání. Objekty, které odpovídají prototypu, se z databáze získají pomocí metody ObjectContainer.get(object protoobj). Proto předchozí příklad, který nemá vyplněné ani jedno jméno prototypové rostliny, ani výšku, vypíše všechny rostliny uložené v databázi. Podobně následující příklad vypíše všechny pelyňky:

    Rostlina proto = new Rostlina("pelyněk", null, 0); 
      // Vytvoření prototypu objektu
    
    ObjectSet result = db.get(proto); 
      // Získání kolekce objektů z databáze
    
    listResult(result);
    

    Složité není ani získávání objektů na základě omezení v agregovaném objektu:

    Rostlina protorostlina = new Rostlina("sněženka", null, 0); 	
      // Vytvoření prototypu agregovaného objektu
     
    Zahon proto = new Zahon(0, 0); 	
      // Vytvoření prototypu hlavního objektu
    
    proto.PridejRostlinu(protorostlina); 
      // Vytvoření asociace mezi prototypy objektů
    
    ObjectSet result = db.get(proto); 	
      // Získání kolekce objektů z databáze
    
    listResult(result);
    

    Mazání dat
    K vymazání objektu z databáze se použije metoda ObjectContainer.get(object obj). Zde již není možné použít prototyp objektu, ale je nutné jako parametr metody použít konkrétní objekt:

    db.delete(pelynek); // Vymaže z databáze objekt Pelynek 
    

    nebo

    ObjectSet result = db.get(new Rostlina("sněženka", null, 0)); 
      // Vytvoření prototypu objektu
    
    db.delete(result.next()); 
      // Vymaže z databáze první objekt ve výsledné kolekci 
    

    Aktualizace dat
    Aktualizace objektu se provádí naprosto stejně, jako jeho vložení. Když získáme objekt z databáze, můžeme s ním libovolně pracovat, tedy i měnit hodnoty jeho vlastností. Aby se změněný objekt změnil i v databázi, je nutné použít opět metodu ObjectContainer.set(object obj):

    snezenka.Zvetsit(20);  
      // Změní se hodnota vlastnosti výška
    
    db.set(snezenka); 
      // Aktualizuje se objekt snezenka v databázi
    

    Využití Query API
    Výše uvedené příklady ilustrují základní operace potřebné k zajištění perzistence objektů. Někomu by to mohlo stačit, ale většinou od databázového systému očekáváme něco navíc. Některá naše očekávání nám pomůže splnit Query API v db4o. Obsahuje nejčastěji používané metody pro sofistikované dotazování na databázi. Nejlepší bude použít názorného příkladu:

    Query query = db.query(); 
    query.constrain(typeof(Rostlina)); 	
      // Vytvoří se omezení dotazu
      
    ObjectSet result = query.execute();	// Spustí se dotaz
    listResult(result);
    

    Předchozí příklad slouží k vypsání všech objektů typu Rostlina. V následujícím příkladě dojde k upřesnění dotazu pouze na rostliny, které mají rodové jméno "pelyněk":

    Query query = db.query();
    query.constrain(typeof(Rostlina)); 
      // Vytvoří se omezení dotazu
    
    query.descend("rodoveJmeno").constrain("pelyněk"); 
      // Vytvoří se zjemňující omezení dotazu na rostliny s rodovým jménem pelyněk
    
    ObjectSet result = query.execute(); 
      // Spustí se dotaz
    
    listResult(result);
    

    Omezení může být určeno také jako negativní:

    query.descend("druhoveJmeno").constrain("pravý").not();
    

    Může být použito intervalů:

    query.descend("vyska").constrain(20).greater();
    query.descend("vyska").constrain(20).smaller();
    

    Omezení může být závislé také na části řetězce:

    query.descend("rodoveJmeno").constrain("pelyn").contains();
    

    Samozřejmě lze omezení spojovat pomocí logických operací AND a OR:

    Query query = db.query();
    query.constrain(typeof(Rostlina)); 
      // Vytvoří se omezení dotazu
    
    Constraint constrA = 
      query.descend("vyska").constrain(20).greater(); 
        // Vytvoří se první zjemňující omezení dotazu
    
    query.descend("rodoveJmeno").constrain("pelyněk").and(constrA); 
      // Vytvoří se druhé zjemňující omezení dotazu a připojí se k němu první
    
    ObjectSet result = query.execute(); 
      // Spustí se dotaz
    
    listResult(result);
    

    Objekty v dotazu lze řadit podle některé jeho vlastnosti:

    Query query = db.query();
    query.constrain(typeof(Rostlina)); 
      // Vytvoří se omezení dotazu
    
    query.descend("vyska").constrain(20).greater();
    query.descend("vyska").orderDescending(); 
      // Rostliny budou seřazeny podle výšky
    
    ObjectSet result = query.execute(); // provede se dotaz
    listResult(result);
    

    V případě, že chceme vyhledávat podle agregovaného objektu, postupujeme obdobně:

    Query query = db.query();
    query.constrain(typeof(Zahon));
    query.descend("rostliny").descend("rodoveJmeno")
    query.descend("rostliny").constrain("sněženka");
    
    ObjectSet result = query.execute();
    
    listResult(result);
    

    Uvedli jsme si výčet základních dotazovacích možností db4o. Uvedené příklady by měly stačit k vytvoření menšího projektu i méně zdatnými vývojáři. To, že výčet možností zde končí, neznamená, že tento výčet možností db4o je kompletní. Není. Db4o dokáže mnohem více. Umí konfigurovat složené projekty tak, aby u nich docházelo ke kaskádovitému mazání. Umí použít transakce, indexovat data, volat callback metody, uzamykat jednotlivé objekty apod.

    Licence na db4o je pro GNU/GPL produkty zdarma. Pro uzavřené produkty je 9 USD na distribuci nebo 3% z ceny aplikace.

    ( Celý článek! | Autor: Stanislav Tvrz | Počet komentářů: 4 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

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

    Nic 
     (1548 hl.)
    Do 1 000,- Kč 
     (1068 hl.)
    Do 10 000,- Kč 
     (999 hl.)
    Do 25 000,- Kč 
     (1378 hl.)
    Do 50 000,- Kč 
     (1016 hl.)
    Do 75 000,- Kč 
     (1178 hl.)
    Více než 75 000,- Kč 
     (1019 hl.)

    Celkem hlasovalo: 8206


    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ář
    <<  Leden  >>
    PoÚtStČtSoNe
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    

    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