Perché dovresti usare un ORM? [chiuso]


113

Se dovessi motivare i "pro" del motivo per cui useresti un ORM per il management / cliente, quali sarebbero le ragioni?

Cerca di conservare un motivo per risposta in modo che possiamo vedere quali sono i motivi migliori per i voti


3
dovresti renderlo un wiki se vuoi un sondaggio
frankodwyer

+1 per aver reso un wiki se vuoi un sondaggio
cletus

16
E i truffatori?
Brian Matthews

4
E nemmeno un cucchiaio. No, davvero, c'è uno svantaggio: le prestazioni. È molto più facile ottimizzare le query DB quando non devi passare attraverso l'ORM. (Non mi lamento - essendo passato di recente a ORM, sono per lo più soddisfatto; per scopi generali, ORM è la strada da percorrere; ma mantieni un modo per eseguire query più vicine al metallo se e se hai bisogno delle prestazioni)
Piskvor ha lasciato l'edificio il

2
@ UğurGümüşhan, IMHO, il vantaggio principale dell'utilizzo di un ORM è rendere gli sviluppatori più produttivi, consentendo loro di programmare nella stessa lingua e paradigma OO che usano nel resto della loro app. Le stored procedure non possono fornire questo, quando creano il codice sviluppatore nel linguaggio della stored procedure RDBMS. Quindi non possono fare tutto ciò che può fare un ORM.
Bill Karwin

Risposte:


53

Rendere l'accesso ai dati più astratto e portabile. Le classi di implementazione ORM sanno come scrivere SQL specifico del fornitore, quindi non è necessario.


61
Sebbene sia d'accordo che questa sia una caratteristica degli ORM, suggerirei che il caso d'uso sia piuttosto limitato. Non ho mai usato nient'altro che MySql e sqlite per circa un decennio. Penso che probabilmente sia un requisito molto raro per la maggior parte degli sviluppatori.
troelskn

40
@troelskn: sono d'accordo, ho usato molti prodotti RDBMS, ma mai più di uno o due per progetto. Quindi la portabilità non è il valore più pratico dell'astrazione di SQL. Penso che molti utenti ORM vogliano semplicemente evitare del tutto la codifica in SQL.
Bill Karwin

2
i fornitori escono con nuove versioni / funzionalità tutto il tempo ... hanno solo bisogno di persone simpatiche per scrivere il dialetto e l'aggiornamento facile è!
dotjoe

5
Tipica risposta inutile Mi chiedo perché sia ​​contrassegnata come buona risposta sembra che il ragazzo che pone la domanda cerchi solo di giustificare al suo capo che dovrebbe usare un ORM :) La mia domanda sarebbe piuttosto che tipo di problema incontrerai con Hibernate stackoverflow.com/questions/6477170/...
user310291

2
@ user310291: L'OP non ha chiesto problemi o insidie, ha chiesto i vantaggi dell'utilizzo di un ORM. Ovviamente ci sono pro e contro, ma ha chiesto i pro. Francamente, sono sorpreso che questa risposta sia stata accettata e abbia ricevuto tanti voti positivi quanti ne ha ricevuti, perché non la considererei come il vantaggio principale di un ORM.
Bill Karwin

83

Il motivo più importante per utilizzare un ORM è poter disporre di un modello di business ricco e orientato agli oggetti ed essere comunque in grado di archiviarlo e scrivere query efficaci rapidamente su un database relazionale. Dal mio punto di vista, non vedo alcun reale vantaggio che un buon ORM ti offre rispetto ad altri DAL generati diversi dai tipi avanzati di query che puoi scrivere.

Un tipo di query a cui sto pensando è una query polimorfica. Una semplice query ORM potrebbe selezionare tutte le forme nel database. Ottieni indietro una raccolta di forme. Ma ogni istanza è un quadrato, un cerchio o un rettangolo secondo il suo discriminatore.

Un altro tipo di query potrebbe essere quella che recupera con impazienza un oggetto e uno o più oggetti o raccolte correlati in una singola chiamata al database. Ad esempio, ogni oggetto forma viene restituito con i suoi vertici e le raccolte laterali popolate.

Mi dispiace non essere d'accordo con così tanti altri qui, ma non penso che la generazione del codice sia una ragione sufficiente di per sé per andare con un ORM. Puoi scrivere o trovare molti buoni modelli DAL per generatori di codice che non hanno l'overhead concettuale o di prestazioni che fanno gli ORM.

Oppure, se pensi di non aver bisogno di sapere come scrivere un buon SQL per usare un ORM, ancora una volta, non sono d'accordo. Potrebbe essere vero che dal punto di vista della scrittura di singole query, affidarsi a un ORM è più semplice. Ma con gli ORM è fin troppo facile creare routine con prestazioni scadenti quando gli sviluppatori non capiscono come funzionano le loro query con l'ORM e l'SQL in cui si traducono.

Avere un livello dati che funzioni su più database può essere un vantaggio. Non è uno su cui ho dovuto fare affidamento spesso però.

Alla fine, devo ribadire che nella mia esperienza, se non stai utilizzando le funzionalità di query più avanzate del tuo ORM, ci sono altre opzioni che risolvono i problemi rimanenti con meno apprendimento e meno cicli di CPU.

Oh sì, alcuni sviluppatori trovano che lavorare con gli ORM sia divertente, quindi gli ORM sono buoni anche dal punto di vista del mantenimento della felicità degli sviluppatori. =)


1
Ben detto. Mentre il poster originale cercava specificamente "pro" e non "contro", ho visto alcuni SQL ORRIBILI creati non comprendendo gli impatti di COME usi ORM. Per me, il più grande vantaggio è per le semplici transazioni CRUD che sono la maggior parte del tuo codice DAL per sistemi transazionali. Penso che tu stia dividendo i capelli tra ORM puro e altri metodi DAL generati. Penso che tutto ciò che ti aiuta a tradurre tra oggetti e DB potrebbe essere considerato ORM, è solo un modello operativo diverso.
Doug Lampe

1
@Doug - Penso che la distinzione che stavo cercando fosse che un semplice DAL consisteva in poco più del CRUD SQL generato mentre un ORM conteneva molte più astrazioni come proprietà di navigazione, persistenza della raccolta, linguaggi di query dedicati, cache, ecc. - Un modo migliore Di affermare il mio punto alla luce della tua osservazione potrebbe essere che mentre è vero che l'utilizzo di più funzionalità di un ORM ti consente di implementarle più rapidamente, non è affatto accettabile rimanere all'oscuro di come funzionano queste funzionalità. Forse perché le astrazioni degli ORM trapelano più della maggior parte. ( En.wikipedia.org/wiki/Leaky_abstraction )
Chuck

approfondisci ulteriormente questo aspetto: "se non stai utilizzando le funzionalità di query più avanzate del tuo ORM, ci sono altre opzioni che risolvono i problemi rimanenti". inoltre, come dice il creatore di hibernate gavin king: "In effetti, sistemi come Hibernate sono intenzionalmente progettati come" astrazioni leaky "in modo che sia possibile mescolare facilmente in SQL nativo dove necessario. La leakiness dell'astrazione ORM è una caratteristica, non un bug !" - reddit.com/r/programming/comments/2cnw8x/…
jungle_mole

1) Questo è vecchio. Allora, gli ORM avevano tutte le funzionalità (cache, query, batch, ecc.). IMHO, query polimorfiche basate su oggetti erano l'unica caratteristica ORM che la generazione di codice (mappatura ADO esplicita) non poteva facilmente fornire. 2) Mentre alcuni buchi utili sono stati lasciati intenzionalmente, c'erano anche i mali necessari e le funzionalità avanzate che hanno creato un'alta curva di apprendimento negli ORM. Quindi, la mia risposta è stata quella di utilizzare il codice gen invece di ORM a meno che non avessi bisogno di query avanzate. *) Nel presente, c'è abbastanza varietà negli ORM che il set di funzionalità giusto per il tuo team è probabilmente là fuori. Il mio team è appassionato di Linq2DB ora.
Chuck

60

Accelerare lo sviluppo. Ad esempio, eliminando il codice ripetitivo come la mappatura dei campi dei risultati delle query sui membri degli oggetti e viceversa.


3
Il codice ripetitivo è pessimo, ma non potresti creare un'astrazione che lo rimuova? Ad esempio, puoi avere una tabella / oggetto dei risultati della query che ti restituirà le righe con cui puoi fare cose. Gli ORM sembrano suddividere le righe in singole istanze di classe, piuttosto che entrare nell'astrazione scelta dal DB, ovvero tabelle / righe di risultati della query. Non sto dicendo che questo significhi che gli ORM non sono buoni, ma non sono sicuro che questo da solo sia un motivo per usarli.
Benjohn

@ Benjohn, sono d'accordo sul fatto che la soluzione ORM tratta le singole righe come oggetti, mentre RDBMS tratta i set di righe come un'entità. Ci sono cose che puoi fare nella mentalità RDBMS che non puoi fare in una mentalità OO.
Bill Karwin

È come comprare un'intera macchina solo per usare il bagagliaio, ci sono molti modi per evitare il lavoro ripetitivo
mohas

15

Supporto dell'incapsulamento OO delle regole aziendali nel livello di accesso ai dati. È possibile scrivere (ed eseguire il debug) delle regole di business nella lingua di preferenza dell'applicazione, anziché nei linguaggi goffi di trigger e procedure memorizzate.


Tuttavia, non vuoi avere le tue regole aziendali nel database? Questo è un vantaggio di un database, giusto: più client possono utilizzare la stessa interfaccia fornita dal DBMS. Se gran parte della logica dell'interfaccia è bloccata nel codice ORM di un particolare client, non è nel database e altri client non la stanno utilizzando. Indica le interruzioni del back office del front office (un modello di cliente non è in linea con quello di un altro).
Benjohn

1
@ Benjohn, tendo a inserire semplicemente regole di business nel database, ma regole più complesse non si formano facilmente in vincoli dichiarativi. Ad esempio, "il cliente ottiene il 10% di sconto sull'intero ordine la prima volta che acquista più di tre paia di pantaloni della stessa marca". Come inseriresti quella regola aziendale nel database (tieni presente che una risposta che coinvolge le stored procedure è goffa).
Bill Karwin

È il 2020, non vedo più nessuno che utilizza le stored procedure. Quindi il tuo punto è ancora in piedi?
Ospider il

Penso che il punto sia che le persone non usano stored procedure, ma usano il codice dell'applicazione. Hai capito qualcosa di diverso?
Bill Karwin il


8

È possibile passare facilmente a un software di database diverso perché si sta sviluppando un'astrazione.


41
In più di 30 anni di lavoro sul database, non ho dovuto farlo nemmeno una volta.
HLGEM

4
Non significa che non sia possibile! :)
Matt Fenelon

2
@HLGEM significa che stai chiudendo le scelte per il cliente. Potrebbe effettivamente accadere, in soli 3 anni di lavoro delle webapp, abbiamo creato software portatile utilizzando ORM
Alfabravo

1
Potresti trovarlo utile nel caso in cui desideri eseguire test su un database in memoria
Carlos Parraga

È possibile che più istanze dello stesso software utilizzino database diversi. Ma in realtà lo spostamento dei dati esistenti da un software DB a un altro accade davvero raramente. E quando lo fa, molti ORM in realtà non ti aiutano in questo.
jlh

4

In modo che il modello a oggetti e il modello di persistenza corrispondano.


1
Forse in modo che la tua persistenza sia trasparente al tuo modello a oggetti
S.Lott

4

Felicità dello sviluppo, IMO. ORM astrae molte delle cose bare metal che devi fare in SQL. Mantiene la base del codice semplice: meno file sorgente da gestire e le modifiche allo schema non richiedono ore di manutenzione.

Attualmente sto utilizzando un ORM e ha accelerato il mio sviluppo.



3

Il motivo per cui lo sto esaminando è evitare il codice generato dagli strumenti DAL di VS2005 (mappatura dello schema, TableAdapter).

Il DAL / BLL che ho creato più di un anno fa funzionava bene (per quello per cui l'avevo costruito) fino a quando qualcun altro non ha iniziato a usarlo per sfruttare alcune delle funzioni generate (che non avevo idea ci fossero)

Sembra che fornirà una soluzione molto più intuitiva e pulita rispetto alla soluzione DAL / BLL da http://wwww.asp.net

Stavo pensando di creare il mio generatore di codice SQL Command C # DAL, ma ORM sembra una soluzione più elegante


2

Compilazione e verifica delle query.

Man mano che gli strumenti per gli ORM migliorano, è più facile determinare la correttezza delle query più rapidamente attraverso errori e test in fase di compilazione.

La compilazione delle query aiuta gli sviluppatori a trovare gli errori più velocemente. Destra? Destra. Questa compilazione è resa possibile perché gli sviluppatori ora scrivono query nel codice utilizzando i propri oggetti o modelli di business anziché solo stringhe di istruzioni SQL o SQL.

Se si utilizzano i modelli di accesso ai dati corretti in .NET, è facile eseguire un test unitario della logica di query rispetto alle raccolte di memoria. Ciò accelera l'esecuzione dei test perché non è necessario accedere al database, impostare i dati nel database o persino avviare un contesto dati completo. [EDIT] Questo non è vero come pensavo fosse come unità i test in memoria possono presentare sfide difficili da superare. Ma trovo ancora questi test di integrazione più facili da scrivere rispetto agli anni precedenti. [/ EDIT]

Questo è decisamente più rilevante oggi rispetto a pochi anni fa, quando è stata posta la domanda, ma potrebbe essere il caso solo per Visual Studio ed Entity Framework dove risiede la mia esperienza. Plugin il tuo ambiente, se possibile.


1

Astrarre lo sql via il 95% delle volte, quindi non tutti i membri del team devono sapere come scrivere query specifiche per database super efficienti.


1

Penso che ci siano molti punti positivi qui (portabilità, facilità di sviluppo / manutenzione, focus sulla modellazione aziendale OO ecc.), Ma quando si cerca di convincere il proprio cliente o la direzione, tutto si riduce a quanto denaro si risparmia utilizzando un ORM .

Esegui alcune stime per attività tipiche (o anche progetti più grandi che potrebbero essere in arrivo) e otterrai (si spera!) Alcuni argomenti per il passaggio che sono difficili da ignorare.


0

Livelli .net che utilizzano modelli di code smith

http://nettiers.com/default.aspx?AspxAutoDetectCookieSupport=1

Perché codificare qualcosa che può essere generato altrettanto bene.


Ugh. Abbiamo utilizzato Net Tiers su un grande progetto commerciale e sconsiglio vivamente di utilizzarlo. Il problema è che non è componibile. Vuoi interrogare oggetti Foo e Bar? Non puoi scrivere join, devi inviare query separate per ogni tipo di oggetto che desideri. Ciò si traduce in molte chiamate al database, che possono compromettere le prestazioni e l'atomicità. Male male male. Stai lontano.
Judah Gabriel Himango

0

convincili quanto tempo / denaro risparmierai quando verranno apportate modifiche e non dovrai riscrivere il tuo SQL poiché lo strumento ORM lo farà per te


0

Penso che uno svantaggio sia che ORM avrà bisogno di un aggiornamento nel tuo POJO. principalmente relativi a schema, relazione e query. quindi lo scenario in cui non si suppone di apportare modifiche agli oggetti del modello, potrebbe essere perché è condiviso tra più che sul progetto o client e server in b / n. quindi in questi casi sarà necessario dividerlo in due livelli, il che richiederà ulteriori sforzi.

Sono uno sviluppatore Android e, come sapete, le app mobili di solito non hanno dimensioni enormi, quindi questo sforzo aggiuntivo per separare il modello puro e il modello interessato dall'orm non sembra valere la pena.

capisco che la domanda è generica. ma anche le app mobili sono contenute all'interno di un ombrello generico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.