Za posledních 25 let vývoje počítačů a programování aplikací můžeme vysledovat mohutný trend přechodu od strukturovaného k objektově orientovanému programování. Toto platí i v oblasti zpracování dat a databází. V osmdesátých létech způsobily revoluci relační databáze, v létech devadesátých s mohutným nástupem objektově orientovaného programování začaly vznikat i objektově orientované databáze, které si kladou za cíl ulehčit a zrychlit práci s daty. Ovšem situace není zdaleka tak jednoduchá, protože relační a objektový přístup je od základu rozdílný. Existuje jak mnoho výhod, tak i mnoho nevýhod pro relační i objektové databáze.
Na současném databázovém trhu existují tři základní typy relační databáze (Relational Database Management System, RDBMS), objektově-relační ("Object Relational" Database Management System, ORDBMS) a objektové (Object Database Management System, ODBMS). V tabulce jsou uvedeny podle prodávajích.
Databázové systémy podle prodávajícího, 1997 |
|||
Produkty | |||
Prodávající | RDBMS | ORDBMS | ODBMS |
Oracle | Oracle 7.x | Oracle 8.x | |
Sybase | System 10/11 | ||
Informix | Dynamic Server | Universal Server (Illustra) | |
IBM | DB/2 | Universal Database (DB/2 Extenders ) | |
UniSQL | UniSQL/X | ||
Unisys | OSMOS | ||
Computer Associates | OpenIngres | Jasmine | |
Gemstone | Gemstone | ||
O2 | O2 | ||
Object Design | Object Store | ||
Objectivity | Objectivity/DB | ||
Versant | Versant ODBMS | ||
Zdroj: International Data Corporation, 1997 |
Jak už bylo naznačeno v úvodu, lze databáze rozdělit podle nějakých kriterií. Je to však spíše dohadování, než konečné rozdělení, proto se v následující části rozdělíme databáze do několika kategorií a pokusíme se je navzájem odlišit. Popis každého typu rozdělíme na tři části:
Technologie relačních databází byla původně navržena E.F.Coddem a později ji implementovala IBM a jiní. Standard je popsán ANSI a ISO normou, časteji se na ni ovšem odvoláváme jako na SQL + číslo verze. Poslední je tedy SQL2. Novější verze SQL3 obsahuje navíc některá objektová rozšíření.
RDBMS uchovává data v databázi skládající se z řádků a sloupců. Řádek odpovídá záznamu (record, tuple); sloupce odpovídají atributům (polím v záznamu). Každý sloupec má určen datový typ. Datových typů je omezené množství, typicky 6 nebo víc (např. znak, řetězec, datum, číslo...). Každý atribut (pole) záznamu může uchovávat jedinou hodnotu. Vztahy nejsou explicitní, ale spíše plynou z hodnot ve speciálních polích, tzv. cizí klíče (foreign keys) v jedné tabulce, který se rovná hodnotám v jiné tabulce.
Pohled (view) je podmnožina databáze, která je výsledkem vyhodnocení dotazu. V RDBMS je pohled tabulka. RDBMS využívá SQL pro definici dat, řízení dat a přístupu a získávání dat. Data jsou získávána na základě hodnoty v určitém poli záznamu.
Veškeré zpracováváni je založeno na hodnotách polí záznamů. Záznamy nemají jednotné identifikátory, které jsou neměnné po dobu existence záznamu. Neexistují žádné odkazy z jednoho záznamu na jiný. Vytvoření výsledku je prováděno pod kontrolou kurzoru, který umožňuje uživateli sekvenčně procházet výsledek po jednotlivých záznamech. Totéž platí pro update.
Pro objektové databáze neexistuje žádný oficiální standard. Standardem je de facto kniha Morgana Kaufmana The Object Database Standard: ODMG-V2.0. Důraz ODBMS je na přímou korespondenci mezi následujícími:
Objektové databáze využívají datového modelu, který má objektově orientované aspekty jako třídy s atributy a metodami a integritními omezeními; poskytují objektové identifikátory (OID) pro každou trvalou instanci třídy; podporují zapouzdření (encapsulation); násobnou dědičnost (multiple inheritance) a podporují abstraktní datové typy.
Objektové databáze kombinují prvky objektově orientovaného programování s databázovými schopnostmi. Rozšiřují funkčnost objektových programovacích jazyků (C++, Smalltalk, Java) a poskytují plnou schopnost programování databáze. Datový model aplikace a datový model databáze se ve výsledku hodně shodují a výsledný kód se dá mnohem efektivněji udržovat.
Objektově orientovaný jazyk (C++, Java, Smalltalk) je jazykem jak pro aplikaci, tak i pro databázi. Poskytuje těsný vztah mezi objektem aplikace a uloženým objektem. Názorně je to vidět v definici a manipulaci s daty a v dotazech.
V RDBMS rozumíme dotazovacím jazykem vytváření, přístup a aktualizaci objektů, ale v ODBMS, ačkoliv je to stále možné, je toto prováděno přímo pomocí objektového jazyka (C++, Java, Smalltalk) využitím jeho vlastní syntaxe. Navíc každý objekt v systému automaticky obdrží identifikátor (OID), který je jednoznačný a neměnný během existence objektu. Objekt může mít buď vlastni OID, nebo může ukazovat na jiný objekt.
"Rozšířená relační" a "objektově-relační" jsou synonyma pro databázové systémy, které se snaží sjednotit rysy jak relačních, tak objektových databází. ORDBMS je specifikována v rozšíření SQL standardu SQL3. Do této kategorie patří např. Informix, IBM, Oracle a Unisys.
ORDBMS využívají datový model tak, že "přidávají objektovost do tabulek". Všechny trvalé informace jsou stále v tabulkách, ale některé položky mohou mít bohatší datovou strukturu, nazývanou abstraktní datové typy (ADT). ADT je datový typ, který vznikne zkombinováním základních datových typů. Podpora ADT je atraktivní, protože operace a funkce asociované s novými datovými typy mohou být použity k indexování, ukládání a získávání záznamů na základě obsahu nového datového typu. ORDBMS jsou nadmnožinou RDBMS a pokud nevyužijeme žádné objektové rozšíření jsou ekvivalentní SQL2. Proto má omezenou podporu dědičnosti, polymorfismu, referencí a integrace s programovacím jazykem.
ORDBMS podporuje rozšířenou verzi SQL SQL3. Důvodem je podpora objektů (tj. dotazy obsahující atributy objektů). Typická rozšíření zahrnují dotazy obsahující vnořené objekty, atributy, abstraktní datové typy a použití metod. ORDBMS je stále relační, protože data jsou uložena v řádcích a sloupcích tabulek a SQL, včetně zmíněných rozšíření, pracuje právě s nimi.
Jazyk SQL s rozšířením pro přístup k ADT je stále hlavním rozhraním pro práci s databází. Příma podpora objektových jazyků stále chybí, což nutí programátory k překladu mezi objekty a tabulkami.
Nyní se pokusíme srovnat relační a objektové databáze z hlediska programování a vývoje aplikací v objektově orientovaných jazycích.
Relační databázové systémy jsou dobré pro řízení velkého množství dat; objektově orientované programovací jazyky ve vyjadřování složitých vztahů mezi objekty. RDBMS jsou dobré pro vyhledávání dat, ale poskytují nízkou podporu pro manipulaci s nimi; objektově orientované programovací jazyky jsou výborné při manipulaci s daty, ale poskytují malou nebo žádnou podporu pro neměnnost a vyhledávání dat. Bohužel, vzhledem k tomu, že tyto přístupy jsou protichůdné, je jejich skloubení poněkud komplikované.
Objektově orientovaný model tedy poskytuje základní vlastnosti objektů zapouzdření, dědičnost a polymorfismus. Navíc má každý objekt jednoznačnou identifikaci, která umožňuje používání referencí. Naproti tomu RDBMS poskytují vlastnosti, které OO programovací jazyky nemají, jako např. rychlé vyhledávání, sdílení objektů mezi programy, propracovaný systém oprav chyb pro databázové operace, trvalé uložení, atd.
Existují několik různých obecných přístupů, jak skloubit relační databázový systém s objektovým programováním. Buď se pokusíme vymodelovat databázi v objektově orientovaném programu, nebo se můžeme pokusit vymodelovat aplikaci v databázi, nebo se můžeme pokusit zjednodušit přístup k databázi tak, že problémy už nebudou tak závažné.
První případ znamená vybudovat OO aplikaci kolem relačního model. Musíme ošetřít veškeré manipulace s daty a v každé třídě všechno zvlášť naprogramovat. Tato práce je většinou netriviální problém. Ve druhém případě se snažíme zobrazit objektový model do relační databáze, což je ještě složitější než první případ, protože relační databáze je velice omezená a spoustu věcí v ní nemůžeme provést přímo (např. dědičnost, ukazatele, polymorfismus). Pokud naše aplikace využívá pouze jednoduchých datových typů a nemáme hodně vztahů, můžeme využít třetí způsob, tedy pouze řádkově orientovaný přístup k databázi. Toto nám ohromně usnadní práci.
Skutečná objektová databáze podporuje všechny vlastnosti nutné k práci s objekty, tedy:
Srovnání databázových systemů |
|||
Kriterium | RDBMS | ORDBMS | ODBMS |
Definovaný standard | SQL2 (ANSI X3H2) | SQL3/4 (in process) | ODMG-V2.0 |
Podpora pro objektově orientované programování | Špatná; programátoří stráví 25% času kódování mapováním objektového programu do databáze | Omezená hlavně na nové datové typy | Přímá a rozsáhlá |
Jednoduchost používání | Strukturám tabulky je jednoduché porozumět; mnoho dostupných nástrojů pro koncové uživatele | Totéž co RDBMS, navíc s nějakými matoucími rozšířeními | OK pro programátory; nějaký SQL přístup pro koncové uživatele |
Jednoduchost vývoje | Poskytuje nezávislost dat z aplikace, dobrá pro jednoduché vztahy | Poskytuje nezávislost dat z aplikace, dobrá pro jednoduché vztahy | Objekty jsou přirozenou cestou k modelu; může vyhovět širokým rozsahem typů a vztahů |
Rozšiřitelnost a obsah | Žádná | Omezená hlavně na nové datové typy | Může pracovat s libovolnou složitostí; uživatelé mohou psát metody a jakékoliv struktury |
Složité datové vztahy | Pro model obtížné | Pro model obtížné | Může pracovat s libovolnou složitostí; uživatelé mohou psát metody a jakékoliv struktury |
Výkon versus spolupracovatelnost | Úroveň bezpečnosti se mění s dodavatelem, je třeba vzájemně porovnat; dosáhnutí obého vyžaduje rozsáhlé testování | Úroveň bezpečnosti se mění s dodavatelem, je třeba vzájemně porovnat; dosáhnutí obého vyžaduje rozsáhlé testování | Úroveň bezpečnosti se mění s dodavatelem; většina ODBMSs dovoluje programátorům rozšířit funkčnost DBMS definováním nových tříd |
Distribuce, replikace, a spojené databáze | Rozsáhlá | Rozsáhlá | Podle dodavatele; pár jich poskytuje rozsáhlou podporu |
Vyspělost produktu | Velmi vyspělé | Nezralé; rozšíření jsou nová, stále se definují a jsou relativně neprozkoušená | Relativně vyspělé |
Podpora pro lidi a univerzálnost SQL | Široká podpora nástrojů a trénovaných vývojářů | Může využívat výhod nástrojů RDBMS a vývojářů | Vybaveno SQL, ale určeno pro objektově orientované programování. |
Softwarové ekosystémy | Poskytováno hlavními RDBMS společnostmi | Poskytováno hlavními RDBMS společnostmi | ODBMS výrobci začínají emulovat RDBMS výrobce, ale žádný nenabízí velký obchod jiným ISV |
Životaschopnost výrobce | Očekávaná pro hlavní zaběhnuté RDBMS výrobce | Očekávaná pro hlavní RDBMS výrobce; UniSQL bojuje | Menší než se čekalo; stále se očekává zmenšování |
Zdroj: International Data Corporation, 1997 |
Relační model je jednoduchý a elegantní, ale je naprosto rozdílný od objektového modelu. Relační databáze nejsou navrhovány pro ukládání objektů a naprogramování rozhraní pro ukládání objektů v databázi je velmi složité. Relační databázové systémy jsou dobré pro řízení velkého množství dat, vyhledávání dat, ale poskytují nízkou podporu pro manipulaci s nimi. Jsou založeny na dvourozměrných tabulkách a vztahy mezi daty jsou vyjadřovány porovnáváním hodnot v nich uložených. Jazyky jako SQL umožňují tabulky propojit za běhu, aby vyjádřily vztah mezi daty.
Naproti tomu objektově orientovaný model je založen na objektech, což jsou struktury, které kombinují daný kód a data. Objektové databázové systémy umožňují využití hostitelského objektového jazyka jako je třeba C++, Java, nebo Smalltalk přímo na objekty "v databázi"; tj. místo věčného přeskakování mezi jazykem aplikace (např. C) a dotazovacím jazykem (např. SQL) může programátor jednoduše používat objektový jazyk k vytváření a přístupu k metodám. Krátce řečeno, ODBMS jsou výborné pro manipulaci s daty. Pokud navíc opomeneme programátorskou stránku, dá se říct, že některé typy dotazů jsou efektivnější než v RDBMS díky dědičnosti a referencím.
Object-Oriented Database
Design: What is the Difference with
Relational Database Design
The Object Database Management Group standard ODMG-V2.0
Object database vs. object relational database
Object oriented databases
A Comparison Between Relational and Object Oriented Databases
OO vs. RDBS resources
Srovnani OO databazi O2, Objectivity, ObjectStore a Versant