Per chi si appresta per la prima volta ad entrare nel mondo della programmazione, termini come Object-Relational Mapping possono spesso sembrare intimidatori e oscuri. In realtà, una volta abituato al loro utilizzo gli ORM rendono molto più facile la scrittura di codici e la vita dello sviluppatore, ma ad un dato prezzo.
In questo articolo spiegheremo in cosa consiste l’ORM, così come i pro e i contro che portano con sé agli sviluppatori.
Cos’è un Object-Relational Mapping
L’Object-Relational Mapping (ORM) è una tecnica di programmazione utilizzata per memorizzare, richiamare, aggiornare ed eliminare dati da un database all’interno di programmi object-oriented, solitamente scritti in linguaggi di programmazione orientata agli oggetti (OOP), come Java o C#. In parole povere, l’ORM sincronizza rappresentazioni di dati molto diverse tra loro.
In particolare l’ORM si applica in maniera specifica ai database relazionali e si occupa di convertire e tradurre quei dati che non potrebbero altrimenti coesistere tra questi database e i linguaggi OOP. I database relazionali sono conosciuti come RDBMS, ovvero Relational Database Management System e sono sistemi di gestione di database basati appunto sul modello relazionale.
Possiamo quindi pensare all’ORM come un traduttore che converte un dato codice da un modulo all’altro. I software ORM generano oggetti – come in OOP – che mappano virtualmente le tabelle del database, permettendo quindi al programmatore di interagire e manipolare quest’ultimo.
Per risolvere la mancata corrispondenza database-OOP, l’ORM utilizza tre approcci: bottom up, top-down e meet in the middle. Ogni approccio ha i suoi vantaggi e svantaggi e per questo motivo, nella selezione della soluzione software migliore, gli sviluppatori devono essere in grado di comprendere appieno l’ambiente e i requisiti di progettazione.
I vantaggi dell’ORM
I vantaggi offerti dall’ORM allo sviluppatore sono molteplici. Vediamoli meglio:
- Manipolazione di dati e objects: come abbiamo già detto, l’ORM permette allo sviluppatore di manipolare i dati come oggetti, oltre a rendere il codice più facile da aggiornare, mantenere e riutilizzare.
- Codici più piccoli: l’ORM permette di ridurre notevolmente le dimensioni dei codici, ottenendo i medesimi risultati con codici più piccoli e snelli.
- Scrittura ottimizzata di query SQL: SQL è un linguaggio potente, ma per sfruttarne a pieno le potenzialità bisogna essere in grado di scrivere correttamente gli statements. L’ORM permette agli sviluppatori di scrivere query corrette ed ottimizzate, permettendo loro di sfruttare la loro fluidità in un dato linguaggio in SQL. Più in generale, l’ORM aiuta lo sviluppatore a scrivere query con un funzionamento migliore.
- Protezione: l’ORM protegge le applicazioni dagli attacchi di code injection come l’SQL injection, grazie all’abilità del framework di filtrare i dati. I code injection consistono in aggressioni mirate ad applicazioni di gestione dati, attraverso l’inserimento e la conseguente esecuzione di stringhe di codice SQL estranee.
- Funzioni avanzate: a seconda dell’ORM è possibile godere di diverse funzioni avanzate, come il supporto per le transazioni, il connection pooling, migrations, seeds, streams, ecc.
- Database: gli ORM forniscono il concetto di Database Abstraction, che rende più facile il passaggio da un database all’altro e crea un codice coerente per la propria applicazione.
- Cache Management: le entità vengono memorizzate in memoria, riducendo così il carico sul Database Abstraction.
Gli svantaggi dell’Object-Relational Mapping
Vediamo adesso i principali svantaggi dati dall’utilizzo dell’ORM.
- Complessità: la grande complessità dell’ORM ne rende difficile l’utilizzo ed il debug. Una delle conseguenze più immediate è senza dubbio il rischio di inefficienza. Per questo motivo molti sviluppatori invitano coloro in grado di utilizzare ottimamente SQL ad evitare l’impiego dell’ORM.
- Apprendimento lento: come sviluppatore è importante conoscere i meccanismi ed i processi che si nascondo dietro alle proprie applicazioni. Spesso molte persone decidono di utilizzare un ORM perché non vogliono imparare l’SQL, convinti di poter utilizzare un unico linguaggio invece di due per scrivere le proprie applicazioni. Tuttavia agendo in questo modo lo sviluppatore indebolirà le proprie abilità, precludendosi un’importante occasione di apprendimento. E’ inoltre importante sottolineare che le conoscenze apprese nell’utilizzo di un particolare ORM molto spesso non possono essere trasferite, in particolar modo se si passa da una piattaforma all’altra, come da JS a C#.
- Non può fare tutto: non tutte le query possono essere rappresentate come una operazione ORM. Quando abbiamo bisogno di generare queste query, quindi, sarà necessario ritornare a creare la query SQL di persona e quasi sicuramente un codice di base con un forte utilizzo dell’ORM avrà ancora alcune query scritte a mano. Ciò implica che gli sviluppatori dovranno conoscere sia la sintassi ORM che quella SQL.