Tehnici avansate de programare - Profs.info.uaic.ro
Tehnici avansate de programare - Profs.info.uaic.ro
Tehnici avansate de programare - Profs.info.uaic.ro
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