Objektově relační mapování - ORM
Obsah Co je to ORM Využití ORM Dědičnost –jednoduchý příklad –metody jak dědičnost popsat pomocí relační databáze Vztahy mezi objekty –1:1, M:1, 1:M, M:N Strategie výběru objektu
Co je to ORM? Programovací technika – zajišťuje automatickou konverzi dat mezi rel. databází a OOP Vývoj aplikace – zachytit realitu – objekty aplikace = entity, v databázi entita = řádek/množina řádků tabulky, v OOP entita = instance třídy Tato rozdílná reprezentace vedla ke vzniku ORM
Využití ORM Technika se snaží dát unifikovaný přístup k libovol. objektu, se kterým v aplikaci pracujeme – vývojář odstíněn od práce s SQL dotazy Usnadnění provádění CRUD operací Zajištění perzistentního uchovávání dat Automatická konverze rozdílných datových typů mezi dat. systémem a prog. jazykem Řešení objektové dědičnosti
Využití ORM Hlavní cíl – synchronizace mezi používanými objekty v aplikaci a jejich reprezentací v datab. systému pro zajištění perzistence dat Řada implementací ORM – snaha odstínit vývojáře od psaní SQL dotazů + selekce objektů pomocí obj. přístupu – objektový dotazovací jazyk Výhoda nezávislosti aplikace na dat. systému
Dědičnost Možnost vytvoření hierarchické struktury tříd Relační databáze nepodporují –nutnost transformovat do struktury tabulek a vztahů mezi nimi
Dědičnost Jednoduchý příklad
Dědičnost Metody Jak dědičnost popsat pomocí relační databáze –Celá třída do jedné tabulky –Třída do jedné tabulky –Mapování hierarchie tříd do jedné tabulky
Metody Celá třída do jedné tabulky Pro každou třídu samostatná tabulka V tabulce jsou pak dostupné všechny položky –položky této třídy –položky zděděné z ostatních tříd
Celá třída do jedné tabulky Jednoduchý příklad –Třída Person nejvyšší v hierarchii dědičnosti –Definovány sloupce pro id, name a –V tabulkách popisující potomky definujeme také PK + sloupce z předka + nově definované sloupce
Celá třída do jedné tabulky Výhodou jednoduchý přístup k jednomu dat. objektu nebo více stejného typu Nevýhodou složitost údržby dat. schématu –Při úpravě rodičovské třídy musíme upravit databázové tabulky odp. této třídě –Nutnost také upravit tabulky, na které se mapují třídy dědící z upravené PK v tabulkách na sobě nezávisí –Je možné mít stejnou hodnotu klíče ve dvou tabulkách, ale klíč by měl být jedinečný v celé hierarchii tříd
Metody Třída do jedné tabulky Do jedné tabulky nemusíme mapovat všechny položky třídy - jen nově zavedené Tabulka odp. třídě obsahuje jen sloupce, na které se mapují položky deklarované v této třídě Mapování nejlépe odpovídá struktuře tříd v Javě
Třída do jedné tabulky Jednoduchý příklad –Vkládáním instance třídy Person - * záznam do tabulky Person_tabConcr –Vkládáním instance typu Employee - * záznam v obou tabulkách person_tabConcr i Employee_tabConcr –V tomto případě speciální požadavky na PK –V tabulce pro třídu na vrcholu hierarchie vytvoříme PK, v tabulkách pro potomky je složitější situace – PK je zároveň FK odkazující na předka
Třída do jedné tabulky Data jednoho objektu uložena ve více tabulkách – může zpomalit rychlost přístupu Pro ORM nástroj podporující formu líného načítání to může být efektivní
Metody Mapování hierarchie tříd do jedné tabulky Celou hierarchii lze namapovat do jedné tabulky V tomto případě nutné vložit do tabulky sloupce popisující položky ve všech podtřídách Z řádků pak není ihned zřejmé, kterou třídu popisují – vhodné zavést sloupec s id konkrétní třídy mapované na tento řádek
Mapování hierarchie tříd do jedné tabulky Příklad
Mapování hierarchie tříd do jedné tabulky V nevyužitých sloupcích bývá NULL Integritní omezení musíme napsat tak, abychom rozlišovali, zda je hodnota NULL skutečnou uloženou hodnotou nebo je takto nastavena proto, že se tyto v aktuálně ukládané třídě nepoužívají Výhoda – všechny položky v jedné tabulce – není třeba průchodu všech tabulek
Vztahy mezi objekty Základní prvek, který musí ORM podporovat Zajímá nás dvě základní vlastnosti –násobnost a směrovost Násobnost vztahu –popis ke kolika objektům se entita odkazuje (1:1, M:1, 1:M, M:N) Směrovost vztahů –jednosměrný a obousměrný vztah
Vztahy mezi objekty Vlastnící a inverzní strana vazby –při mapování vztahů obvykle jedna tabulka se sloupci obsahující odkaz do druhé tabulky –tabulka obsahující sloupec s cizím klíčen = vlastník vazby –tabulka na druhé straně = inverzní strana vazby
Vztah M:1 a 1:M Vztah many-to-one –nejjednodušší druh vztahu –z entity se odkazujeme na jednu entitu –z objednávky se můžeme dostat k zákazníkovi –na jednoho zákazníka se může odkazovat více objednávek –ve třídě Order – jednosměrný vztah M:1 –spojíme-li M:1/1:M vytvoříme obousměrný vztah
Vztah M:1 a 1:M Třída v Javě
Vztah 1:1 Vztah one-to-one –popisuje jednoduchý vztah mezi dvěma objekty –dvě možnosti mapování Mapování pomocí cizího klíče –možnost popisu vztahu 1:1 – speciální případ M:1 –v případě M:1 může být entita odkazována více entitami, v případě 1:1 může být pouze jednou entitou –do FK, který popisuje mapování, stačí přidat omezení, které zaručí jedinečnost => vznik 1:1 –Chceme-li vytvořit objekt, který neodkazuje na druhý objekt, databáze musí umožnit uložit více řádků s hodnotou NULL ve sloupci, který má být jedinečný
Vztah 1:1 Mapování pomocí primárního klíče –druhá možnost = mapování pomocí sdíleného PK –objekty s vazbami mezi sebou mají stejnou hodnotu PK –v tomto případě nemůžeme mezi dvěma třídami vytvořit dvě různé vazby 1:1 –vazba není popsána pomocí sloupce s FK, ale pomocí sdílení hodnoty PK => takto definovanou vazbu mezi 2 tabulkami můžeme mít jen jednou –chceme-li více vazeb – nutno využít předchozí způsob pomocí FK
Vztah M:N –nejobecnější –popisuje situaci, kdy na obou stranách vazby může být více položek –například student (Student) může pracovat na několika projektech (Project) –každý projekt může řešit více studentů
Vztah M:N Popis situace –tato def. vazba vypadá stejně jako vazba 1:M –rozdíl je ve významu této vazby ve způsobu realizace v rel. databázi –v případě vazby M:N musíme zavést novou tabulku popisující tuto vazbu –bude obsahovat odkaz do tabulky pro třídu Student a Project – takto jsme definovali jednosměrnou vazbu M:N
Vztah M:N Popis situace –chceme-li vytvořit obousměrnou vazbu M:N, přidáme odkaz na studenty do třídy popisující projekty
Strategie výběru objektu obecný problém u ORM nástrojů jako je Hibernate spočívá v ef. přístupu k rel. datům získávání objektů mnoha přístupy do databáze je nepřípustné –nejefektivnější přístup = získávání dat v podobě objektového grafu –efektivnost výběru dat pak můžeme řídit pomocí nastavení vlastností a asociací v metadatech mapování objektů na tabulky nebo vhodné strategie zpracování dotazů přímo za běhu aplikace
Strategie výběru objektu výběr objektů se řídí tzv. strategií výběru Hibernate poskytuje 4 strategie výběru –Okamžitá strategie Asociované objekty jsou vybrány okamžitě pomocí sekvenčního čtení z databáze nebo z cache –Hladová strategie Objekty a kolekce jsou vybrány společně s rodičem pomocí SQL vnějšího spojení (outer join) a další přístupy do databáze nejsou třeba –Líná strategie Objekty a kolekce jsou vybírány líně až při prvním přístupu k nim – tento přístup zapříčiní další dotaz nad databází, pokud hledaná data nejsou v cache –Dávková strategie Dokáže zvýšit výkon líné strategie – získá najednou sadu objektů/kolekcí v případě, že je líné získávání dat aktivováno
Přehled ORM nástrojů Nástroje ORM Java –Hibernate –EclipseLink –MyBatis, apod..NET –Nhibernate –iBatis, apod. PHP –CakePHP –Doctrine –FuelPHP, apod.
Příklad Hibernate Příklad Hibernate Jednoduchý příklad v Javě – pro vytvoření perzistentní pojo – značí atribut mapovaný na id v - sloupec
Příklad Hibernate - pokračování Spouštěcí třída
Příklad Hibernate - pokračování Výsledek v databázi
Děkujeme za pozornost… Zdroj: