Hlavní navigace

Objektové databáze

7. 10. 2011 11:47 zboj

Hitem posledních let (a tak trochu buzzwordem, podobně jako HTML5) jsou tzv. NoSQL databáze, tedy databáze, které nejsou relační. Relační databáze mají mnoho užitečných vlastností (proto jsou ostatně nejrozšířenější), ale občas se hodí i jiný způsob práce se strukturovanými daty. Zastánci NoSQL databází vyzdvihují například jejich škálovatelnost. Pro obrovské objemy dat je využívají společnosti jako Google, Amazon apod.

Podtypem NoSQL databází jsou databáze objektové. Mají rozhraní pro objektově orientované jazyky a ukládají transparentně celé hierarchie objektů. Pro programátora se chovají podobně jako ORM (ukládání objektů do relačních databází), ovšem bez potřeby psát anotace do kódu nebo bokem do XML.

Je zřejmé, že pro rozumnou funkčnost musí použitý jazyk podporovat introspekci objektů a ideálně také přístup k AST kódu (alespoň u výrazů a podmínek). Jednou z nejrozšířenějších objektových databází je db4objects (zkráceně db4o). Její vývoj běží už deset let a je k dispozici ve verzích pro Javu a C#. Její použití ve velmi jednoduché. Databázi otevřeme jedním řádkem:

ObjectContainer db = Db4o.openFile("test.db")

Rovněž jediným řádkem uložíme objekt:

db.set(person);

Dotazy do databáze lze specifikovat nativně. Celý koncept se jmenuje „native queries“ (případně „safe queries“) a spočívá ve způsobu zápisu dotazu. Místo řetězce (jako v SQL), ve kterém nám překladač neodhalí syntaktické nesrovnalosti ani překlepy v názvech tabulek a atributů, se používá přímo konstrukce daného jazyka, tedy např. lambda výrazy v C# nebo vnořené anonymní třídy v Javě:

List<Person> people = db.query(new Predicate<Person>() { public boolean match(Person person) { return person.getAge() == 30; } })

Tento kód vrátí seznam všech osob v databázi (instancí třídy Person), jejichž věk je 30 let. Na první pohled se může zdát, že třída Predicate a její metoda match je použita na každý objekt v databázi jako filtr. Takové sekvenční zpracování by samozřejmě bylo obecně nepoužitelné. Db4o je ale mnohem chytřejší. Kód v metodě match nevyhodnocuje, ale analyzuje. Z výrazu za return vytvoří syntaktický strom (podobně jako překladač, ovšem v tomto případě nemá databáze k dispozici zdrojový kód a musí pracovat s mezikódem), který následně použije pro vyhledání objektů podle indexů, jež fungují zcela stejně jako indexy v relačních databázích. Výhody tohoto postupu jsou zřejmé: programátor se nemusí učit další jazyk (např. SQL nebo OQL), ale pracuje jen v jednom jazyku, v němž píše zbytek kódu. Navíc při překladu dochází ke kontrole jmen tříd a atributů. Lze využít automatické doplňování (IntelliSense pro C#). Kód lze automaticky refaktorovat. A tak dále…

Objektové databáze mají dlouhou historii, ty nejstarší vznikaly pro Smalltalk v rámci výzkumných projektů. Později se jich několik objevilo pro C++ a v poslední době pro spravované (managed) jazyky (Java, C#) a některé dynamické. Poslední vývoj přináší nativní dotazy také do C++.

Sdílet