Mapping OO ontwerp naar DB Optimaliseren van DB ontwerp (normalisatie, indexeren, enz) H10:...
-
Upload
tania-peters -
Category
Documents
-
view
214 -
download
0
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
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( ….)
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