MASARYKOVA UNIVERZITA FAKULTA INFORMATIKY
Objektovo-relačné mapovanie a jeho použitie na platforme .NET
DIPLOMOVÁ PRÁCA Tomáš Stach
Brno, 2013
i Prehlásenie
Prehlasujem, že táto diplomová práca je mojím autorským dielom, ktoré som vypracoval samostatne. Všetky zdroje, pramene a literatúru, ktoré som pri vypracovaní používal alebo z nich čerpal, v práci riadne citujem s uvedením úplného odkazu na príslušný zdroj.
Vedúci práce : RNDr. David Sehnal
ii Poďakovanie
Rád by som poďakoval vedúcemu práce RNDr. Davidovi Sehnalovi za jeho podporu a cenné pripomienky a svojim nadriadeným v zamestnaní za zhovievavosť. Poďakovanie si zaslúži aj moja rodina a priateľka za obrovskú dávku trpezlivosti.
iii Zhrnutie
Cieľom tejto práce je zoznámiť čitateľa s objektovo-relačným mapovaním na platforme .NET. Po predstavení relačného a objektového modelovania nasleduje popis problematiky objektovo-relačného mapovania, jeho výhodami, nevýhodami a rozdielmi jeho použitia v programoch voči klasickému dopytovaniu pomocou SQL, resp. využitiu inej ako relačnej databázy. Následne sú niektoré konkrétne najčastejšie používané nástroje predstavené detailne a je porovnaný ich výkon v niekoľkých testoch. Súčasťou práce je testovacia aplikácia, ktorá bola použitá pri porovnávaní a testovaní výkonu jednotlivých nástrojov.
iv Kľúčové slová
Relačná databáza, NoSQL databáza, objektovo-relačné mapovanie, návrhové vzory, platforma .NET, LINQ, Entity Framework
v Obsah
Kapitola 1 Úvod 1 1.1 Formulácia práce ...... 1 1.2 Delenie práce ...... 1 Kapitola 2 Databázy a relačné modelovanie 2 2.1 Pred-relačné databázy ...... 2 2.2 Relačné databázy ...... 3 2.3 Post-relačné databázy ...... 10 Kapitola 3 Objektové modelovanie 14 3.1 Vlastnosti objektu ...... 14 3.2 Modelovanie s objektami ...... 15 3.3 Vzťahy medzi objektami ...... 16 Kapitola 4 Objektovo-relačné mapovanie 19 4.1 Impedance mismatch ...... 19 4.2 Mapovanie objektov na relácie ...... 21 4.3 Princípy fungovania ORM ...... 25 4.4 Výhody použitia ORM ...... 41 4.5 Nevýhody použitia ORM ...... 42 Kapitola 5 Platforma .NET a použité databázy 43 5.1 Platforma .NET ...... 43 5.2 Microsoft SQL Server ...... 50 5.3 RavenDB ...... 51 Kapitola 6 Prehľad ORM nástrojov 52 6.1 Aktívne projekty...... 52 6.2 Neaktívne projekty ...... 56 Kapitola 7 Vybrané ORM nástroje 58 7.1 Entity Framework ...... 58 7.2 LINQ to SQL ...... 66 7.3 NHibernate ...... 70 7.4 LLBLGen Pro ...... 77 Kapitola 8 Testovanie 83 8.1 Testovacia aplikácia ...... 83 8.2 Prostredie ...... 84 8.3 Testy ...... 85 8.4 Vyhodnotenie ...... 95
vi Kapitola 9 Záver 97 Literatúra 99 Prílohy 105 Príloha A: Diagramy databáz ...... 105 Príloha B: Zdrojové kódy testovacích dopytov ...... 107 Príloha C: Elektronické prílohy ...... 131 Príloha D: Namerané výsledky testov ...... 131
vii Kapitola 1 Úvod
Väčšina netriviálnych aplikácií potrebuje nejakým spôsobom uchovávať svoje dáta, v drvivej väčšine prípadov ide o databázu. Už desaťročia sú v praxi najviac nasadzované relačné databázy založené na relačnom modeli. Medzi momentálne najpopulárnejšie programovacie jazyky patrí hlavne Java a C#. [1] Tieto objektovo orientované jazyky sú dlhodobo zaužívané a primárne využívané na vývoj podnikového softvéru a webových aplikácií. Pri ich vývoji treba venovať čas prevodu zložitých dátových typov na jednoduché skalárne typy uchovávané v relačnej databáze. Tento prevod môže programátor vykonať ručne, alebo môže využiť nástroj objektovo- relačné mapovanie, ktorý umožňuje komplexne vyriešiť nesúlad medzi objektovým a relačným modelom. Je nutné určiť mapovanie tried na jednotlivé tabuľky, resp. mapovanie atribútov objektu na stĺpce tabuliek. Následne je programátorovi dovolené pracovať priamo s objektovým modelom namiesto relačnej databázy. Takáto práca s objektami je omnoho pohodlnejšia a efektívnejšia ako práca s navzájom prepojenými riadkami dát. 1.1 Formulácia práce
Text práce je číslovaný a štruktúrovaný obvyklým spôsobom. Prvý výskyt cudzieho, alebo odborného termínu je označený kurzívou. Popisovaná problematika obsahuje množstvo anglických termínov, ktoré sú v prípade možného slovenského ekvivalentu preložené. Originálny anglický názov je uvedený v zátvorke. Niektoré výrazy nie sú lokalizované z dôvodu neexistujúceho (MapReduce ), alebo nevhodného (Session ) prekladu. Ukážky zdrojových kódov a názvy tried, či metód sú odlíšené iným fontom textu. 1.2 Delenie práce
Kapitola 2 popisuje rozdelenie databáz. U relačných sú vysvetlené špecifiká relačného modelovania a problematiky s ním spojenej, záver kapitoly sa týka moderných databázových systémov (NoSQL ). Nasledujúca kapitola 3 predstavuje objekty používané v objektovo orientovanom programovaní. Po zoznámení čitateľa s relačným a objektovým prístupom práca pokračuje kapitolou 4, ktorá predstavuje objektovo-relačné mapovanie, technológiu umožňujúcu prepojiť oba spomínané svety. Sú spomenuté základné pojmy problematiky a návrhové vzory využité pri tvorbe nástrojov spadajúcich do tejto kategórie. V kapitole 5 je popis základných technológii použitých v praktickej časti práce. Kapitoly 6 a 7 sa zaoberajú aktuálnou situáciou objektovo-relačného mapovania na platforme .NET. Niektoré nástroje predstavené v týchto kapitolách sú otestované v aplikácii, ktorá je spolu so spôsobom testovania a výsledkami popísaná v kapitole 8. Posledná kapitola 9 obsahuje záver celej problematiky a ponúka názor autora práce.
1 Kapitola 2 Databázy a relačné modelovanie
Pod pojmom databáza si aj človek bez informatického vzdelania dokáže predstaviť skupinu údajov, ktoré sú istým spôsobom štruktúrované. Typickým príkladom môže byť napríklad databáza telefónnych čísiel, či liekov. V oblasti počítačov pojem databáza vyjadruje v princípe to isté: štruktúrovanú kolekciu (množinu) usporiadaných dát využívanú k ukladaniu a získavaniu informácií. Prvé databázové systémy sa objavili pred viac ako piatimi dekádami a za túto dobu prešli veľmi zaujímavým vývojom. Momentálne existuje značné množstvo druhov, najpoužívanejším je jednoznačne relačný typ, ktorému sekundujú databázy typu NoSQL. Táto kapitola uvedie čitateľa do problematiky databáz a podrobnejšie mu vysvetlí princípy na ktorých fungujú aktuálne tieto dva najpoužívanejšie typy. Ďalej sú vysvetlené základy relačného modelovania, ktorých pochopenie je dôležité pri štúdiu objektovo- relačného mapovania v kapitole 4. Dnes sú pokladané za databázový „štandard“ relačné databázy, ktoré sú najviac rozšírené, dostupné, majú za sebou veľmi dlhý vývoj a hlavne sú plne dostačujúce. Vo väčšine prípadov ide o prvý typ databázy s ktorým začínajúci vývojár príde do styku pri bežnej praxi, alebo v škole. Existuje však mnoho iných typov databáz, ktoré nespadajú do kategórie relačných a môžeme ich z časového hľadiska rozdeliť do dvoch skupín: na tie, ktoré vznikli skôr a na tie, ktoré vznikli neskôr, teda na pred-relačné a post-relačné databázy. Pojmy databáza a databázový systém sa často zamieňajú. Databázový systém, resp. Systém riadenia báze dát ( SRBD 1 ) je kolekcia softvéru, ktorá užívateľom umožňuje získavať, vytvárať a modifikovať informácie z databázy. Databáza je len samotný súbor dát. 2.1 Pred-relačné databázy
Prvé databázy vznikli v 60-tych rokoch minulého storočia. Historicky prvou komerčnou bola databáza IMS ( Information Management System ) hierarchického typu od spoločnosti IBM, ukladajúca dáta v stromovej štruktúre. Základnými operáciami bolo vyhľadávanie všetkých potomkov alebo rodiča daného záznamu. Dnes podobnú štruktúru uchovania dát využíva značkovací jazyk XML 2. Nasledovníkom a rozšírením sa stali sieťové databázy zastupované systémom IDMS (Integrated Database Management System ). Na rozdiel od hierarchického modelu, kde každý záznam mal práve jedného rodiča, pri sieťovom modeli môže byť rodičov viac. Toto vylepšenie síce prináša omnoho efektívnejšie a elegantnejšie dopytovanie, ale údržba odkazov medzi uzlami dát je zložitá a náročná. [2], [3]
1 SRBD je z angl. DMBS ( Data Base Management System ). 2 XML ( Extensible Markup Language ) umožňuje popis štruktúry dokumentu, alebo dát. 2 KAPITOLA 2: DATABÁZY A RELAČNÉ MODELOVANIE 2.2 Relačné databázy
Vyvinuli sa z predchádzajúcich typov databáz založených na odkazoch medzi jednotlivými uzlami. Základnú myšlienku relačného modelu dát priniesol v roku 1970 pracovník IBM Edgar Frank Codd v článku s titulom „A Relational Model of Data for Large Shared Data Banks “ [4], kde navrhol nahradiť hierarchický a sieťový model novým modelom založenom na vzťahoch medzi tabuľkami dát. Coddova revolučná myšlienka dokázala prekonať hlavné obmedzenie databáz používaných v tej dobe, ktorým bola nutná znalosť fyzického usporiadania dát. Jeho relačný model popisuje dáta v ich prirodzenom usporiadaní bez akéhokoľvek prekrývania sa s pomocnými dátami určenými počítačovému systému. V článku Codd predstavuje a popisuje koncepty tabuliek, stĺpcov, primárnych a sekundárnych kľúčov, dokonca navrhuje princíp normálnej formy a predstavuje rôzne operácie na množinách vrátane operácie spájania tabuliek ( Join ). [4] Toto bola prvá zmienka o tabuľkách, dopytovacom jazyku a hlavne o relačných databázach, ktoré sa neskôr stali najrozšírenejším spôsobom ukladania dát v počítačových systémoch. [5]
2.2.1 Dvanásť pravidiel relačnej databázy Codd neskôr publikoval dvanásť pravidiel (v skutočnosti trinásť, číslované sú od nuly), ktoré musí databáza spĺňať aby mohla byť nazvaná relačnou: [6] 0. Základné pravidlo ( Foundation Rule ): Relačná databáza musí pri spracovaní dát využívať len svoje relačné schopnosti. 1. Pravidlo informácií (Information Rule ): Všetky informácie v databáze sú reprezentované len ako hodnoty v tabuľkách. 2. Pravidlo garantovaného prístupu ( Guaranteed Access Rule ): Všetky dáta v databáze sú logicky prístupné kombináciou názvu tabuľky, hodnoty primárneho kľúča a názvu stĺpca. 3. Systematické zachádzanie s hodnotami typu null (Systematic Treatment of Null Values ): Hodnotou typu null (inou ako prázdny textový reťazec) je reprezentovaná chýbajúca informácia akéhokoľvek dátového typu. 4. Dynamický on-line katalóg založený na relačnom modeli (Dynamic On-line Catalog Based on the Relational Model ): Popis databáze je logicky reprezentovaný rovnako ako dáta, takže užívatelia s oprávnením môžu využiť rovnaký dopytovací jazyk, aký používajú pri práci s bežnými dátami. 5. Pravidlo súhrnného dátového pod-jazyka (Comprehensive Data Sublanguage Rule ): Relačný systém môže podporovať viacero jazykov. Vždy však musí jestvovať najmenej jeden jazyk s dobre definovanou syntaxou podporujúcou definovanie dát, definovanie pohľadov, manipuláciu s dátami, integritu obmedzení, oprávnenia a transakcie.
3 KAPITOLA 2: DATABÁZY A RELAČNÉ MODELOVANIE 6. Pravidlo aktualizácie pohľadu ( View Updating Rule ): Každý teoreticky aktualizovateľný pohľad musí byť systémom naozaj aktualizovateľný. 7. Vysokoúrovňové vkladanie, zmeny a mazanie ( High-level Insert, Update, and Delete ): Schopnosť databáze zachovávať relačné pravidlá nielen pri dopytovaní, ale aj pri vkladaní, zmene a mazaní dát. 8. Nezávislosť fyzických dát ( Physical Data Independence ): Aplikačná vrstva a spôsob akým sú dáta používané sú nezávislé od spôsobu uloženia dát na fyzickej vrstve. 9. Nezávislosť logických dát ( Logical Data Independence ): Zmena na aplikačnej vrstve nevyžaduje zmenu vo fyzickom uložení dát. 10. Pravidlo nezávislosti integrity ( Integrity Independence Rule ): Obmedzenia integrity musia byť definované v pod-jazyku databázy, uložené v jej katalógu a nie v aplikácii. 11. Pravidlo nezávislosti rozmiestnenia ( Distribution Independance Rule ): Rozmiestnenie časti databáze na rôzne miesta by malo byť užívateľom neviditeľné. 12. Pravidlo nerozvrátenia (Nonsubversion Rule ): Databázový jazyk nízkej úrovne nemôže obísť obmedzenia integrity vyjadrené jazykom vyššej úrovne. [5] V súčasnosti používané relačné databázy síce klasifikujeme ako relačné, v skutočnosti niektoré body nespĺňajú. Najčastejšie nesplnenými pravidlami sú tretie (zachádzanie s hodnotami typu null), šieste (aktualizácie pohľadov) a deviate pravidlo (nezávislosť logických dát). [7]
2.2.2 Typickí predstavitelia Z hľadiska použitia a umiestnenia môžeme relačné databázy rozdeliť do dvoch skupín:
Desktopové databázy Ide o jednoduché, lokálne databázové systémy bežiace na pracovných staniciach. Medzi najrozšírenejšie patria Microsoft Access a Filemaker Pro. Sú určené pre lokálne ukladanie dát, v obmedzenom rozsahu môžu byť využité vo viac-užívateľskom prostredí. [8]
Serverové databázy Databázový systém beží typicky na serveri a je určený pre obsluhu viacerých užívateľov naraz. Medzi základné vlastnosti patrí vysoký výkon a dostupnosť. Najrozšírenejšou databázou tohoto typu je SQLite s licenciou typu Public domain. Paradoxne je jej hlavným využitím funkcia lokálnej zabudovanej databázy pre webové prehliadače (Mozilla Firefox, Google Chrome), antivírové programy (McAfee Antivirus), mobilné telefóny (Apple iPhone, platforma Google Android) a mnoho ďalších. Využíva sa tiež ako serverová databáza pre internetové stránky menšieho rozsahu (do stotisíc návštev denne). Je to najviac používaná relačná databáza na svete. [9] Do skupiny najrozšírenejších relačných databáz patrí aj MySQL s licenciou GNU GPL a komerčné verzie Microsoft SQL Server (sekcia 5.2) a Oracle Database.
4 KAPITOLA 2: DATABÁZY A RELAČNÉ MODELOVANIE Mimo dlhotrvajúci vývoj, vysokú stabilitu a výkonnosť je hlavnou devízou relačných databáz hlavne matematický aparát relačnej algebry na ktorom sú postavené a kvôli ktorému sú považované za štandard.
2.2.3 Relačná algebra a relačný model Relačnú algebru dostal do širšieho povedomia už spomenutý E. F. Codd. Operandami relačnej algebry sú relácie a ich výsledkom sú tiež relácie. Zjednodušene povedané je možné reláciu reprezentovať dvojrozmernou tabuľkou, ktorá je tvorená riadkami a stĺpcami. Množina riadkov vyjadruje reláciu, jej prvky tvoria usporiadané n-tice. Každý zo stĺpcov musí mať v rámci tabuľky unikátny názov – atribút, ktorý v tabuľke vyjadruje názov stĺpca a patrí určitej doméne. Doména atribútu vyjadruje obor hodnôt, čiže dátový typ. Hodnoty riadkov v príslušných stĺpcoch musia byť tiež tohoto typu.
Relácia Schéma (definícia) relácie sa skladá z troch základných častí: názov relácie, názvy atribútov a špecifikácia jednotlivých domén. Neobsahuje dáta, príklad schémy relácie: Predmety(Kód predmetu:string, Názov predmetu:string, Počet kreditov:integer) Až po pridaní riadkov vzniká inštancia relácie tak, ako ukazuje tabuľka 2.1. Kód Počet Názov predmetu predmetu kreditov PA116 Domain Understanding and Modeling 6 PA179 Project Management and Service Lifecycle 6 PV207 Business Process Management 5 Tabuľka 2.1: Inštancia relácie Predmety Z matematického hľadiska je relácia vzťah medzi skupinou prvkov jednej alebo viacerých množín:
„Nech A, B sú ľubovoľné množiny. Reláciou medzi množinami A, B je ľubovoľná podmnožina karteziánskeho súčinu A × B. Ak je ρ ⊆ A × B relácia a ak sú a ∈ A, b ∈ B prvky také, že (a, b) ∈ ρ, potom hovoríme, že prvok a je v relácii ρ s prvkom b a stručne zapisujeme a ρ b. Ekvivalentným zápisom je (a, b) ∈ ρ.“
Podľa počtu množín sa relácie delia na unárne, binárne, ternárne a n-árne. V relačnej algebre reláciu chápeme ako určitý predikát spravodlivosti Codd pôvodne v roku 1970 definoval nasledujúcich päť základných operácií nad reláciami. V zátvorke sa nachádzajú pôvodné originálne názvy tak, ako sú uvedené v jeho článku [4]. 1. Selekcia (Permutation ) 2. Projekcia ( Projection ) 3. Karteziánsky súčin (Join )
5 KAPITOLA 2: DATABÁZY A RELAČNÉ MODELOVANIE 4. Zjednotenie (Composition ) 5. Rozdiel množín (Restriction ) Neskôr k nim bola pridaná posledná, šiesta operácia premenovanie ( Rename ), ktorú požadovali tvorcovia jazyka ISBL. Všetky ďalšie operácie sa dajú odvodiť z uvedených základných. Je dôležité spomenúť, že žiadna z operácií nemení relácie, ktoré figurujú v pozícii operandu. Návratové hodnoty operácií sú „nové“ relácie. Nasledujúce tabuľky 2.2, 2.3 a 2.4 označujú tri relácie, ktoré budú použité pre bližšie vysvetlenie každej zo základných operácií:
A B C C D E A B C
a1 b1 c1 c1 d1 e1 a3 b3 c3
a2 b2 c2 c2 d2 e2 a4 b4 c4
a3 b3 c3 Tabuľka 2.3: Relácia U Tabuľka 2.4: Relácia V Tabuľka 2.2: Relácia T
Projekcia Symbolom tejto unárnej operácie je „Π“ (pí). Projekcia z tabuľky vyberie len určité
špecifikované stĺpce, takže hodnotou výrazu Π , ,…, (R) je relácia, ktorá obsahuje len stĺpce A ,A ,…,A z R . Napríklad výsledkom výrazu Π , (T) je relácia znázornená v tabuľke 2.5. A C
a1 c1
a2 c2
a3 c3 Tabuľka 2.5: Výsledok projekcie
Selekcia Symbolom tejto unárnej operácie je „σ“ (sigma). Selekcia vyberie podmnožinu záznamov v relácii podľa výberovej podmienky: σ ( )(R) = X | R(X) ∧ C(X)} . Výsledkom výrazu
σ (T) je relácia znázornená v tabuľke 2.6. A B C
a1 b1 c1 Tabuľka 2.6: Výsledok selekcie
Karteziánsky súčin Symbolom tejto binárnej operácie je „ד. Karteziánsky súčin je v relačnej algebre definovaný odlišne od teórie množín, kde vytvára množinu dvojíc. V relačnej algebre karteziánsky súčin spáruje každý riadok prvej tabuľky s každým riadkom tabuľky druhej a vytvára tak n-tice, kde n je súčtom atribútov oboch relácií: