Obiektowe bazy danych

Podobne dokumenty
Obiektowe bazy danych

Obiektowe bazy danych Obiektowe i obiektowo-relacyjne bazy danych

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Post-relacyjne bazy danych

Obiektowe bazy danych

Obiektowe bazy danych

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Podstawy Programowania Obiektowego

Obiektowe i obiektowo-relacyjne. bazy danych

SBQL. język zapytań dla obiektowych baz danych. Kamil Adamczyk. Uniwersytet Warszawski 20.IV.2009

Programowanie obiektowe - 1.

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

BAZY DANYCH model obiektowy. Opracował: dr inż. Piotr Suchomski

Programowanie obiektowe

Paweł Kurzawa, Delfina Kongo

Metody dostępu do danych

Programowanie 2. Język C++. Wykład 3.

Platformy Programistyczne Podstawy języka Java

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Szablony funkcji i szablony klas

Programowanie obiektowe

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

TEMAT : KLASY DZIEDZICZENIE

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Szablony klas, zastosowanie szablonów w programach

Kurs WWW. Paweł Rajba.

Dziedziczenie. Tomasz Borzyszkowski

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Programowanie obiektowe. Wprowadzenie

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe

Programowanie obiektowe

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Technologie i usługi internetowe cz. 2

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Podstawy programowania obiektowego

Diagramy klas. dr Jarosław Skaruz

PARADYGMATY PROGRAMOWANIA Wykład 4

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Modelowanie obiektowe

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Dokumentacja do API Javy.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie obiektowe

Baza danych sql. 1. Wprowadzenie

Programowanie współbieżne i rozproszone

Materiały do zajęć VII

Zaawansowane programowanie w języku C++ Klasy w C++

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Plan wykładu CORBA. Cechy aplikacji rozproszonych. Aplikacje rozproszone

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP)

Obiektowość BD Powtórka Czas odpowiedzi. Bazy Danych i Systemy informacyjne Wykład 14. Piotr Syga

Języki i metody programowania Java. Wykład 2 (część 2)

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wstęp do programowania obiektowego. Wykład 2

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Język C++ Programowanie obiektowe

Programowanie w Ruby

Oracle11g: Wprowadzenie do SQL

Polimorfizm. dr Jarosław Skaruz

Temat : SBQL 1 obiektowy język zapytań.

Programowanie obiektowe

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Pakiety i interfejsy. Tomasz Borzyszkowski

Klasy abstrakcyjne, interfejsy i polimorfizm

Oracle PL/SQL. Paweł Rajba.

Aplikacje w środowisku Java

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

MAS dr. Inż. Mariusz Trzaska. Realizacja różnych modeli dziedziczenia w obiektowych językach programowania

Modelowanie i Programowanie Obiektowe

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

Systemy GIS Tworzenie zapytań w bazach danych

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie w Internecie. Java

Multimedia JAVA. Historia

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

MongoDB. wprowadzenie. dr inż. Paweł Boiński, Politechnika Poznańska

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Java Język programowania

Programowanie wielowarstwowe i komponentowe

Informatyka I BAZY DANYCH. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2017

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Część I Tworzenie baz danych SQL Server na potrzeby przechowywania danych

1 Atrybuty i metody klasowe

Szablony funkcji i klas (templates)

Abstrakcyjny typ danych

Programowanie i projektowanie obiektowe

Transkrypt:

Obiektowe bazy danych Wykład prowadzi: Tomasz Koszlajda Plan wykładu Model ODMG Język ODL Język ODL Język OQL Integracja obiektowej bazy danych z obiektowymi językami programowania Przykład obiektowej bazy danych - db4o 1

Model ODMG Standard ODMG składa się z czterech podstawowych części: Opis modelu obiektowego ODL -język definicji schematu obiektowej bazy danych OQL - obiektowy język zapytań wzorowany na SQL OML rozszerzenia obiektowych języków programowania: C++, Smalltalk i Java, do przetwarzania trwałych obiektów w obiektowych bazach danych Język definicji schematu - ODL Niezależny od obiektowych języków programowania język definiowania funkcjonalności obiektów składowanych w bazie danych. SQL 3 ODL C++ SQL 3 SmallTalk Java 2

ODL - Nagłówek klasy class Obraz : Medium, ElementGraficzny { (extent Obrazy key numer_ewidencyjny) ewidencyjny)...} Nazwa klasy: Obraz Lista nadklas: Medium, ElementGraficzny Definicja kolekcji: extent Obrazy Unikalność: key numer_ ewidencyjny y Definicja struktury wystąpień klasy Class Osoba { attribute Date data_ urodzenia; attribute enum Płeć (K, M) płeć; attribute struct Adres ( String miasto; String ulica; Int numer_domu;) adres; } class Firma ( attribute Osoba::Adres adres; } 3

Złożone struktury danych Collection<t> Set<t> Dictionary<t,v> Bag<t> List<t> Array<t> attribute set<string> języki_obce; attribute list<struct Adres (...)> adresy; attribute Osoba małżonek; Związki między danymi Osoba {persistence} +imię i : String +nazwisko : String +adres : Adres jest _ autorem [1..*] [1..*] Obraz {persistence} #utworzony : Date #elementy[1..*] : Figura +dodaj(figura) +utwórzkopię() jest_pierwowzorem [0..1] [0..*] relationship set<osoba> autorzy inverse Osoba::utworzył; relationship set<obraz> jestpierwowzorem inverse Obraz::jestModyfikacją; relationship set<obraz> jestmodyfikacją inverse Obraz:: jestpierwowzorem; typ związku nazwa związku związek odwrotny 4

Związki n-arne Brak związków n-arnych Brak atrybutów związków Modelowanie związków n-arnych lub atrybutów związków wymaga dodatkowej klasy - związku Pracownik {persistence} +nazwisko : String +etat : String +płaca : Float uczestniczy Uczestnictwo {persistence} +stawka : Float grupuje [0..*] [1..*] jestobsadzona [0..*] Funkcja {persistence} +nazwa : String +obowiązki : String Projekt {persistence} +nazwa : String +Budżet : Loat Transformacja związków n-arnych class Pracownik {... relationship set<uczestnictwo> uczestniczy inverse Uczestnictwo::uczestniczący;}; class Projekt {... relationship set<uczestnictwo> grupuje inverse Uczestnictwo::grupujący;}; class Funkcja {... relationship set<uczestnictwo> jestobsadzona inverse Uczestnictwo::obsadzona;}; class Uczestnictwo { //dodatkowa klasa związku attribute Float stawka; relationship Pracownik uczestniczący inverse Pracownik::uczestniczy; relationship Projekt grupujący inverse Projekt::grupuje; relationship Funkcja obsadzona inverse Funkcja::jestObsadzona;}; 5

Metody klasy Definicja klasy może zawierać nagłówki metod. Kody metod nie są częścią definicji klas. Nagłówek metody obejmuje: Typ zwrotny metody Nazwę metody Tryby (in, out, in out) i typy parametrów metody Wyjątki zgłaszane przez metodę void dodaj (in Figura fig) raises (NiewłaściwaFigura); Obraz utwórzkopię( ) raises (ZaDużoKopii); Kompletny przykład definicji klasy class Obraz { definicja klasy (extent Obrazy) definicja rozszerzenia attribute Date utworzony; część attribute set<figura> Elementy; } strukturalna relationship set<osoba> autorzy inverse Osoba::utworzył; } relationship set<obraz> jestpierwowzorem inverse Obraz::jestModyfikacją; relationship set<obraz> jestmodyfikacją inverse Obraz:: jestpierwowzorem; void dodaj (in Figura fig) związki } raises (NiewłaściwaFigura); część Obraz utwórzkopię( ) funkcjonalna raises (ZaDużoKopii); }; 6

Język OQL Deklaratywny język zapytań wzorowany na standardzie SQL92 Zgodny z modelem obiektów ODMG Występuje w wersji języka ad-hoc lub zagnieżdżanego w językach obiektowych Obejmuje tylko instrukcje zapytań Typy set<struct> i bag<struct> są równoważne relacjom select struct(liczba: count(*)) from f in Figury Rozszerzenie klasy where f.powierzchnia() > 100 Struktura wyników zapytań Wynikiem zapytań w języku OQL mogą być kolekcje dowolnie złożonych struktur danych select struct(t: w.typ, zw: ( select struct (wx: wr.x, wy: wr.y) from wr in wierzchołki) from w in Wielokąty Wynikiem zapytania jest wielozbiór danych o strukturze: struct<t:string,zw:bag<wx:float,wy:float>> Typ wielokąta Współrzędne wierzchołków wielokąta 7

Wyrażenia ścieżkowe Wyrażenia ścieżkowe umożliwiają nawigację wzdłuż powiązań między obiektami, w głąb struktur atrybutów złożonych lub wyników metod. x.a wartość atrybutu a x.r obiekt wskazywany przez związek r x.m wartość zwracana w wyniku wykonania metody m select struct(x1: o.w1.x, x2: o.w2.x) from o in Odcinki Ścieżka: o. W1. X Odcinki Punkty wierzchołki odcinków Float współrzędne punktu Wyrażenia ścieżkowe Wyrażenia ścieżkowe (za wyjątkiem ostatniego elementu ścieżki) mogą obejmować jedynie związki jednokrotne, atrybuty y jednowartościowe i metody zwracające pojedynczą wartość. select p.szef.adres.miasto.nazwa from p in Pracownicy OK select p.podwładni.adres.miasto.nazwa from p in Pracownicy Wartością jest zbiór pracowników. Atrybut adres nie jest cechą zbioru. 8

Przetwarzanie kolekcji obiektów Miejscem do przetwarzania kolekcji obiektów jest klauzula FROM. Elementy klauzuli FROM mają postać: zmienna IN kolekcja Kolekcja może być rozszerzeniem klasy lub wyrażeniem, którego wartością jest kolekcja, na przykład wyrażeniem ścieżkowym: podwł IN Pracownicy.podwładni Typy kolekcji: wielozbiór (bag) - domyślna zbiór - DISTINCT w klauzuli SELECT lista - klauzula ORDER BY Operacje połączenia Model ODMG obejmuje dwa rodzaje łączenia kolekcji obiektów Strukturalne - przez jawne związki miedzy obiektami i select struct(n: os.nazwisko,d: obr.utworzony) from os in Osoby, obr in os.utworzyła Dynamiczne - przez zależności między wartościami atrybutów obiektów select struct(n1: o1.nazwisko,n2: o2.nazwisko) from o1 in Osoby, o2 in Osoby where o1.adres.miasto = o2.adres.miasto and o1!= o2 9

Wywoływanie metod Język OQL pozwala na wywoływanie metod, wymagając jedynie zgodności typu danych wynikowych metody z typem oczekiwanym przez zapytanie. Składnia zapytań pozwala nie rozróżniać nazw atrybutów od metod bezargumentowych. Metoda bezparametrowa select o.najstarsze_dziecko.adres.ulica adres from Osoby o where o.mieszka_w("poznań") Metoda z parametrem Polimorfizm i dynamiczne wiązanie Język OQL pozwala wykonywać zapytania na polimorficz- nych kolekcjach k obiektów. Dla tej klasy zapytań jest dostępne dynamiczne wiązanie nazw metod obiektów. select f.powierzchnia() from f in Figury zmienna polimorficzna wielokąt::powierzchnia( ) koło::powierzchnia( () dynamiczne wiązanie 10

Wymuszenie zmiany typu Struktura o jednym atrybucie może być przekształcona w pojedynczą wartość. struct(pracownik:nazwisko) -> nazwisko Kolekcja o jednym elemencie może być przekształcona w ten element. element(set(1)) -> 1 Integracja języków obiektowych z OODB Potencjalne rozwiązania: Rozszerzenie proceduralnego języka obiektowego o nowe cechy konieczność stosowania prekompilatorów Modyfikacja kodu wynikowego generowanego przez klasyczne kompilatory zastosowanie post- kompilatorów Rozszerzenie biblioteki o wyspecjalizowane systemowe klasy generyczne 11

ODMG - C++ jako język bazy danych Założenia do implementacji rozszerzeń języka C++ jako języka dostępu do bazy danych: Jeden spójny system typów danych w języku programowania i języku dostępu do bazy danych. Wystąpienia typów mogą być ulotne lub trwałe. Specyficzne konstrukcje ODL/OML uwzględniają składnię i semantykę bazowego języka programowania. Rozwiązanie: Zamiast zastosowania pre- lub post-kompilatorów, wykorzystanie mechanizmu klas generycznych (wzorców). C++ jako język bazy danych Deklaracje ODL Kod C++ z OML Preprocesor deklaracji Nagłówki C++ Kompilator C++ Kod wynikowy Metadane Baza danych ODBMS Runtime trwałe obiekty Linker Aplikacja 12

ODMG - C++ jako język bazy danych Klasy obiektów potencjalnie trwałych są wywodzone z systemowej klasy d_object. Jej funkcjonalność obejmuje konstruktory i destruktor obiektów trwałych oraz specjalne metody do aktywacji i deaktywacji obiektów. Obiekty trwałe muszą być tworzone dynamicznie i przypisywane specjalnym wskaźnikom, zdefiniowanym w oparciu o wystąpienie klasy wzorca d_ref<t>. Cykl życia obiektu Baza danych PAO deactivate activate deactivate activate Aplikacja PAO C++ jako język bazy danych - przykład // definicja klasy obiektów potencjalnie trwałych class Wykładowca : public d_object {...}; // tworzenie obiektu ulotnego Wykładowca prof = new Wykładowca(); // wskaźnik obiektu trwałego d_ref<wykładowca> tprof; // tworzenie obiektu trwałego tprof = new Wykładowca(myDB, "Wykładowca"); tprof->przypiszdyplomanta(studentnowak);... tprof.delete_object(); 13

ODMG Kolekcje obiektów w C++ Kolekcje są zaimplementowane jako wystąpienia klas wzorców. // wzorzec kolekcji - zbiór template<class T> class d_set : public d_collection<t> {...}; class Student : public d_object {...}; // trwała kolekcja trwałych wystąpień klasy Student d_ref<d_set<d_ref<student>>> TPD; <d_set<string>> języki_obce; d_ref<student> d t> nowak; // dodanie elementu do zbioru TPD>insert_element(nowak); TPD+=SKiSR; języki_obce->insert_element("angielski"); Powiązania obiektów w C++ Związki o krotności 1: template<class T, const char* m) class d_rel_ref : public dref<t> {...}; Związki o krotności N: template<class T, const char* m) class d_rel_set : public d_set<dref<t>> {...}; class Pracownik {... d_ Rel_ dref<wydział,"zatrudnia"> pracuje _ na; }; class Wydział {... d_rel_set<pracownik,"pracuje_na"> zatrudnia; }; 14

ODMG Powiązania obiektów w C++ // zdefiniowane obiekty Nowak, Tarzan, marketing // utworzenie dwukierunkowego związkuą Nowak->pracuje_na = &marketing; // usunięcie dwukierunkowego związku Nowak->pracuje_na.clear(); // dodania powiązania dla związku wielokrotnego marketing->zatrudnia.insert_element(&tarzan); // zamiana powiązania w związku wielokrotnym marketing->zatrudnia.replace_element(&nowak, &Tarzan); // usunięcie powiązania ze związku wielokrotnego marketing->zatrudnia.remove_element(&nowak); Przykład obiektowej bazy danych db4o Projekt Open Source Uproszczenie architektury systemu bazy danych Dostępne różne architektury aplikacji Różne języki dostępu: QBE, SODA, Native Query Language Skalowalność Wielo platformowość Java,.Net, VBA Wydajność dla zapytań specyficznych dla obiektowych baz danych 15

Prostota budowy aplikacji // zdefiniowanie klasy public class Pracownik { public Pracownik(String nazwisko, String etat, float placa)...} // otworzenie bazy danych String bd = "BazaDanych"; ObjectContainer db = Db4o.openFile(bd); Pracownik p=new Pracownik("Tarzan","Prezes",25000); // składowanie a obiektu w bazie danych db.set(p); // zamknięcie bazy danych db.close(); Klasa: Object Container Klasa object Container reprezentuje system bazy danych Obsługuje ona dostęp do lokalnego, prywatnego pliku danych Wspiera transakcyjne przetwarzanie danych Zarządza referencjami do obiektów przechowywyanych w bazie danych Zapewnia wydajne przetwarzanie danych w bazie danych 16

Schemat bazy danych Definicje klas w aplikacji = schemat bazy danych // zdefiniowanie klasy public class Pracownik { public Pracownik(String nazwisko, String etat, float placa)}... Pracownik p=new Pracownik("Tarzan","Prezes",25000); // Jeżeli jest to pierwszy obiekt klasy Pracownik // składowany w bazie danych, do schematu bazy danych // dodawana jest definicja klasy Pracownik db.set(p); Hierarchia rozszerzeń klas Wystąpienia podklas tworzą podzbiór wystąpienia nadklas class Kierownik extends Pracownik {...} Kierownik k = new Kierownik("Kowalski",4500.00); db.set(k);... // Kowalski będzie umieszczony w wyniku zapytania ObjectSet wynik = db.get(pracownik.class); 17

Języki zapytań w db4o System bazy danych db4o oferuje trzy różne języki zapytań: QBE Query By Example SODA Simple Object Database Access NativeQuery Preferowane własności języków zapytań: 1. Czyste języki obiektowe 2. Statyczna weryfikacja typów danych 3. Jednorodność języka aplikacji 4. Systemowa optymalizacja zapytań Język zapytań QBE Prosty język zapytań QBE Query by Example Wymaga utworzenia obiektu, który będzie wzorcem dla zapytania // wyszukiwanie obiektów - QBE Pracownik p=new Pracownik(null,"Prezes",0.0f); // nie można pytać o wartości: null, 0, ObjectSet wynik = db.get(p); // obiektem wzorcowym może być klasa wynik = db.get(pracownik.class); Nie umożliwia definiowania złożonych warunków zapytań: AND, OR, NOT. Konstruktor obiektu musi umożliwić tworzenie obiektu bez zainicjowanych atrybutów : null, "". 18

Język zapytań SODA Simple Object Database Access Język SODA umożliwia definiowanie złożonych zapytań w postaci drzew, których węzłami są warunki selekcji. Funkcjonalność języka zapytań jest zaimplementowana w trzech klasach: Constraint, Constraints i Query Funkcjonalność klasy Constraint obejmuje następujące operacje: and (Constraint) like ( ) constains ( ) not ( ) equal ( ) or (Constraint) greater ( ) smaller ( ) identity ( ) Język zapytań SODA Simple Object Database Access Query query=db.query(); // określenie klasy zapytania query.constrain(pracownik.class); // określenie warunku prostego Constraint warunek = query.descend("placa").constrain(5000).greater(); // określenie drugiego warunku prostego // i złożenie warunków query.descend("etat").constrain("prezes").or(warunek); // wykonanie zapytania ObjectSet wynik=query.execute(); execute(); System.out.println(wynik.size()); while(wynik.hasnext()) { Pracownik znaleziony = (Pracownik) wynik.next(); System.out.println(znaleziony); } 19

Język zapytań SODA drzewo zapytania Query query=db.query(); query.constrain(pracownik.class); query.descend ("placa").constrain(5000).greater().or (descend("etat").constrain("prezes")) "płaca" OR Klasa: Pracownik.class "etat" greater: 5000 "Prezes" Języki zapytań w obiektowych bazach danych OQL String oql = "select * from o in Osoby where p.wiek < 20"; OQLQuery query = new OQLQuery(oql); Object osoba = query.execute(); JDOQL Query query = persistencemanager.newquery(osoba.class, wiek < 20"); Collection osoby = (Collection)query.execute(); db4o SODA C# Query query = database.query(); query.constrain(typeof(osoba)); query.descend( wiek").constrain(20).smaller(); IList osoby = query.execute(); 20

Języki zapytań w obiektowych bazach danych Brak syntaktycznej i semantycznej weryfikacji zapytań Wymagany dostęp do prywatnych atrybutów klas Brak wsparcia dla refaktoryzacji Brak wsparcia dla wielokrotnego użytku: wywoływania metod, polimorfizmu, redefinicji Nieodporność na ataki typu wstrzykiwanie kodu Java Osoba.wiek() < 20 Brak systemowej optymalizacji zapytań dla dużych zbiorów danych Brak skalowalności Założenia języka zapytań NativeQuery W Java JDK 5 wymaga zdefiniowania klasy dziedziczącej po generycznej klasie Predicate i zaimplementowaniu w niej abstrakcyjnej metody Match. class Prezesi<T> extends Predicate<T> { float min, max; Prezesi(float n, float x) { min = n; max = x;} public boolean match(pracownik prac) { // klasa obiektów return prac.etat().equals("prezes") (prac.placa() > min && prac.placa() < max);}; } }; Prezesi pred = new Prezesi (10000, 25000); ObjectSet sp=db.query(pred); 21

Język zapytań NativeQuery Konwencja zapytania ad-hoc ObjectSet sp=db.query(new Predicate<Pracownik>() // dziedziczenie i redefinicja metody match { public boolean match(pracownik prac) { return prac.weznazwisko().equals("tarzan") (prac.placa() > 4500 && prac.placa() < 10000);}; } ); Definicja anonimowej klasy dziedziczącej po klasie Predicate Język zapytań NativeQuery Wyrażenia ścieżkowe w NativeQuery ObjectSet sp=db.query(new Predicate<Pracownik>() // dziedziczenie i redefinicja metody match { public boolean match(pracownik prac) { return prac.zespol().nazwa().equals( Zarząd"); } ); 22

Język zapytań NativeQuery C# Zastosowanie typu danych delegate ObjectSet sp=db.query<pracownik> ( delegate Pracownik p) // definicja operacji uruchamianej jako delegate p { return prac.weznazwisko().equals("tarzan") (prac.placa() > 4500 && prac.placa() < 10000); } ); Usuwanie i modyfikacja obiektów Pracownik p=new Pracownik(null,null,10000.00); ObjectSet wynik = db.get(p); while(wynik.hasnext()) hasnext()) { Pracownik prac=(pracownik)wynik.next(); // usunięcie db.delete(prac); }... while(wynik.hasnext()) { kopia obiektu Pracownik prac=(pracownik)wynik.next(); // modyfikacja obiektu na podstawie jego OID prac.podniesplace(1500); db.set(prac); // uspójnienie kopii z oryginałem } 23

Powiązania między danymi System db4o respektuje związki między obiektami zdefiniowanymi w aplikacji public class Pracownik {... private Pracownik szef; private Set<Pracownik> podwladni; public Pracownik(String nazwisko,string etat){ this.podwladni= new HashSet<Pracownik>(); } public void dodajpodwladnego(pracownik pod) { this.podwladni.add(pod); }} Składowanie złożonych obiektów Metoda set gwarantuje niejawne zapisanie do bazy danych wszystkich powiązanych ą obiektów Pracownik p=new Pracownik("Tarzan","Prezes",25000); Zespol z=new Zespol("Zarząd"); // Przypisanie pracownikowi zespołu p.przypisz_zespol(z); // Składowanie obiektów w bazie danych db.set(p); // W bazie danych znajdą się wszystkie // powiązane obiekty 24

Odczyt powiązanych obiektów Odczyt z bazy danych obiektu, który ma powiązania ą z innymi obiektami powoduje automatyczny odczyt powiązanych obiektów, dla ich natychmiastowego użycia Kaskadowe usuwanie obiektów złożonych Usunięcie z bazy danych obiektu, który ma powiązania z innymi obiektami może wymagać usunięcia tych obiektów semantyka związku kompozycji W tym celu, należy wykonać na klasie obiektu złożonego metodę cascadeondelete( ) Głębokość kaskadowego usuwania może być konfigurowana za pomocą metody: set(object, depth) 25

Transakcyjność db4o Przetwarzanie danych w db4o ma charakter transakcyjny. Niejawnym rozpoczęciem transakcji jest otwarcie bazy danych. Niejawnym zakończeniem jest zamknięcia bazy danych. Funkcjonalność bazy danych obejmuje jawne zatwierdzanie i wycofywanie transakcji. String bd = "BazaDanych"; ObjectContainer db = Db4o.openFile(bd); Pracownik p=new Pracownik("Tarzan","Prezes",25000); "Prezes" // składowanie obiektu w bazie danych db.set(p); // wycofanie transakcji db.rollback(); Architektura systemu db4o 26

Architektura aplikacji db4o Pojedyncza aplikacja zintegrowana z plikiem danych Aplikacja db4o Plik danych // otworzenie bazy danych String bd = "BazaDanych"; ObjectContainer db = Db4o.openFile(bd); Pracownik p=new Pracownik("Tarzan","Prezes"); // niejawne zdefiniowanie schematu i // składowanie obiektu w bazie danych db.set(p); // zamknięcie bazy danych db.close(); Architektura aplikacji db4o Lokalny serwer bazy danych Aplikacja db4o Serwer db4o Baza danych String bd = "BazaDanych"; ObjectServer server = Db4o.openServer(db,0); // port = 0, serwer lokalny try { // otwarcie klienta ObjectContainer client=server.openclient();... client.close(); } finally { server.close(); } 27

Architektura aplikacji db4o Architektura klient - serwer Aplikacja db4o sieć Serwer db4o Baza danych String bd = "BazaDanych"; // port <> 0, serwer zdalny ObjectServer server=db4o.openserver(db,1521); server.grantaccess("user","password"); // otwarcie klienta ObjectContainer client=server.openclient( "localhost",port,user,password );... client.close(); server.close(); Wydajność Benchmark OO7 Benchmark Pole Position Barcelona circuit Barcelona circuit 100 zapytań na 30 000 obiektów o 5 poziomach dziedziczenia 28

Producenci OODBS db4objects Objectivity/DB it Progress ObjectStore Enterprise Versant Object Database, FastObject.Net GemStone/S, Gemstone Facets EyeDB GNU Open Source 29