Object-relational mapping: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Supix (discussione | contributi)
Nessun oggetto della modifica
Migliorato la pagina
 
(59 versioni intermedie di 46 utenti non mostrate)
Riga 1:
{{F|programmazione|agosto 2019}}
L' '''Object-Relational Mapping''' ('''ORM''') è una tecnica di programmazione per convertire dati fra RDBMS e linguaggi di [[Programmazione orientata agli oggetti|programmazione orientati agli oggetti]].
In [[informatica]] l''''''Object-relational mapping''''' ('''ORM''') è una tecnica di [[Programmazione (informatica)|programmazione]] che favorisce l'integrazione di sistemi [[software]] aderenti al [[paradigma di programmazione|paradigma]] della [[programmazione orientata agli oggetti]] con sistemi [[Relational database management system|RDBMS]].
In buona sostanza, associa a ogni operazione e elemento usato nella gestione del database degli oggetti con adeguate proprietà e metodi, astraendo l'utilizzo del database dal [[DBMS]] specifico.
 
Un prodotto ORM fornisce, mediante un'interfaccia orientata agli oggetti, tutti i servizi inerenti alla [[persistenza (informatica)|persistenza]] dei dati, astraendo nel contempo le caratteristiche implementative dello specifico RDBMS utilizzato.
I principali vantaggi nell'uso di questo sistema sono i seguenti.
*Il '''superamento (più o meno completo) dell'incompatibilità di fondo tra il progetto orientato agli oggetti ed il modello relazionale''' sul quale è basata la maggior parte degli attuali [[DBMS]] utilizzati; con una metafora legata al mondo dell'elettrotecnica, si parla in questo caso di ''disadattamento dell'impedenza tra paradigma relazionale e ad-oggetti'' (''object/relational impedance mismatch'').
*Un''''elevata portabilità''' rispetto alla tecnologia [[DBMS]] utilizzata: cambiando [[DBMS]] non devono essere riscritte le routine che implementano lo strato di persistenza; generalmente basta cambiare poche righe nella configurazione del prodotto per l'ORM utilizzato.
*'''Drastica riduzione della quantità di codice da redigere'''; l'ORM maschera dietro semplici comandi le complesse attività di creazione, prelievo, aggiornamento ed eliminazione dei dati (dette [[CRUD]] - ''Create, Read, Update, Delete''). Tali attività occupano di solito una buona percentuale del tempo di stesura, testing e manutenzione complessivo. Inoltre, sono per loro natura molto ripetitive e, dunque, favoriscono la possibilità che vengano commessi errori durante la stesura del codice che le implementa.
*'''Suggerisce la realizzazione dell'architettura di un sistema software mediante [[Architettura_three-tier|approccio stratificato]]''', tendendo pertanto ad isolare in un solo livello la logica di persistenza dei dati, a vantaggio della modularità complessiva del sistema.
 
== Descrizione ==
I prodotti per l'ORM attualmente più diffusi offrono spesso nativamente funzionalità che altrimenti andrebbero realizzate manualmente dal programmatore:
I principali vantaggi nell'uso di questoun tale sistema sono i seguenti.
*Caricamento automatico del grafo degli oggetti secondo i legami di associazione definiti a livello di linguaggio. Il caricamento di un'ipotetica istanza della classe Studente, potrebbe automaticamente produrre il caricamento dei dati collegati sugli esami sostenuti.
* Il '''superamento (più o meno completo) dell'incompatibilità di fondo tra il progetto orientato agli oggetti ed il [[modello relazionale''']] sul quale è basata la maggior parte degli attuali [[DBMS]]RDBMS utilizzati; con una metafora legata al mondo dell'elettrotecnica, si parla in questo caso di ''disadattamento dell'impedenza tra paradigma relazionale e ad-oggetti'' (''object/relational impedance mismatch'').
*Gestione della concorrenza nell'accesso ai dati durante ''conversazioni''. Conflitti durante la modifica di un dato da parte di più utenti in contemporanea, possono essere automaticamente rilevati e controllati dal sistema ORM.
* Un''''elevata [[portabilità''']] rispetto alla tecnologia [[DBMS]] utilizzata: cambiando [[DBMS]] non devono essere riscritte le [[routine (informatica)|routine]] che implementano lo strato di persistenza; generalmente basta cambiare poche righe nella configurazione del prodotto per l'ORM utilizzato.
*Meccanismi di [[Cache|caching]] dei dati. Per esempio, se accade che uno stesso dato venga prelevato più volte dal [[DBMS]], il sistema ORM può fornire automaticamente un supporto al caching che migliori le prestazioni dell'applicazione e riduca il carico sul sistema [[DBMS]].
*''' Drastica riduzione della quantità di [[codice sorgente]] da redigere'''; l'ORM maschera dietro semplici comandi le complesse attività di creazione, prelievo, aggiornamento ed eliminazione dei dati (dette [[CRUD]] - ''Create, Read, Update, Delete''). Tali attività occupano di solito una buona percentuale del tempo di stesura, ''[[Collaudo del software|testing]]'' e manutenzione complessivo. Inoltre, sono per loro natura molto ripetitive e, dunque, favoriscono la possibilità che vengano commessi errori durante la stesura del codice che le implementa.
*Gestione di una ''conversazione'' mediante uso del [[Design_pattern|design pattern]] [[Unit of Work]], che ritarda tutte le azioni di aggiornamento dei dati al momento della chiusura della ''conversazione''; in questo modo le richieste inviate al [[DBMS]] sono quelle strettamente indispensabili (per es. viene eseguita solo l'ultima di una serie di update su uno stesso dato, oppure non viene eseguita affatto una serie di update su di un dato che in seguito viene eliminato); inoltre il colloquio con il [[DBMS]] avviene mediante composizione di [[query]] multiple in un unico statement, limitando così al minimo il numero di [[Round_Trip_Time|round-trip-time]] richiesti e, conseguentemente, i tempi di risposta dell'applicazione.
*''' Suggerisce la realizzazione dell'architettura di un sistema software mediante [[Architettura_threeArchitettura three-tier|approccio stratificato]]''', tendendo pertanto ad isolare in un solo livello la logica di persistenza dei dati, a vantaggio della [[Modularità (informatica)|modularità]] complessiva del sistema.
 
I prodotti per l'ORM attualmente più diffusi offrono spesso nativamente funzionalità che altrimenti andrebbero realizzate manualmente dal [[programmatore]]:
* Caricamento automatico del grafo degli oggetti secondo i legami di associazione definiti a livello di linguaggio. Il caricamento di un'ipotetica istanza della [[classe (informatica)|classe]] <code>Studente</code>, potrebbe automaticamente produrre il caricamento dei dati collegati sugli esami sostenuti. Tale caricamento, in più, può avvenire solo se il dato è effettivamente richiesto dal programma, ed è altrimenti evitato (tecnica nota con il nome di ''[[lazy initialization]]'').
* Gestione della [[concorrenza (informatica)|concorrenza]] nell'accesso ai dati durante ''conversazioni''. Conflitti durante la modifica di un dato da parte di più utenti in contemporanea, possono essere automaticamente rilevati e controllati dal sistema ORM.
* Meccanismi di [[Cache|caching]] dei dati. Per esempio, se accade che uno stesso dato venga prelevato più volte dal [[DBMS]]RDBMS, il sistema ORM può fornire automaticamente un supporto al ''caching'' che migliori le prestazioni dell'applicazione e riduca il carico sul sistema [[DBMS]].
* Gestione di una ''conversazione'' mediante uso del ''[[Design_pattern|design pattern]]'' [[Unit of Work]], che ritarda tutte le azioni di aggiornamento dei dati al momento della chiusura della ''conversazione''; in questo modo le richieste inviate al [[DBMS]]RDBMS sono quelle strettamente indispensabili (per es. viene eseguita solo l'ultima di una serie di update su uno stesso dato, oppure non viene eseguita affatto una serie di update su di un dato che in seguito viene eliminato); inoltre il colloquio con il [[DBMS]] avviene mediante composizione di [[query]] multiple in un unico ''statement'', limitando così al minimo il numero di ''[[Round_Trip_Time|round-trip-timeRound Trip Time]]'' richiesti e, conseguentemente, i tempi di risposta dell'applicazione.
 
== Voci correlate ==
{{Div col}}
*[[database]]
* [[SQLBase di dati]]
* [[SQL]]
* [[Doctrine (PHP)|Doctrine]]
* [[Propel]]
* [[Hibernate]]
* [[IBATIS]]
* [[CakePHP]]
* [[CodeIgniter]]
* [[SchemaDB]]
* [[Java Object Oriented Quering]]
{{Div col end}}
 
== Collegamenti esterni ==
[[en:Object-* {{FOLDOC||object relational mapping]]}}
*[http://www.service-architecture.com/object-relational-mapping/articles/transparent_persistence.html Animazione che mostra come lavora un'utilità di object-relational mapping]
*[http://www.hibernate.org Hibernate - Un prodotto per l'ORM in ambiente Java e .NET distribuito con licenza GNU/GPL]
*[http://tiopf.sourceforge.net tiOPF - Un prodotto per l'ORM in ambiente Borland Delphi/Free Pascal/Lazarus distribuito con licenza GNU/LGPL]
 
{{Portale|informatica}}
[[Categoria:Programmazione ad oggetti]]
 
[[Categoria:Programmazione adorientata agli oggetti]]
[[ca:ORM]]
[[de:Objektrelationale Abbildung]]
[[en:Object-relational mapping]]
[[es:Mapeo objeto-relacional]]
[[fr:Mapping objet-relationnel]]
[[id:Pemetaan objek-relasional]]
[[ja:オブジェクト関係マッピング]]
[[pl:Mapowanie obiektowo-relacyjne]]
[[pt:Mapeamento objeto-relacional]]
[[ru:ORM]]
[[sv:ORM]]
[[th:ตัวส่งระหว่างโมเดลเชิงวัตถุและเชิงสัมพันธ์]]
[[uk:Об'єктно-реляційне відображення]]
[[zh:对象关系映射]]