45
1 Dátová vrstva

Dátová vrstva

  • Upload
    slade

  • View
    45

  • Download
    2

Embed Size (px)

DESCRIPTION

Dátová vrstva. Architektúra IS na báze vrstiev. aplikačná vrstva. dátová vrstva. prezentačná vrstva. J2EE kontajner. JSP Servlet XSLT. EJB (session message driven ) servisné Java triedy. WEB browser tenký tučný Java klient. DAO ORM. RDBMS ODBMS XML s ú bory. dátový zdroj. - PowerPoint PPT Presentation

Citation preview

Page 1: Dátová vrstva

1

Dátová vrstva

Page 2: Dátová vrstva

2

Architektúra IS na báze vrstiev

prezentačná vrstva aplikačná vrstva dátová vrstva

prepojenie

na dátový zdroj

dátový zdroj

WEB

browser

tenký

tučný

Java klient

JSP

Servlet

XSLT

EJB

(session

message driven)

servisné Java triedy

DAO

ORM

RDBMS

ODBMS

XML súbory

J2EE kontajner

Page 3: Dátová vrstva

3

Dátová vrstva

• tradičný dátový zdroj – RDBMS• objektový a relačný svet štruktúrujú dáta

rôznym spôsobom

• problémy na riešenie• mapovanie štruktúr (štrukturálne vzory)

identifikovanie entít mapovanie asociácií, dedičnosti, ...

• pripojenie aplikačnej vrstvy k dátovej vrstve (vzory dátového zdroja)

• správanie (vzory správania) riešenie konfliktov pri zápise objektov postupné donačítavanie asociovaných objektov

Page 4: Dátová vrstva

4

Štrukturálne vzory

Page 5: Dátová vrstva

5

Idetity Field – identita objektov

• uloženie databázového ID pola (PK) ako atribút objektu

• požiadavky na Idetity Field • jedinečnosť• nemennosť

• treba zvážiť nasledovné aspekty• umelý vs. prirodzený (rodné číslo, SSN)• jednoduchý vs. zložený (orderID + seqNum)• dátový typ – efektivita => long• table-unique vs. database-unique key

inheritance unique key

Page 6: Dátová vrstva

6

Idetity Field – identita objektov

• tvorba nasledujúcich hodnôt ID• auto generované ID pole databázou

problém so spojenými objektami, transakciami a ohraničeniami

• database counter (Oracle Sequence) neštandardné riešenie

• GUID (Globally Unique IDentifier) veľký reťazec => výkonnostný problém

• key table

Page 7: Dátová vrstva

7

Foreign Key Mapping – N:1

• mapovanie asociácie medzi objektami na referenciu cudzím kľúčom medzi tabuľkami

Page 8: Dátová vrstva

8

Foreign Key Mapping – N:1

Page 9: Dátová vrstva

9

Foreign Key Mapping – 1:N

Page 10: Dátová vrstva

10

Foreign Key Mapping – 1:N

Page 11: Dátová vrstva

11

Association Table Mapping – M:N

• mapovanie asociácie M:N pomocou väzobnej tabuľky

• väzobná tabuľka väčšinou nemá in-memory reprezentáciu => nemá ID

Page 12: Dátová vrstva

12

• väzobná tabuľka väčšinou nemá in-memory reprezentáciu => nemá ID

• použitie• M : N asociácie• asociácie medzi tabuľkami, ktorým nemôžeme

pridať stĺpec

Association Table Mapping – M:N

Page 13: Dátová vrstva

13

Asociácie k N (kolekcie)

• komplikácie pri update• delete a insert• spätný pointer (referencia)• diff kolekcie

• mazanie z kolekcie ?• vymazanie objektu • zrušenie asociácie na objekt,

resp. premiestnenie do inej kolekcie

Page 14: Dátová vrstva

14

Embedded Value

• mapuje závislý objekt do tabuľky vlastníka• použitie

• asociácie s kardinalitou 1 až malý fixný počet• Value Objects• objekty ako pri Serialized LOB z výhodou použitia SQL

Page 15: Dátová vrstva

15

Serialized LOB

• uloženie asociovaného grafu malých objektov v podobe jedného serializovaného objektu

Page 16: Dátová vrstva

16

Serialized LOB

• BLOB – binárny LOB• jednoduché použiť (existencia serializácie grafu

objektov)• graf nie je možné zrekonštruovať bez existencie

zodpovedajúcich objektov (tried) hľadanie (chybných) dát človekom verzionovanie

• CLOB – znakový LOB• horší výkon a väčšie miesto na diskoch• vlastný parser textovej reprezentácie (XML)

• pozor na duplikovanie dát v LOBoch

Page 17: Dátová vrstva

17

Serialized LOB

• použitie• zložitý graf objektov, na ktorý sa referencuje

iba jeho vlastníkom

• výhody• jednoduchšia DB štruktúra• menšie množstvo dát

• nevýhody• nemožno realizovať SQL dotazy na dáta v

LOBoch

Page 18: Dátová vrstva

18

Mapovanie dedičnosti

• RDBMS neposkytujú realizáciu dedenia=> potreba mapovania dedičnosti na relačné

štruktúry

• Tabuľka pre dedenie

• Tabuľka pre každú triedu

• Tabuľka pre konkrétnu triedu

Page 19: Dátová vrstva

19

Tabuľka pre dedenie

idSadzbyplatnostOdplatnostDo

vypocitajPoplatok()

SadzbaPoplatku

sadzba

vypocitajPoplatok()

SadzbaPoplatkuZakladna

minSadzbamaxSadzba

vypocitajPoplatok()

SadzbaPoplatkuOhranicena

sumaOperacieOdsumaOperacieDo

vypocitajPoplatok()

SadzbaPoplatkuHladinova

idSadzbyplatnostOdplatnostDosadzbaminSadzbamaxSadzbasumaOperacieOdsumaOperacieDotyp

«table»SADZBA_POPLATKU

Page 20: Dátová vrstva

20

Tabuľka pre dedenie

• výhody• jednoduchá údržba (jediná tabuľka)• žiadne join-y pri získavaní dát• jednoduchší refactoring

posúvanie atribútov v objektovej hierarchii

• nevýhody• niektoré polia v tabuľke nemajú vždy význam• plytvanie miestom (nepoužité stĺpce)• výkonnostný problém (jedna veľká tabuľka s

množstvom indexov ...)

Page 21: Dátová vrstva

21

Tabuľka pre každú triedu

idSadzbyplatnostOdplatnostDo

vypocitajPoplatok()

SadzbaPoplatku

sadzba

vypocitajPoplatok()

SadzbaPoplatkuZakladna

minSadzbamaxSadzba

vypocitajPoplatok()

SadzbaPoplatkuOhranicena

sumaOperacieOdsumaOperacieDo

vypocitajPoplatok()

SadzbaPoplatkuHladinova

SADZBA

idSadzbyplatnostOdplatnostDo

sadzba

«table»SADZBA_ZAKLADNA

minSadzbamaxSadzba

«table»SADZBA_OHRANICENA

sumaOperacieOdsumaOperacieDo

«table»SADZBA_HLADINOVA

Page 22: Dátová vrstva

22

Tabuľka pre každú triedu

• výhody• OR mapovanie je priamočiare• všetky stĺpce sú relevantné

• nevýhody• informácie o jednom objekte vo viacerých

tabuľkách (veľa join-ov)• refactoring OO hierarchie spôsobuje zmenu

DB• supertype tabuľka môže byť úzke miesto

(často sa používa) - výkonnostný problém

Page 23: Dátová vrstva

23

Tabuľka pre konkrétnu triedu

idSadzbyplatnostOdplatnostDo

vypocitajPoplatok()

SadzbaPoplatku

sadzba

vypocitajPoplatok()

SadzbaPoplatkuZakladna

minSadzbamaxSadzba

vypocitajPoplatok()

SadzbaPoplatkuOhranicena

sumaOperacieOdsumaOperacieDo

vypocitajPoplatok()

SadzbaPoplatkuHladinova

«table»SADZBA_ZAKLADNA

idSadzbyplatnostOdplatnostDosadzba

«table»SADZBA_OHRANICENA

idSadzbyplatnostOdplatnostDosadzbaminSadzbamaxSadzba

«table»SADZBA_HLADINOVA

idSadzbyplatnostOdplatnostDosadzbasumaOperacieOdsumaOperacieDo

Page 24: Dátová vrstva

24

Tabuľka pre konkrétnu triedu

• výhody• každá tabuľka je self-contained (všetky polia využité

a patria k jednému typu objektu)• žiadne join-y pri získavaní objektov konkrétneho typu• dobrá výkonnosť (každá tabuľka pre jednu triedu)

• nevýhody• nemožné realizovať FK mapovanie na abstraktný typ• ťažší refactoring (zmena atribútu v nadtriede =>

zmena všetkých tabuliek)• získanie kolekcie supertriedy vyžaduje viacero

selektov

Page 25: Dátová vrstva

25

Vzory dátového zdroja

Page 26: Dátová vrstva

26

Vzory dátového zdroja

• Table Data Gateway• inštancia obsluhuje všetku funkcionalitu súvisiacu s

jednou tabuľkou

• Row Data Gateway• inštancia zodpovedá jednému riadku tabuľky

(rovnaká štruktúra objektu a DB záznamu)• rieši doménovú logiku a svoju perzistenciu (vzniká

priama závislosť na DB)

• Data Mapper – objektovo-relačné mapovanie (ORM)• transformuje záznam DB na objekt doménového

modelu (transparentne)

Page 27: Dátová vrstva

27

Objektovo-relačné mapovanie

Operacia

idOperaciedatumsumaprotiucetbankaProtiuctu

OperaciaMapovac

najdiOperaciePodlaDatumu()uloz()...()

RDBMS«use»«use»«instantiate»«instantiate»

AbstraktnyMapovac

najdiMnoho(ZdrojePrikazu) : Listnapln(ResultSet) : ListnaplnSpecialne(id, Object) : Object

ZdrojePrikazu

sql() : Stringparametre() : Object[]

NajdiOperacieDatumovo

«use»«use»

«create»«create»

• Data Mapper – dátový mapovač

Page 28: Dátová vrstva

28

Objektovo-relačné mapovanie

Page 29: Dátová vrstva

29

Objektovo-relačné mapovanie

Page 30: Dátová vrstva

30

Objektovo-relačné mapovanie

Page 31: Dátová vrstva

31

Objektovo-relačné mapovanie

Page 32: Dátová vrstva

32

Metadátové OR mapovania

Page 33: Dátová vrstva

33

Metadátové OR mapovania

• výhody• nezávislosť objektového modelu od dátového

zdroja (možnosť použiť aj bez dátového zdroja – testovanie, paralelný vývoj)

• veľká efektívnosť vývoja a údržby

• nevýhody• ťažšie ovplyvniť generované SQL dotazy (dopad

na výkonnosť)

Page 34: Dátová vrstva

34

Vzory správania

Page 35: Dátová vrstva

35

Vzory správania

• Identity Map – Mapa identít• cache načítaných objektov v rámci obchodnej

transakcie (prevencia konfliktov pri zápise) man with two watches never knows what time it is

• Unit of Work – Jednotka práce• čítanie objektov v rámci obchodnej transakcie• koordinácia zápisu zmenených objektov do DB a

riešenie konfliktov v rámci obchodnej transakcie zvyčajne obsahuje Identity Map zvyčajne je súčasťou Data Mappera

• Lazy Load – Lenivé čítanie• transparentné čítanie asociovaných objektov na

požiadanie

Page 36: Dátová vrstva

36

Identity Map

finder anIdentityMap

find(1)

[found is null] found = select where id = 1

found=get(1)

database

[found not null] found

Page 37: Dátová vrstva

37

Unit of Work

klient

operacia

databaza jednotkaPrace

commitcommit

updateupdate

selectselect

nastav stornonastav storno

savesave

newnew

register cleanregister clean

register dirtyregister dirty

Page 38: Dátová vrstva

38

Lazy Load

• optimalizované získavanie grafu objektov• nie je načítaný celý graf, ale je možné ho

transparentne donačítať

• Lazy Initialization• v každej metóde kontrola či je objekt loadnuty• závislosť medzi aplikačnou a databázovou vrstvou

Page 39: Dátová vrstva

39

Lazy Load

• Virtual Proxy• problémy s identitou (proxy sa tvári ako skutočný

objekt ale nie je to on)• pre každý typ treba proxy objekt

Java dynamic proxies, bytecode modification

• vhodné pre kolekcie

• Value Holder• lose of explixitness of strong typing

Page 40: Dátová vrstva

40

Lazy Initialization - príklad

class Supplier... {

public List getProducts() {

if (products == null)

products = Product.findForSupplier(getID());

return products;

}

}

Page 41: Dátová vrstva

41

Virtual Proxy - príklad

class SupplierVL...

private List products;

public interface VirtualListLoader {

List load();

}

class SupplierMapper...

protected DomainObject doLoad(Long id, ResultSet rs) throws SQLException {

String nameArg = rs.getString(2);

SupplierVL result = new SupplierVL(id, nameArg);

result.setProducts(new VirtualList(new ProductLoader(id)));

return result;

}

Page 42: Dátová vrstva

42

Virtual Proxy - príklad

public class VirtualList extends List {

private List source;

private VirtualListLoader loader;

public VirtualList(VirtualListLoader loader) {

this.loader = loader;

}

private List getSource() {

if (source == null) source = loader.load();

return source;

}

public int size() { return getSource().size(); }

public boolean isEmpty() { return getSource().isEmpty(); }

// ...

}

Page 43: Dátová vrstva

43

Value Holder - príklad

class SupplierVH...

private ValueHolder products;

public List getProducts() { return (List) products.getValue(); }

class ValueHolder...

private Object value;

private ValueLoader loader;

public ValueHolder(ValueLoader loader) {

this.loader = loader;

}

public Object getValue() {

if (value == null) value = loader.load();

return value;

}

public interface ValueLoader { Object load(); }

Page 44: Dátová vrstva

44

Value Holder - príklad

class SupplierMapper...

protected DomainObject doLoad(Long id, ResultSet rs) throws SQLException {

String nameArg = rs.getString(2);

SupplierVH result = new SupplierVH(id, nameArg);

result.setProducts(new ValueHolder(new ProductLoader(id)));

return result;

}

public static class ProductLoader implements ValueLoader {

private Long id;

public ProductLoader(Long id) { this.id = id; }

public Object load() {

return ProductMapper.create().findForSupplier(id);

}

}

Page 45: Dátová vrstva

45

Zhrnutie

• používať metadátové mapovanie

• realizácia metadátového mapovania je časovo a odborne náročná

• existujúce OR mapovacie nástroje• okrem riešenia mapovania OO na R štruktúry

riešia aj ostatné popísané problémy Unit of Work + Identity Map Lazy Load optimalizáciu SQL dotazov použitie SQL dialektov pre rôzne RDBMS

• TOPLink, Hibernate, OJB, Torque, iBatis