Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10:...

Post on 04-Jun-2015

214 views 0 download

Transcript of Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10:...

• Mapping OO ontwerp naar DB• Optimaliseren van DB ontwerp (normalisatie, indexeren, enz)

H10: PersistentieMSO, 2e deel: Ontwikkeling

Persistentie

Org. term: “persistence”, to pesist te blijven bestaan.

Een applicatie kan ineens crashen (bugs, stroom uitval, enz).

Je wil je data redden!

Persistentie onderdeel van je applicatie die data op een permanente medium opslaat. FilesDatabase

2

Hoe belangrijk ?

Erg belangrijk in een bedrijfsapplicatie zijn data vaak erg waardevol.

Omdat je app kan op ieder moment crashen, in de praktijk wordt data vaak na iedere “save/submit” van de klant ook direct in de db opgeslagen.

3

Uitdaging

4

Betrouwbaargeen data verlies of stukbackup, rollback

Prestatie (performance) snel je data te kunnen querien / updaten

Concurrentie apps met meerdere cliënten zijn nu gewoon.

Concurrentie ACID transacties

5

“Atomic” een transactie wordt nooit half uitgevoerd (volledig of helemaal niet).

“Consistent” een transactie die de DB’s constraints zou breken wordt geweigerd.

“ge-Isoleerd” tussen toestanden van een transactie zijn niet door andere transacties zichtbaar.

“Durabel” als een transactie voltooit, effect op DB is persistent.

File vs DB

6

Filegoedkoopminder boilerplateje zou rollback, query, concurrentie, enz zelf moeten

programmeren (voor zover nodig)geschikt voor kleine apps

DB andersom

Relationeel DB

7

Meest gebruikte DB relationeel bewezen technologie.

In wiskunde, een relatie R : A×B×C is een verzameling van tupels uit A×B×C zoals:

{ (a1,b1,c1), (a2,b2,c2) }

Een tabel is een relatie:A B C

a1 b1 c1

a2 b2 c2

Typische architectuur

8

Presentatie (User Interface) laag

Bedrijfslogica (Probleemdomein /PD )

laag

Persistentie (Data Access

Management / DAM) laag

DB

Klant Product*bestelt

OrderNr KlantID Naam Staat Tax

239 1035 Black MD 0.05

241 1123 William CA 0.08

290 1123 William CA 0.08

237 2242 Berry DC 0.06

234 2242 Berry DC 0.06

save, load, query

Impendance mismatch…

9

Je ontwerpt met UML, en implementeert in een OO taal.

Echter, de meeste DB technologieën zijn relationeel.Data zijn in tabellen georganiseerd.Geen direct ondersteuning voor het opslaan van

objecten.

Oplossing ?Zelf de mapping implementeren ? veel werk!Object-relationele DBOO DBMapping frameworks

Entity Relationship (ER) Diagram

10

KlantID {PK}NaamLeeftijd

ProductID {PK}NaamPrijs

*bestelt

ID Naam Leeftijd

10 Bob 6

11 Patrick 7

Klant

ID Naam Prijs

1 Appel 10

2 Peer 15

Product

KlantID ProdID

10 1

11 1

11 2

Bestelling

ERD en klasse diagram

11

KlantNaamLeeftijd

ProductNaamPrijs

*bestelt

KlantID {PK}NaamLeeftijd

ProductID {PK}NaamPrijs

*bestelt

• Impliciet ID• Navigatie

• Expliciet PK• Geen concept van navigatie

ERD en klasse diagram

12

AutoBouwjaar

ProductNaamPrijs

AutoID {PK}Bouwjaar

ProductID {PK}NaamPrijs

0..1

is extensie van traditioneel ERD kent geen inheritence.

AutoNaam = “Toyota”Prijs = 2000 €Bouwjaar = 2000

1

ID Naam Prijs

1 Appel 10

2 Totoya 2000

3 Toyota 5000

ProductID Bouwjaar

200 2000

210 2004AutoID ProdID

200 2

210 3

Auto_Product

Auto

Nog meer vraagstukken…

13

PersoonNaam = “Bob”Leeftijd = 6

ID Naam Leeftijd

10 Bob 6

11 Octo 7

PersoonNaam = “Octo”Leeftijd = 7Vrienden

Persoon

Persoon

Persoon

• Hoe sla je een complexe object “Octo” op in tabellen ? Hoe haal je het terug?

• Navigatie door objecten vs relationele query.

• Hoe zit het met object encapsulatie?

Zelf doen…

14

PersoonNaam

heeft vrienden

*

PersoonNaam = “Octo”Vrienden

Persoon

Persoon

PersoonDAOfind(id) : Persooninsert(persoon)getVrienden(id) : Collection<Persoon>

DB

*

Zelf doen…

15

PersoonNaam = “Octo”Vrienden

Persoon

Persoon

PersoonDAOfind(id) : Student insert(persoon)getVrienden(id) : Collection<Persoon>

DB

find(id) { qry = “select * from PERSOON where ID = ” + id result = connection.executeQry(qry) return new Persoon(result.getString(“Naam”)) }

geef een plat object terug!

Navigatie nu indirect via deze.

Object-Relationele DB / ORDB

16

CREATE TYPE Klant UNDER Persoon( lidnr INT)

CREATE TYPE Persoon AS OBJECT ( Naam CHAR(20) Vrienden SET (REF Persoon) )

CREATE TABLE PERSOON OF TYPE Persoon

INSERT INTO PERSOON VALUES (Klant (“Bob", 123, 10))

SELECT p.Vrienden FROM Persoon p WHERE p.Naam = “Bob

wishnu
Subclassing
wishnu
We hebben ook references; laat navigatie toe! Zoals in auto.eigenaar.vrienden.

Object-Relationele DB / ORDB

Relationele DB, uitgebreid met OO concepten:User Defined Type classInheritenceREF object IDIngebouwde navigatie auto.eigenaar.vriendenSET (van REFs) to represent navigable OO one-to-

manyZoals in SQL 1999Producten: Oracle, PostgreSQL

Niet native in bijvb. Java. Je zou je DAO nog steeds zelf moeten bouwen…maar minder ingewikkeld.

17

Java Persistence Architecture / JPA

javax.jpa, implementatie: Apache OpenJPAEntity manager gratis DAO

Je moet nog een “mapping” specificeren…

18

EntityManager em = get …

em.getTransaction().begin()

em.find(Persoon.class, 20)

em.persist(bob)

em.getTransaction().commit()

Object-Relationeel Mapping /ORMIn welke tabel sla je objecten van klasse C op ?In welke kolommen sla je de attributen van je object?

19

@Entity@Table(name=“PERSOON”)class Persoon {

@Id @Column(name=“ID”) private int id @Column(name=“NAAM”) private String naam

@ManyToMany private Collection<Persoon> vrienden ….

getId() { return id }getNaam() { return naam }getVrienden() { return vrienden }

@JoinTable( ….)

wishnu
@Id --> om aan te geven dat deze atribuut een Primary Key is

ORM …

Je moet ook nog een persistence descriptor maken. In een XML bestand, specificeer:Waar is je implementatie van EntityManager?Waar is de DB, hoe maak je verbinding met DB?Welke klassen neem je mee in de O/R mapping?

Nog steeds gedoe, maar je hebt nu veel minder boiler plate…

Vergelijkbaar technologie: ‘ORM framework’ zoals Hibernate.

20

OO DB

Zoals DB4OEr is geen relationele mappingObjecten zijn ‘direct’opgeslagen.

21

PersoonNaam = “Octo”Vrienden

Persoon

Persoon

ID Naam Prijs

1 Appel 10

2 Peer 15

ID Naam Leeftijd

10 Bob 6

11 Patrick 7

OO DB

Code is schoner :

OODB of RDB? Coding overhead is belangrijk, maar er zit nog meer … - later.

22

db = Db4o.openFile(“MijnOODB”)

db.get(new Persoon(0,”Bob”))db.set(octo)

List <Persoon> result = db.query( …. p.leeftijd >= 5)

db.close()

native query in Java … goed of slecht ?

Terug: OODB of RDB ?

Medische historie van een persoon wat willen we zien?Adres, lijst van klachten, lijst van voorgeschreven

medicijnen.lijst of tabel achtige informatie makkelijk met een joint op

RDB.

Je wil een rijke structuur OO, of ORDB

23

historie

klacht klacht klacht

arts

aantekening

medicijn

medicijn

OODB of RDB ?

Recursieve navigatie …

Je moet complexe objecten persisten, je doet veel navigatie OODB is beter en sneller.

Platte objecten, je doet vaak query op basis van data-domein (ipv navigatie) RDB

24

PersoonNaam = “Octo”Vrienden

Persoon

Persoon

geef alle vrienden van vrienden van x

ORDB vs OODB

ORDB Eigen (uitgebreid) query taal (SQL)ondersteunt zowel navigatie en SQL query

OODBZoals in DB40:

geen abstracte query taalIntegreert goed met Java

Voorstellen voor query taal: Xpath, CTL

25

Verbeteringen op je ontwerp

Op je db-schema: normalisatie en de-normalisatie

Op fysieke dataontwerp : indexing en clustering

26

ID Naam Prod ProdNaam

1035 Bob 555 Appel

1123 Patrick 444 Peer

2242 Octo 111 Aardbei

444 Peer

Data redundatie niet zuinig, en leid ook tot problemen en anomalieën.

Normalisatie

Transformatie op je tabellen om data redundantie te minimaliseren geen informatie verlies!

1NF .. 3NF

27

ID Naam Prod ProdNaam

1035 Bob 555 Appel

1123 Patrick 444 Peer

2242 Octo 111 Aardbei

444 Peer

1NF : geen herhalende groepen, en heeft een primaire sleutel.

leidt tot problemen met query en joint.

Identificeer attribuut-afhankelijkheden

In een tabel T,

A,BC

(de combo van attributen A,B bepaalt C) als aan de hand van de waarden van A en B kunnen we de waarde van C in T bepalen.

28

ID Naam Prod ProdNaam

1035 Bob 555 Appel

1123 Patrick 444 Peer

2242 Octo 111 Aardbei

2242 Octo 444 Peer

Partiële afhankelijkheid redundantie.

2NF

2NF: 1NF en de tabel bevat geen partiële afhankelijkheid.

29

ID Naam Prod ProdNaam

ID Naam ID Naam

555 Appel

444 Peer

ID ProdID

Tabel BESTELLING

Tabel PERSOON Tabel BESTELLING

Tabel PRODUCT

3NF

Transitieve afhankelijkheid A A’B in T (Of, er is A’B waar A’ geen onderdeel is van prim.sleutel) weer redundantie.

3NF: 2NF, en geen trans. afhankelijkheden.

30

ID Naam Stad Prov

0 Bob Utrecht UTR

1 Patrick Utrecht UTR

2 Bob Amsterdam NH

Tabel PERSOON

ID Naam Stad

Stad Prov

Utrecht UTR

Amsterdam NHTabel PERSOONTabel STAD

Denormalisatie

Als je app vaak naar de stad en prov van persoon x vraagt moet je nu eerst een join doen.

Denormalisatie zet het terug naar 2NF.

Overweeg de tradeoff tussen query snelheid en anomalieën tgv redundantie.

31

ID Naam Stad Stad Prov

Tabel PERSOON Tabel STAD

Fisieke db-ontwerp

Uiteindelijk worden tabellen in fysieke bestanden in H-schijven opgeslagen.

De formaat en technieken van deze bestanden bepalen ook de prestatie.

Je beslist:Welk formaat ? (vb: heap, of met index)Mate van indexatie Wel of niet te clusteren

32

Index

Hoe vind je persoon x in de opslag? de records een voor een aflopen

Aflopen van een index-tabel is veel sneler!33

ID Naam Stad

Tabel PERSOON fysieke opslag

0

10

15

20

ID als index

Secundaire indexen

Je mag ook meerdere indextabellen introduceren…

Trade off :Extra ruimte nodig per indextabelrekentijd overhead bij update en delete

34

ID Naam Stad

Tabel PERSOONmet ID als index Geef de record van persoon x met

naam Bob moet je weer hele tabel aflopen intro “Naam” als index!

Cluster

ID Naam Kind

0 Bob 100

0 Bob 105

0 Bob 107

1 Patrick 0

35

ID Naam PID Kind

Tabel PERSOON Tabel OUDER

App vraagt vaak naar joint van PERSOON en OUDER cluster.

cluster sleutel

cluster block,kan geindexeerd

Cluster

niet goed als je:vaak update/delete doet vaak PERSOON afzonderlijk moet aflopen

36

ID Naam Kind

0 Bob 100

0 Bob 105

0 Bob 107

1 Patrick 0

Ruimte estimatie

Hoeveel ruimte heb ik nodig medebepalend voor keuze DB engine en hardware.

Kijk ook vooruit!Stappen (met een voorbeeld)

tabel BESTELLING, 1M records

groei 15% per jaar 2M in 5 jaar tijd.

Gemiddelde ruimteverbruik per rij, of maak een schatting:ID VARCHAR(10) 10 bytesNaam VARCHAR(100) 50 bytes…Totaal 200 bytes

37

Ruimte estimatie

Totaal voor tabel BESTELLING 200 * 2M bytes

Bereken ruimte overhead van indextabellenStel ID, en Postcode als indexenIn de orde van d*2M per indextabel

Andere overhead DB engine specifiek

Doe dit voor de rest van tabellen.

38