04.01.2015 Views

Tehnici avansate de programare - Profs.info.uaic.ro

Tehnici avansate de programare - Profs.info.uaic.ro

Tehnici avansate de programare - Profs.info.uaic.ro

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<st<strong>ro</strong>ng>Tehnici</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng><br />

Curs -<br />

Cristian Frăsinaru<br />

acf@<st<strong>ro</strong>ng>info</st<strong>ro</strong>ng>iasi.<strong>ro</strong><br />

Facultatea <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> Informatică<br />

Universitatea ”Al. I. Cuza” Iaşi


Object-SQL Mapping<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.1/7


Cuprins<br />

Sisteme <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> gestiune a bazelor <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date<br />

Mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lul obiectual vs. relaţional<br />

"Impedance mismatch"<br />

Conceptelor mapării<br />

Maparea ierarhiilor <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> clase<br />

Maparea relaţiilor<br />

Aspecte legate <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> performanţă<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.2/7


Int<strong>ro</strong>ducere<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.3/7


Aplicaţii pe mai multe nivele<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.4/7


Arhitectura aplicaţiilor<br />

Majoritatea aplicaţiilor sunt structurate pe mai multe<br />

nivele:<br />

Interfaţa cu utilizatorul<br />

Logica aplicaţiei<br />

Persistenţa datelor<br />

O p<strong>ro</strong>iectarea corectă a aplicaţiei trebuie să asigure:<br />

Separare funcţională<br />

Cuplare redusă (Loose Coupling)<br />

Performanţă<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.5/7


Serializarea obiectelor<br />

Transformarea unui obiect într-o formă persistentă din<br />

care să poată fi refăcut ulterior.<br />

Tipuri <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> serializare: binară, XML,....<br />

Avantaje: Mecanism unitar <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> persistenţă, simplitate.<br />

Dezavantaje<br />

Serializarea binară este greu <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> cont<strong>ro</strong>lat la trecerea<br />

<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> la o versiune la alta (serialVerUID) şi foarte<br />

sensibilă la fenomene <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> corupere a datelor.<br />

Algoritmii generali <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> serializare sunt lenţi<br />

(int<strong>ro</strong>specţie).<br />

Nu există soluţii eficiente <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> inte<strong>ro</strong>gare .<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.6/7


Sisteme <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> gestiune a datelor<br />

Relaţional (RDBMS)<br />

Date: tabele - linii, tuple<br />

Performanţă ridicată<br />

Suport teoretic<br />

Lipsa noţiunii <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> părinte<br />

Orientat obiect (ODBMS)<br />

Date: tabele - obiecte<br />

Inte<strong>ro</strong>gare eficientă şi elegantă<br />

P<strong>ro</strong>bleme legate <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> performanţă<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.7/7


Mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>le <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> acces<br />

Table<br />

’I use tables and query them’<br />

Entity (Chen / Yourdon)<br />

entitate = o relaţie bazată pe atribute, contruită pe<br />

baza unei inte<strong>ro</strong>gări<br />

Domain mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>l (Fowler / Evans)<br />

domeniu = mulţime <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> clase<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.8/7


Exemplu<br />

// Perspectiva unui p<strong>ro</strong>gramator OO<br />

public class Person {<br />

public String name;<br />

public float salary;<br />

public Persoana(String name) { ... }<br />

}<br />

Person p = new Person("Ionescu");<br />

save(p);<br />

...<br />

p.setSalary(500);<br />

update(p);<br />

-- Perspectiva unui p<strong>ro</strong>gramator SQL<br />

CREATE TABLE persons (id integer NOT NULL, name varchar(50) NOT NULL,<br />

salary float, PRIMARY KEY(id));<br />

INSERT INTO persons (id, name) VALUES (1, ’Ionescu’);<br />

UPDATE persons SET salary=500 WHERE id=1;<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.9/7


Object-SQL Mapping<br />

Object-Relational Mapping ORM<br />

Tehnică <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> care leagă limbajele <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng><br />

<st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> orientate-obiect <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> baze <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date relaţionale<br />

creînd o bază <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date obiectuală virtuală.<br />

Scopul principal<br />

Separarea p<strong>ro</strong>gramării OO <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng>a SQL.<br />

P<strong>ro</strong>blema principală: "Impedance mismatch"<br />

Dificultăţi referitoare la conectarea a două sisteme care<br />

au baze conceptuale diferite: mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lul obiectual şi<br />

mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lul relaţional.<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.10/7


Nivelul <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> mapare<br />

OO Layer — Mapping Layer – Persistence Layer<br />

Trebuie să asigure persistenţa obiectelor în baza <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date:<br />

Create (→ INSERT)<br />

Person p = new Person(...);<br />

mappingLayer.save(p);<br />

Read (→ SELECT)<br />

Person p = mappingLayer.retrieve(...);<br />

Update (→ UPDATE)<br />

p.setName("Popescu");<br />

mappingLayer.update(p);<br />

Delete (→ DELETE)<br />

mappingLayer.<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lete(p);<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.11/7


Meto<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> implementare<br />

Nivelul <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> mapare trebuie să conţină:<br />

Parte <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>scriptivă:<br />

fişiere <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> mapare, adnotări ale claselor<br />

API (oferit <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>zvoltatorului)<br />

Implementare internă (p<strong>ro</strong>prietară sau standard) <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng><br />

comunicare cu unul sau mai multe tipuri <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> baze <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng><br />

date.<br />

Meto<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> iniţializare:<br />

parametrii <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> conectare, dialectul SQL, etc.<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.12/7


P<strong>ro</strong>bleme<br />

Mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>le <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> reprezentare a datelor diferite:<br />

"Impedance mismatch"<br />

Tipuri <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date<br />

Relaţii<br />

Existenţa unor dialecte SQL multiple<br />

Performanţa<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.13/7


P<strong>ro</strong>bleme: Dialectul SQL<br />

--Sybase<br />

CREATE TABLE persons (id integer NOT NULL DEFAULT autoincrement,<br />

name varchar(50) NOT NULL, "key" integer, PRIMARY KEY(id));<br />

INSERT INTO persons (name, "key") VALUES (’Ionescu’, 100);<br />

--HSQLDB<br />

CREATE TABLE persons (id integer NOT NULL IDENTITY,<br />

name varchar(50) NOT NULL, key integer, PRIMARY KEY (id)<br />

);<br />

INSERT INTO persons (name, key) VALUES (’Ionescu’, 100);<br />

--MySql<br />

CREATE TABLE persons (id integer NOT NULL auto_increment,<br />

name varchar(50) NOT NULL, ‘key’ integer, PRIMARY KEY (id)<br />

) ENGINE = InnoDB ;<br />

INSERT INTO persons (name, ‘key‘) VALUES (’Ionescu’, 100);<br />

--Firebird<br />

...<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.14/7


"Unelte"<br />

Java<br />

Java Persistence API (JPA) - Sun<br />

TopLink - Oracle<br />

Hibernate - JBoss<br />

...<br />

.Net<br />

NHibernate<br />

...<br />

Perl, Python, Ruby, PHP, ...<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.15/7


Conceptele mapării<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.16/7


Noţiuni <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> bază<br />

Mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lul obiectual<br />

Clase, obiecte, p<strong>ro</strong>prietăţi, relaţii <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> moştenire, asociere,<br />

compoziţie, agregare.<br />

Mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lul relaţional<br />

Tabele, tuple, coloane, chei primare, legături (chei<br />

străine), in<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>cşi.<br />

Corespon<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>nţa<br />

Clasa - tabel(e), p<strong>ro</strong>prietate - coloana(e), relaţie - <br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.17/7


Exemplul 1<br />

public class Person {<br />

private int id;<br />

private String name;<br />

private Integer key;<br />

public int getId() { return id; }<br />

public void setId(int id) { this.id = id; }<br />

public String getName() { return name; }<br />

public void setName(String name) { this.name = name; }<br />

public Integer getKey() { return key; }<br />

public void setKey(Integer key) { this.key = key; }<br />

}<br />

----------------------------------------------------<br />

persons (id int NOT NULL, name varchar(50), key int)<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.18/7


Exemplul 2<br />

public class Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r {<br />

private int id;<br />

private Date date;<br />

private Set items = new HashSet();<br />

// ...<br />

}<br />

public class Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rItem {<br />

private int id = -1;<br />

String p<strong>ro</strong>duct;<br />

float quantity, price;<br />

private int or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rId;<br />

private Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r;<br />

}<br />

----------------------------------------------------<br />

or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rs(id int, date timestamp)<br />

or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rItems(id int, or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rId int,<br />

p<strong>ro</strong>duct varchar(50), quantity float, price float)<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.19/7


Mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lare structurilor <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date<br />

I<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>ntificarea tipurilor <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date<br />

I<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>ntificarea atributelor<br />

Aplicarea convenţiilor <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>numire<br />

I<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>ntificarea relaţiilor<br />

Aplicarea şabloanelor <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> p<strong>ro</strong>iectare<br />

Stabilirea cheilor<br />

Normalizarea - reducerea redundanţei datelor<br />

Denormalizarea - îmbunătăţirea performanţei<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.20/7


Tipuri <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date<br />

Java<br />

SQL<br />

int<br />

integer<br />

String<br />

char, varchar<br />

boolean<br />

bit, smallint<br />

BigInt<br />

numeric(20,0)<br />

BigDecimal<br />

numeric(20,5)<br />

java.sql.Date date<br />

java.sql.Time time<br />

java.sql.Timestamp timestamp<br />

... ...<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.21/7


Maparea ierarhiilor <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> clase<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.22/7


Moştenirea (1)<br />

Person -> Customer<br />

-> Employee -> Executive<br />

abstract class Person {<br />

String name;<br />

}<br />

class Customer extends Person {<br />

String preferences;<br />

}<br />

class Employee extends Person {<br />

float salary;<br />

}<br />

class Executive extends Employee {<br />

float bonus;<br />

}<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.23/7


Moştenirea (2)<br />

Maparea întregii ierarhii <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> clase într-un singur tabel<br />

persons(id, type, name, salary, bonus)<br />

persons(id, isCust, isEmpl, isExec, name, salary, bonus)<br />

Maparea fiecărei clase concrete într-un tabel separat<br />

customers (id, name, preferences)<br />

employees (id, name, salary)<br />

executives (id, name, salary, bonus)<br />

Maparea fiecărei clase într-un tabel separat<br />

persons (id, name)<br />

customers (personId, name, preferences)<br />

employees (personId, name, salary)<br />

executives (personId, name, salary, bonus)<br />

Maparea claselor într-o structură comună<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.24/7


Maparea comună a unor clase<br />

Uzual aplicată pentru tabele tip nomenclator, cu o<br />

structură simplă şi puţine date: tari, localitati, sectii,<br />

categorii, valute, ....<br />

classes (id, parentId, name)<br />

attributes (id, classId, type, name, <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>sc)<br />

values (attId, value)<br />

SELECT v.value<br />

FROM values v, attributes a, classes c<br />

WHERE<br />

v.attId = a.id AND a.classId = c.id AND<br />

c.name=’customer’ AND a.name=’name’;<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.25/7


Informaţii auxiliare<br />

"Shadow <st<strong>ro</strong>ng>info</st<strong>ro</strong>ng>rmation"<br />

Sunt p<strong>ro</strong>prietăţi necesare care nu ţin <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lul<br />

p<strong>ro</strong>priu-zis al datelor, având <strong>ro</strong>l utilitar:<br />

cheia primară, când aceasta este o cheie su<strong>ro</strong>gat<br />

data operării (timestamp)<br />

starea persistenţei (obiectul există în bază sau nu)<br />

modul <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> actualizare a stării: UPDATE sau<br />

DELETE/INSERT<br />

...<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.26/7


Tipuri <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> chei primare<br />

Chei su<strong>ro</strong>gat incrementale: autoincrement,<br />

i<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>ntity, sequence<br />

MAX() + 1<br />

Universally unique i<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>ntifiers (UUID): valori pe 128<br />

<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> biţi unice pentru fiecare maşină (Open Software<br />

Foundation)<br />

Globally unique i<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>ntifiers (GUID): (Mic<strong>ro</strong>soft)<br />

HIGH-LOW<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.27/7


Maparea relaţiilor<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.28/7


Clasificarea relaţiilor<br />

După multiplicitate<br />

One-to-One (0..1 — 0..1)<br />

One-to-Many (∗ — 1, 1 — ∗)<br />

Many-to-Many (∗ — ∗)<br />

După direcţie<br />

Uni-direcţionale<br />

Bi-direcţionale<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.29/7


Exemple<br />

One-to-One<br />

Employee 0..1 -holds- 1 Position (uni)<br />

Employee 1 -owns- 0..1 Computer (bi)<br />

One-to-Many<br />

Employee 1..* -assigned- 1 Duty (uni)<br />

Employee 0..* -works- 1 Division (bi)<br />

Many-to-Many<br />

Employee 0..* -assigned- 0..* Printer (uni)<br />

Employee 0..* -assigned- 0..* P<strong>ro</strong>ject (bi)<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.30/7


Implementarea obiectuală<br />

p<strong>ro</strong>prietate - getter (accesor) - setter (mutator)<br />

Referinţe într-una sau în ambele clase<br />

pentru multiplicitate 0..1<br />

private Position pos;<br />

public Position getPosition() { return pos; }<br />

public void setPosition(Position pos) { this.pos = pos; }<br />

pentru multiplicitate ∗<br />

private Set p<strong>ro</strong>jects = new HashSet();<br />

public Set getP<strong>ro</strong>jects() { return p<strong>ro</strong>jects; }<br />

public void setP<strong>ro</strong>jects(Set p<strong>ro</strong>jects) { ... }<br />

public void addP<strong>ro</strong>ject(P<strong>ro</strong>ject p<strong>ro</strong>ject) { ... }<br />

public void removeP<strong>ro</strong>ject(P<strong>ro</strong>ject p<strong>ro</strong>ject) { ... }<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.31/7


Implementarea relaţională<br />

Chei străine - Foreign key<br />

positions (id, name)<br />

computers (id, name[, employeeId])<br />

employees (id, name, positionId, computerId, ...)<br />

Tabele <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> asociere<br />

duties (id, name)<br />

p<strong>ro</strong>jects (id, name)<br />

employees (id, name, ...)<br />

p<strong>ro</strong>jectAssignments (employeeId, p<strong>ro</strong>jectId)<br />

dutyAssignments (employeeId, dutyId)<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.32/7


Tipuri <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> chei străine<br />

Clasificare după comportamentul la actualizarea<br />

elementelor relaţiei:<br />

Ştergere: DELETE FROM division WHERE id=1<br />

ON DELETE RESTRICT<br />

ON DELETE CASCADE<br />

ON DELETE SET NULL<br />

Modificare: UPDATE division SET id=100 WHERE id=1<br />

ON UPDATE RESTRICT<br />

ON UPDATE CASCADE<br />

ON UPDATE SET NULL<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.33/7


Persistenţa relaţiilor<br />

Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r 1 --- 0..∗ Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rItem<br />

Salvarea, citirea, ştergere relaţiilor:<br />

Individual<br />

Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r = new Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r();<br />

Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rItem item = new Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rItem(...);<br />

or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r.addItem(item); ...<br />

mappingLayer.save(or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r);<br />

item.setOr<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rId(or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r.getId());<br />

mappingLayer.save(item);<br />

Cascadă<br />

mappingLayer.save(or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r);<br />

...<br />

Or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r or<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>r = mappingLayer.retrieve(id);<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.34/7


Performanţă<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.35/7


Citiri "leneşe" ("lazy")<br />

Lazy reads = Tehnică <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> optimizare a performanţei în<br />

nivelul <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> mapare care permite citirea p<strong>ro</strong>gresivă a<br />

atributelor unui obiect, pe măsură ce acestea sunt<br />

cerute.<br />

Se aplică în general atributelor <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> tip colecţie.<br />

Citirea unui atribut <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> tip colecţie se poate face:<br />

complet - toate elementele colecţiei sunt citite din<br />

baza <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date;<br />

JIT(Just In Time) - printr-un iterator responsabil cu<br />

inte<strong>ro</strong>garea bazei <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date;<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.36/7


Cache<br />

Zonele <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> tip cache pot îmbunătăţi consi<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>rabil<br />

performanţele comunicării.<br />

Tipuri <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> cache:<br />

Object cache - obiectele obţinute în urma unor citiri<br />

sunt păstrate în memorie<br />

Database cache - rezultatele unor inte<strong>ro</strong>gări sunt<br />

păstrate <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> baza <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date<br />

Client data cache - în aplicaţii distribuite, replicarea<br />

unor porţiuni ale bazei <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> date centrală<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.37/7


Mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>lare<br />

Folosiţi şabloane <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> p<strong>ro</strong>iectare atât pentru clase, cât<br />

şi pentru tabele.<br />

Cele două mo<st<strong>ro</strong>ng>de</st<strong>ro</strong>ng>le: obiectual şi relaţional trebuie<br />

create împreună.<br />

Cheile primare trebuie să fie simple (su<strong>ro</strong>gat).<br />

O p<strong>ro</strong>prietate simplă = o coloană.<br />

Relaţiile dintre clase trebuie să se reflecte<br />

integritatea referenţială a datelor din tabele.<br />

Atenţie la citiri/scrieri în cascadă.<br />

Refactoring.<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.38/7


Bibliografie<br />

Scott W. Ambler, Agile Database Techniques,<br />

John Wiley & Sons ISBN#: 0-471-20283-5<br />

Scott W. Ambler, The Object Primer,<br />

Cambridge University Press, 2004 ISBN#:<br />

0-521-54018-6<br />

http://www.agiledata.org<br />

Tehnologii <st<strong>ro</strong>ng>avansate</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>de</st<strong>ro</strong>ng> <st<strong>ro</strong>ng>p<strong>ro</strong>gramare</st<strong>ro</strong>ng> – p.39/7

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!