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

38
Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling

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

Page 1: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

H10: PersistentieMSO, 2e deel: Ontwikkeling

Page 2: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e 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

Page 3: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 4: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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.

Page 5: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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.

Page 6: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

File vs DB

6

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

programmeren (voor zover nodig)geschikt voor kleine apps

DB andersom

Page 7: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 8: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 9: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 10: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 11: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

ERD en klasse diagram

11

KlantNaamLeeftijd

ProductNaamPrijs

*bestelt

KlantID {PK}NaamLeeftijd

ProductID {PK}NaamPrijs

*bestelt

• Impliciet ID• Navigatie

• Expliciet PK• Geen concept van navigatie

Page 12: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 13: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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?

Page 14: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

Zelf doen…

14

PersoonNaam

heeft vrienden

*

PersoonNaam = “Octo”Vrienden

Persoon

Persoon

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

DB

*

Page 15: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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.

Page 16: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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.
Page 17: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 18: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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()

Page 19: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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
Page 20: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 21: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 22: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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 ?

Page 23: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 24: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 25: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 26: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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.

Page 27: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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.

Page 28: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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.

Page 29: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 30: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 31: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 32: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 33: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 34: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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!

Page 35: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 36: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 37: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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

Page 38: Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10: Persistentie MSO, 2 e deel: Ontwikkeling.

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