Cos’è la mappatura relazionale a oggetti (ORM)?
Cos’è la mappatura relazionale a oggetti (ORM)?
La mappatura relazionale a oggetti (ORM) è il processo di astrazione della connessione tra le entità del linguaggio di programmazione (oggetti) e gli elementi del database corrispondenti.
Durante la creazione di applicazioni, i programmatori definiscono gli oggetti in codice perché corrispondano a concetti del mondo reale. I dati degli oggetti vengono manipolati nel codice ma memorizzati in un database come definito dalla progettazione del sistema di dati. Ad esempio, nel codice potrebbe essere presente un oggetto cliente contenente informazioni sui clienti, ma il database sottostante potrebbe archiviare tali dati in più tabelle.
La mappatura relazionale a oggetti è un livello di software che traduce i dati dell’oggetto nel database sottostante, estraendo i dettagli del database dal programmatore. In questo modo, il codice rimane invariato anche se i database sottostanti vengono sostituiti con strutture nuove o diverse. La mappatura relazionale a oggetti consente la creazione di applicazioni modulari facili da gestire e mantenere.
Come funzionano le mappature relazionali a oggetti?
Le mappature relazionali a oggetti (ORM) collegano le applicazioni scritte in un linguaggio di programmazione orientato agli oggetti (OOP) a un database sottostante. Questi tipi di applicazioni e database vengono spesso utilizzati insieme, ma ognuno gestisce i dati in modo diverso. L’aggiunta di una mappatura relazionale a oggetti consente a ciascuno di inviare dati in un formato comprensibile all’altro. È possibile modificarne uno senza influire sull’altro.
Linguaggio di programmazione orientato agli oggetti
I linguaggi OOP organizzano i dati in oggetti, che sono strutture di codice con uno o più attributi. Ad esempio, in un’applicazione OOP, è possibile definire un oggetto rappresentato come una classe persistente di dati, come un’auto, con attributi come marca, modello, VIN, colore e chilometraggio.
Alcuni dei linguaggi di programmazione orientata agli oggetti (OOP) più diffusi includono Python, Java, JavaScript e .NET/C#.
Database relazionali
I database relazionali strutturano i dati in tabelle, in modo simile a una serie di fogli di calcolo collegati. Ogni tabella è composta da una serie di colonne con registri univoci in ogni riga.
Ad esempio, il database delle auto potrebbe contenere diverse tabelle, una delle quali con dati come marca, modello e VIN. Un’altra tabella potrebbe memorizzare gli attributi delle singole auto, come proprietario, colore e chilometraggio. Tra i database relazionali più diffusi ci sono MySQL, PostgreSQL e SQL Server.
Nello sviluppo web, uno strumento ORM (Object-Relational Mapping) converte i dati inviati da un’applicazione orientata agli oggetti in un database relazionale senza che l’applicazione debba sapere come sono strutturati i dati nel database.
Mappature relazionali a oggetti
È possibile creare una mappatura relazionale a oggetti, a volte denominata gestore relazionale di oggetti, che indica al database dove localizzare tutti i dati richiesti da un’applicazione, anche se ogni struttura memorizza i propri dati in un modo diverso. Quando l’applicazione richiede tutti gli attributi di una singola auto, l’ORM indica al database come recuperare tutti i dati su più tabelle.
Poiché le mappature sono astratte, se la struttura del database cambia o si esegue la migrazione a un nuovo database, l’ORM può comunque individuare i dati corretti con aggiornamenti minimi.
Framework ORM comuni
Gli strumenti o framework ORM sono disponibili per la modellazione dei dati in molti dei più diffusi linguaggi di programmazione orientati agli oggetti. Tra i più popolari ci sono:
- Hibernate per Java
- SQLAcademy per Python
- Entity Framework per .NET/C#
È possibile utilizzare un ORM con un database non relazionale?
No, i database non relazionali archiviano i dati in diversi formati e interagiscono con le applicazioni in modi diversi. Il tipo più comune di database non relazionale è un database di documenti. I documenti possono anche avere molti attributi, simili agli oggetti, ma hanno strutture programmatiche diverse.
Tra i database non relazionali più diffusi ci sono MongoDB e NoSQL.
Qual è la differenza tra ORM e ORDBMS?
Un ORDBMS (Object-Relational Database Management System) è un tipo di database che utilizza elementi di framework relazionali e orientati agli oggetti. Può memorizzare record strutturati come oggetti simili a quelli codificabili in un linguaggio OOP. Ma permette anche di eseguire query relazionali simili a SQL su quei record. Questa combinazione di funzionalità consente di archiviare una gamma più ampia di tipi di dati rispetto a quanto è possibile in un database relazionale standard.
Mentre una mappatura relazionale a oggetti (ORM) è un’astrazione di dati che opera a livello di applicazione, un ORDBMS fornisce funzionalità orientate agli oggetti direttamente a livello di database.
Gli ORM vengono eseguiti nel codice dell’applicazione e generano SQL dietro le quinte. ORDBMS, invece, gestisce l’archiviazione di dati e l’esecuzione delle query a livello di database, con supporto nativo per tipi di oggetti avanzati.
Qual è la differenza tra ORM e SQL?
SQL (Structured Query Language) è il linguaggio standard utilizzato per interagire con i database relazionali e consente di creare e gestire schemi di database, inserire e aggiornare dati ed eseguire query sui record utilizzando comandi dichiarativi.
SQL offre un controllo diretto e di basso livello sul database. L’ORM fornisce un’interfaccia di livello superiore e più astratta, che spesso rende lo sviluppo più veloce e il codice più gestibile.
È inoltre ideale per semplificare le attività comuni del database e allinearle al codice dell’applicazione, ma SQL rimane essenziale quando è necessario ottimizzare le prestazioni, eseguire query complesse o avere il pieno controllo sull’accesso ai dati.
Perché usare un ORM anziché le query SQL?
SQL richiede di scrivere comandi manualmente per interagire con il database, mentre un ORM traduce automaticamente il codice orientato agli oggetti in SQL dietro le quinte.
Gli ORM aiutano a ridurre la quantità di codice necessaria per sviluppare un programma orientato agli oggetti che deve effettuare molte query sul database. Invece di programmare manualmente numerose query al database che dovranno essere gestite, gli sviluppatori possono programmare come inviarle all’ORM.
Lavorare in un linguaggio di programmazione più comprensibile semplifica anche la lettura e il debug del codice.
Quali sono i vantaggi dell’utilizzo della mappatura relazionale a oggetti?
I sistemi ORM offrono i seguenti vantaggi.
Sviluppo più rapido delle applicazioni
Gli ORM aiutano a recuperare dati complessi utilizzando un codice comprensibile nel linguaggio OOP con cui gli sviluppatori hanno più familiarità. Sono in grado di gestire le operazioni di routine del database, come la creazione, la lettura, l’aggiornamento e l’eliminazione di record (CRUD), in modo che gli sviluppatori non debbano codificare ripetutamente queste operazioni all’interno dell’applicazione.
Manutenzione più semplice delle applicazioni
Sintetizzando le query del database tramite un ORM, gli sviluppatori possono lavorare in un unico linguaggio, semplificando la comprensione e la manutenzione del codice.
Ottimizzazione della sicurezza
Un’iniezione SQL è un tentativo di accesso fraudolento a dati privati con l’invio di query SQL tramite moduli utente sull’applicazione. Gli ORM utilizzano query parametrizzate, che per prima cosa inviano al database una query con valori segnaposto anziché dati reali (ad esempio, ? o :param). I dati reali vengono inviati separatamente. Questo garantisce che l’input dell’utente venga trattato come dati, non come codice SQL eseguibile. L’utilizzo di uno strumento ORM impedisce quindi l’accesso non autorizzato ai dati tramite iniezione SQL.
Prestazioni migliorate
Un ORM può migliorare le prestazioni del sistema abilitando la memorizzazione nella cache trasparente degli oggetti nel livello dell’applicazione. Può inoltre salvare i dati più comunemente recuperati più vicino all’applicazione per potervi accedere più rapidamente.
Quali sono le difficoltà dell’utilizzo della mappatura relazionale a oggetti?
Gli ORM presentano le seguenti difficoltà.
Disallineamenti di impedenza
Le strutture di dati complesse possono essere difficili da mappare tra programmi e database orientati agli oggetti. Le gerarchie codificabili in OOP possono essere molto difficili da rappresentare in un database, indipendentemente dalla complessità dell’ORM.
Problemi di prestazioni a maggiore complessità
Le query dirette in un database sono più efficienti dal punto di vista computazionale rispetto all’utilizzo di un ORM. Per query molto complesse, può essere più efficiente l’utilizzo del codice SQL anziché uno strumento ORM.
Curva di apprendimento
Anche se non richiede di imparare il codice SQL complesso, l’ORM deve essere ben studiato dagli sviluppatori per poterlo utilizzare.
Quando è consigliabile utilizzare le mappature relazionali a oggetti?
Poiché uno strumento ORM astrae e automatizza le query del database, gli sviluppatori possono concentrarsi maggiormente sull’applicazione piuttosto che sulla codifica di query potenzialmente complesse. L’utilizzo di ORM è indicato quando:
L’applicazione ha molti oggetti
La creazione manuale di query per interfacce e strutture di oggetti complesse può richiedere troppo tempo e lavoro. Consentire a uno strumento ORM di mappare gli oggetti ai dati archiviati nel database può rendere il recupero accurato più veloce e affidabile.
L’applicazione ripete query simili al database
Gli ORM possono automatizzare facilmente molte operazioni CRUD di routine (creazione, lettura, aggiornamento ed eliminazione dei dati), evitando quindi la necessità di codice SQL.
L’evoluzione dello schema è in corso
Quando il modello di dati è ancora in evoluzione, un ORM può aiutare a gestire più facilmente le sue modifiche. Molti ORM includono infatti strumenti di migrazione che consentono di creare versioni e applicare le modifiche in modo strutturato, oltre a ridurre il rischio di incoerenza tra gli ambienti.
La portabilità del database è importante
Un ORM è un livello di astrazione che separa intenzionalmente le operazioni invocate dall’applicazione da un database specifico. Non si tratta di una garanzia di portabilità completa, ma è un’astrazione che riduce il lavoro necessario per passare da un sistema all’altro. Quindi, ad esempio, se l’applicazione per auto deve passare dall’utilizzo di un database MySQL a PostgreSQL, non sarà necessario riscrivere l’intera applicazione. Basterà infatti apportare piccole modifiche all’ORM in caso di cambiamenti a una delle tabelle.
Quando non è consigliabile utilizzare le mappature relazionali a oggetti?
Sebbene siano strumenti potenti, ci sono ancora circostanze in cui le mappature relazionali a oggetti non sono la soluzione migliore.
Per semplici interazioni con il database
Nel caso di un’applicazione che esegue solo operazioni CRUD semplici, il tempo e l’impegno necessari per mantenere un ORM potrebbero essere maggiori rispetto alla semplice gestione manuale delle query all’interno dell’applicazione.
Quando è fondamentale il calcolo ad alte prestazioni
Per molte applicazioni, il tempo e le risorse di calcolo aggiuntivi richiesti da un ORM sono irrilevanti. Ma per attività come l’analisi in tempo reale, in cui contano anche i millisecondi, questo potrebbe diventare un problema.
Quando è necessario utilizzare schemi denormalizzati
In alcune situazioni, gli sviluppatori potrebbero voler mantenere su più tabelle nei servizi web del database alcuni dati ridondanti, denominati schemi denormalizzati. Questo può migliorare le prestazioni quando un’applicazione deve eseguire query relazionali complesse che uniscono molte tabelle. Infatti, la mappatura di queste query in un ORM non è sempre efficace.
In che modo AWS può aiutarti con i tuoi requisiti di gestione dei dati?
AWS offre una gamma di soluzioni di database cloud che rendono la gestione dei dati efficiente ed economica.
Amazon Relational Database Service (Amazon RDS) è un servizio gestito che consente di configurare, utilizzare e scalare facilmente un database relazionale nel cloud. Offre funzionalità ridimensionabili a un costo vantaggioso e gestisce al contempo lunghe attività amministrative del database, per consentire all’utente di concentrarsi sulle proprie applicazioni e attività.
Amazon Aurora è un servizio di database relazionale moderno che offre alte prestazioni e grande disponibilità su larga scala. Offre edizioni compatibili con MySQL e PostgreSQL totalmente open source e una gamma di strumenti di sviluppo per creare applicazioni serverless e con tecnologia machine learning (ML).
Amazon Redshift fornisce la moderna analisi dei dati su larga scala, offrendo prestazioni di prezzo fino a 3 volte superiori e un throughput 7 volte migliore rispetto ad altri data warehouse in cloud.
Amazon DocumentDB (compatibile con MongoDB) è un servizio di database di documenti aziendale rapido, scalabile, ad elevata disponibilità e completamente gestito che archivia i dati in documenti simili a oggetti JSON. Utilizzano i driver restituiti dagli oggetti nativi al linguaggio di programmazione utilizzato dallo sviluppatore, eliminando la necessità di strumenti ORM.
Inizia a usare i database su AWS creando un account gratuito oggi stesso.