Quali sono i vantaggi dell'utilizzo dell'astrazione del database da parte di ORM? [chiuso]


19

Sto iniziando a utilizzare l'ORM raccomandato dal framework che scelgo e, sebbene mi piaccia l'idea del livello aggiuntivo di astrazione fornito dall'ORM, sto iniziando a capire cosa significhi davvero. Significa che non sto più lavorando con il mio database (mysql) e tutte le funzionalità specifiche di mysql sono sparite, fuori dalla finestra, come se non esistessero.

L'idea dell'ORM è che sta cercando di aiutarmi rendendo tutto il database agnostico. Sembra fantastico, ma spesso c'è un motivo per cui scelgo un sistema di database specifico. Ma seguendo il percorso agnostico del database, l'ORM prende il minimo comune denominatore, il che significa che finisco con il più piccolo set di funzionalità (quelle supportate da tutti i database).

Cosa succede se so che a lungo termine non cambierò il database sottostante? Perché non accedere anche alle funzionalità specifiche del database?


2
+1: molto interessante. In genere sono stato un sostenitore degli ORM, ma di solito ho considerato RDBMS uguale (che di recente ho iniziato a vedere come sbagliato).
Steven Evers,

Sembra che tu voglia solo la conferma della tua opinione; un blog potrebbe adattarsi meglio di un sito di domande e risposte.

Probabilmente non dovresti aver bisogno di altro oltre a ciò che l'ORM fornisce. Volete solo archiviare i dati degli oggetti in un database ed è quello che farà l'ORM. Non dovresti aver bisogno di altre 'caratteristiche'.
CJ7,

Risposte:


14

Lo vedo allo stesso modo. Qualsiasi astrazione che non ti permetta di passarci sotto quando è necessario è malvagia, perché porta a ogni sorta di brutte inversioni di astrazione nel tuo codice.

Al lavoro abbiamo un ORM nostrano che funziona abbastanza bene, ma per i momenti in cui abbiamo bisogno di qualcosa che le sue caratteristiche non prevedono esplicitamente, c'è un metodo che prende una stringa e la rilascia direttamente nella query che sta generando, permettendo per l'uso di SQL non elaborato quando è necessario.

IMO qualsiasi ORM che non ha questa funzione non vale i bit da cui è stata compilata.


drops it directly into the query it's generatingSembra interessante. Sai quanto tempo hai impiegato per scrivere questo ORM nostrano? Mi piacerebbe vedere qualcosa del genere in uno degli ORM open source là fuori.
Jblue,

+1. Lavorare con l'aspetto più importante della mia applicazione (dati) è l'ultima cosa che voglio astrarre e perdere la connessione.
Fosco,

1
Mi piace essere in grado di immergermi quando necessario, a condizione che l'immersione subisca l'attraversamento di una recinzione metaforica: "Ecco i draghi. Guarda il tuo passo."
Frank Shearar,

1
@Jblue: nessuna idea. È stato tutto scritto anni fa, molto prima che venissi assunto. Hanno istituito un ORM prima che qualcuno stesse usando il termine. Di solito viene chiamato "il modello a oggetti" nella nostra base di codice.
Mason Wheeler,

3
Sono d'accordo. Per le cose di base e usuali gli ORM sono molto utili. Ma a volte devi andare un po 'più in profondità, e se l'ORM non dà quella capacità, allora è un'altra fonte di problemi per te.
Nikos Steiakakis,

14

l'ORM prende il minimo comune denominatore

Non sono d'accordo con la tua affermazione. Prenderò NHibernate come esempio. Questo framework supporta molti database, inclusi quelli più popolari, indipendentemente dalla versione (e dalle funzionalità supportate), proprio come la maggior parte degli ORM.

Nota rapida: menzioni solo l'astrazione del database. Questo è uno dei tanti vantaggi, ma penso davvero che le funzionalità orientate agli oggetti siano più potenti (ad esempio: ereditarietà). E You design your domain model first...

... Ritorno all'astrazione. Non è il minimo comune denominatore. In nHibernate , hai dialetti. Ti consente di utilizzare uno stesso codice per eseguire query su database diversi. I dialetti si occupano della gestione delle funzionalità per te. L'affermazione corretta è quella a given dialect will try to use all the power of a given database system.

Ad esempio, prendiamo il SqlServer2005dialetto che, quando introdotto, sfruttava le nuove funzionalità di paging di SQL Server 2005. Usare quel dialetto invece di SqlServer2000aumentare semplicemente le tue esibizioni.

Ovviamente ci sono delle eccezioni, ma non ne ho incontrato uno in molti anni di lavoro con nHibernate e le mie applicazioni sono molto incentrate sui dati.


+1 per aver sostenuto NHibernate. Un po 'di una curva di apprendimento rispetto ad altri ORM, ma ne vale la pena.
Richeym,

1
Mi piacerebbe sentire alcuni DBA su questo. Nel mio ultimo lavoro, Hibernate non era altro che guai (l'SQL che generava era assolutamente disgustoso).
Fosco,

+1 per questo commento. È perfetto. Quando inizi a confrontare la potenza di un buon ORM come nHibernate (con memorizzazione nella cache, caricamento lento, ecc.) Allora vedi perché questa astrazione è buona e perché le esigenze specifiche del tuo database sono meno importanti.
Chris Holmes,

1
Fosco, dai a un'altra ibernazione. Come ogni altra tecnologia, devi capire cosa sta succedendo dentro, per usarlo correttamente.

+1, ORM è l'intersezione massima di ciò che Java può fare con ciò che un determinato driver JDBC può fare. Sei libero di scegliere la quantità di investimenti che vuoi fare nel livello di persistenza della tua applicazione
bobah

5

L'idea è chiara, ma non sono mai stato spostato al punto di utilizzare uno strumento ORM. Semplicemente non è stato un problema per me scrivere l'SQL da solo (o gestire qualsiasi memoria venga utilizzata). Ma ho il lusso di lavorare su un numero minore di progetti con una vita dei prodotti più lunga, quindi una volta che la manipolazione di SQL e DB codificata a mano è in atto, è a posto. Inoltre, puoi ovviamente gestire qualsiasi query SQL diretta di cui hai bisogno senza dover adattare il tuo processo al modo di pensare dello strumento ORM.

Quindi, suppongo che le domande dovrebbero essere prima di saltare in uno:

Stai effettivamente ottenendo qualcosa dall'usarli? Cioè, stai risparmiando una quantità sufficiente di sforzo implementando uno strumento ORM per renderlo utile e per renderlo utile aggiungere una complicazione aggiuntiva al tuo sistema? (questo è particolarmente vero per le app commerciali, in cui quel "pezzo" in più è ora un vettore in più per potenziali problemi di supporto)

E poi, il livello di astrazione aggiuntivo avrà un impatto negativo sull'app? Sarà più lento di SQL codificato a mano, ecc.


5

O / RM è stato regolarmente criticato. Ted Neward lo ha definito il " Vietnam dell'informatica " alcuni anni fa. O / RM

inizia bene, diventa più complicato col passare del tempo e in breve tempo intrappola i suoi utenti in un impegno che non ha un chiaro punto di demarcazione, nessuna chiara condizione di vittoria e nessuna chiara strategia di uscita.

A meno che tu non scriva la tua mappatura ad hoc (che è una buona soluzione in molti casi, come altri hanno già detto), potresti guardare alternative come l'uso di un database non relazionale. Alcuni sostengono che un database di oggetti veramente sia migliore, altre parole d'ordine menzionate in questo contesto sono LINQ, Ruby e Tutorial D. Suppongo che, contrariamente ai database veramente relazionali, ci siano database di oggetti veramente. Ma in pratica ho scoperto che la modellazione di dati concettuali - vale a dire, su quali oggetti del mondo reale vuoi archiviare i dati e su come questi oggetti si relazionano tra loro - è più importante che armeggiare su come esprimere il tuo modello concettuale in qualsiasi linguaggio di programmazione o database.


2
Ottima lettura lì. Ho fatto il giro completo in carriera e ho riabbracciato il modello relazionale con pieno successo.
Jé Queue,

2
+1 @Xepoch - Ho avuto un recente su Face Re: ORM - perché SQL viene lasciato fuori al freddo? Astrazione, certo - ma ORM sembra promuovere la fobia SQL.
sunwukung

1
@sunwukung, non sono sempre stato d'accordo, ma ora credo che SQL dovrebbe essere considerato un livello logico di 1a classe, non solo qualcosa che viene usato come protocollo wire.
Jé Queue,

3

Qual è l'alternativa?

Questa è una nozione interessante. Astrarre le funzionalità del database sottostante perdiamo sicuramente alcune delle funzionalità dell'implementazione specifica del database. (Indipendentemente dal fatto che dovremmo dipendere da specifiche funzionalità del database è un altro argomento) Immagino che questo potrebbe essere risolto da ORM specifici del database che ti consentono di accedere alle funzionalità specifiche, ma potrebbe essere solo un problema maggiore di quanto valga la pena e un passaggio nel direzione sbagliata.

Alla fine della giornata, devi chiederti: qual è l'alternativa?

Dovremmo smettere di usare gli ORM e tornare a scrivere da soli tutti gli accessi al database? Sicuramente potremmo perdere l'accesso ad alcune funzionalità del database tramite l'ORM, ma puoi sempre accedere a quelle usando le tecniche della vecchia scuola. Alla fine i guadagni ottenuti in termini di produttività superano completamente gli svantaggi.


Metterei in dubbio la necessità di utilizzare un database razionale. Mi preoccupa il fatto che le persone passino immediatamente agli RDBMS anche se non sono la soluzione giusta. I database degli oggetti, ad esempio, offrono una soluzione molto elegante a molti problemi. Sono perfetti? No, ma le persone raramente si preoccupano di valutarli. C'è una tendenza inquietante di "Devo archiviare i dati, userò SQL!"
Matt Olenik,

6
@Matt: gli RDBMS sono una tecnologia molto collaudata e comprovata. Ci sono tonnellate di persone con esperienza con loro e un gran numero di strumenti di terze parti. Da un punto di vista aziendale, c'è molto valore in ciò quando hai a che fare con qualcosa di estremamente prezioso come i tuoi dati. Sui progetti più piccoli, c'è ancora valore nel poter avviare un progetto (come un servizio web LAMP) e avere la maggior parte del software proprio lì e ben documentato.
David Thornley,

3

Un ORM equivale sostanzialmente a " Procedure non memorizzate ". Lì ho coniato un termine.

Tutto ciò che fa un ORM, è possibile replicarlo con visualizzazioni, trigger e stored procedure. Aiutano a sottrarre SQL grezzo e possono mantenere coerenti i database normalizzati. Ma funziona bene solo per casi semplici. Se i dati mach sono troppo elaborati per l'elaborazione, possono diventare un consumo di prestazioni. (Gli ORM in PHP prendono spesso il lato script dei dati, perché le catene del builder SQL non possono astrarre tutto.)

Ma come al solito, tutto dipende dall'applicazione e dal compito da svolgere.


2
"Procedure non memorizzate": il termine corretto è "SQL con parametri". Stai solo grattando la superficie di ciò che un ORM maturo può fare per te (batch, caricamento lento ecc.)
Richeym,

@richeym: la maggior parte degli ORM in PHP non usa istruzioni preparate, né segnaposto parametrizzati. È la fuga e la concatenazione di SQL fino in fondo. Sicuramente offrono vantaggi di livello superiore rispetto alle noiose query manuali SQL. Sezionalmente, tuttavia, prendono la logica di elaborazione dal database, quindi "procedure non memorizzate".
mario,

3

Una cosa che fa male usando gli ORM è che molti dei loro fan tendono a sostenere che non abbiamo più bisogno di conoscere la teoria di SQL e RDB. I risultati variano da divertenti a completamente catastrofici. E questo nonostante le milioni di volte in cui i produttori e gli esperti di ORM affermano che dobbiamo conoscere bene la teoria SQL e RDB per utilizzare e configurare correttamente un ORM.

Perché la gente prende uno strumento che ha i suoi usi su molti, ma non tutti i contesti, in un proiettile d'argento magico, universalmente applicabile, va oltre me.


1

L'anno scorso ho lavorato su un'app interna che cambiava frequentemente ed ero molto felice di aver usato un ORM. L'app era un'app di supporto per un team di gestione delle modifiche e, poiché il progetto più ampio si è evoluto, la nostra piccola app ha ottenuto nuovi requisiti per situazioni che non esistevano e non potevano essere previste pochi mesi prima.

Grazie a ORM ( Propel , in PHP), abbiamo diviso parte della logica per il codice, quindi una funzione ha aggiunto la parte "è record valido" della query, un'altra la parte di sicurezza ("mostra questi record solo se l'utente ha queste capacità "), ... Se la struttura sottostante è cambiata (un campo aggiuntivo che dovrebbe essere preso in considerazione per" validità del record "), abbiamo dovuto cambiare solo una funzione, non venti clausole SQL.

Venivamo da una situazione in cui tutte le clausole SQL (bene, la maggior parte) erano archiviate in un file XML separato, quindi "le modifiche al database sarebbero facili da gestire". Credetemi, non lo erano. Una parte è stata così orribile che ho dovuto presentarlo al Daily WTF .

Se una query era troppo complicata da esprimere con Propel Criteria, o se avevamo bisogno di alcune funzionalità specifiche del fornitore (principalmente la ricerca full-text, dato che stavamo usando MySQL), con Propel non c'era problema. Puoi aggiungere criteri personalizzati o, quando veramente necessario, abbiamo usato il raw SQL ( ora ancora più facile da combinare con gli oggetti Propel reali). Puoi aggiungere facilmente i componenti aggiuntivi specifici del fornitore alle classi generate, in modo da avere il meglio dei due mondi: nessun codice SQL nel codice dell'app, ma con tutte le funzionalità del motore di database.


1

Ma il punto è che devi programmare lontano dal database, il che significa che non devi pensare come se fossi nel database.

Ora lavoro in C # e uso molto LINQ, quindi molti metodi fluidi. Non ho bisogno di pensare a come i miei oggetti vengono archiviati o trovati, o addirittura salvati a livello di programma e molto poco a livello di business.

Molto spesso i metodi forniti dagli stessi database specifici vengono utilizzati nel connettore DB, quindi si ottengono tali ottimizzazioni senza la necessità di sapere quali sono.

È ancora possibile scrivere funzioni lato DB. Spesso puoi semplicemente mapparli.

E soprattutto, una separazione del genere consente la testabilità e ti costringe (un po ') a scrivere codice strutturato meglio


2
Ancora una volta, perché è necessario programmare lontano dal database? Perché non rendere il database parte integrante del tuo sviluppo, in quanto hai scelto di usarne uno in primo luogo. Se non hai bisogno di un RDBMS perché spingere un ORM sopra di esso?
Jé Queue,

1
È parte integrante Un database fa molto bene a mantenere e far rispettare le relazioni e recuperare dati grezzi. Tuttavia, le cose che vuoi fare con questi dati molto probabilmente sono già state gestite nel wrapper ORM. E oltre alle cose critiche, perché togliere la logica dal livello aziendale?
burnt_hand,

@burnt_hand - "Ma il punto è che devi programmare lontano dal database, il che significa che non devi pensare come se fossi nel database." Quali sono i vantaggi universali? Posso vederlo come un vantaggio quando la tua app è semplicemente alla ricerca di un modo per mantenere gli oggetti. Ma per i dati relazionali, OLTP e simili, la programmazione lontano dal database è un modo per rovinarti alla grande.
luis.espinal,

@ luis.espinal - cosa vuol dire rovinare te stesso alla grande? sono sinceramente curioso. Hai un esempio?
burnt_hand,

@burnt_hand - in realtà ho diversi esempi reali. Il più recente riguarda un modello di dominio molto ampio e, per motivi di prestazioni, il progetto deve caricare tutte le mappature di ibernazione all'avvio. La fabbrica della sessione risultante finisce per consumare fino al 30% della memoria utilizzata ... solo per i binding. La base di codice ora è troppo impegnata con l'ORM ed è impossibile riscriverla. Ciò ora ha implicazioni effettive poiché l'applicazione si sta avvicinando ai limiti fisici dell'hardware che avrebbe dovuto eseguire. Bummer.
luis.espinal,

1

Gli ORM possono darti accesso anche a funzionalità specifiche del database, dipende da quale ORM stai utilizzando e da quali funzionalità offre.

Ad esempio, nell'attuale progetto a cui sto lavorando, stiamo usando l'API Java Persistence e Hibernate. Tuttavia, utilizziamo diverse funzionalità specifiche del database, come la ricerca in tabelle con soundex.

Per me, il vantaggio principale dell'utilizzo di un ORM non è necessariamente quello di rendere agnostico un database dell'applicazione (anche se è una buona cosa), ma che per la maggior parte non devo pensare a come vengono archiviate e recuperate.

Tuttavia , a un certo punto è molto probabile che tu debba pensarci comunque, a seconda dei requisiti della tua applicazione. L'ORM non è magico.


1

Ho scritto il mio che mi aiuta a selezionare e inserire più facilmente.

Evey db cosa specifica è disponibile. Devo solo scrivere la query con la quale la libreria mi aiuta (posso usare '?' E params invece di nominare manualmente un parametro e usare .Add)

Immagino che la mia metà faccia schifo a metà utile. Ricevo un po 'di aiuto nel mondo ORM e faccio parti significative nel mondo delle query.


1

Scrivere codice per inserire e selezionare, aggiornare in linea o con processi memorizzati e mapparli indietro attraverso il DAL è più lungo la norma piuttosto utile solo in casi eccezionali. Gli ORM disponibili, i database di supporto e le lingue la domanda che dovresti porre perché non usi ORM?

Sono standardizzati, universali, specificati o generici. inoltre è più veloce e più facile da implementare. Ho usato subsonic, linq-to-sql e il framework delle entità. Consente allo sviluppatore di concentrarsi sulla logica e sulle regole aziendali anziché sulla mappatura del database.


1
Ci sono molte ragioni per usare o NON usare un ORM. Gli ORM non sono una panacea e pochissime persone sanno davvero come usarli in modo efficace. Inoltre, in molti casi, la logica aziendale si riflette già (in parte) in modo molto naturale nelle relazioni già esistenti in un RDBMS (questo è stato lo scenario più comune che ho incontrato, passato e presente). Un RDBM ben progettato ha una base matematica forte, ben compresa, comprovata e vera. Ovviamente non tutto dovrebbe essere modellato con un RDMB, ma allo stesso modo, un ORM non è nemmeno una soluzione universale.
luis.espinal,

1

I miei (semplici) due centesimi:

1: ci sono ORMS e ci sono ORMS. Alcuni ORMS sono basati su Active Record, altri basati su Data Mapper - che di per sé è una considerazione rilevante, ma che richiede alcune indagini per comprendere le implicazioni. In generale, la mia esperienza in PHP è che ORMS supporta il primo, pochi supportano il secondo. Gli ORM basati su Record attivi sembrano avere uno dei due effetti: de-normalizzare il database o invocare una pletora di classi per supportare le interazioni degli oggetti.

2: il vantaggio degli ORM diminuisce in correlazione diretta con la complessità della query che è necessario eseguire. Quando hai una bella relazione semplice, ovvero Utenti -> Post, possono funzionare molto bene. Questo (IMO) è il motivo per cui la maggior parte degli ORM / framework usa esempi come questo. Quando è necessario eseguire query complesse, tuttavia, la quantità di ORMQL che è necessario generare è paragonabile alla lunghezza della stringa di una normale query SQL, ma meno performante a causa del grafico a oggetti che esegue la query che invoca, che tipo di sconfigge il punto di astrazione. Quindi, in breve - gli ORM sono brillanti per il primo 30-50% delle attività del database - ma terribili per l'ultimo. Penso che questo sia un altro motivo per cui l'AR è così diffusa.

3: Perché nascondersi dal database? Utilizzeresti un linguaggio lato server per astrarre javascript?

Personalmente mescolo quegli approcci:

  • usa ORM per le basi, caricando "utenti"
  • utilizzare un DAO contenente diverse query SQL precotte (ovvero selectLike, selectWhere).
  • estendere il DAO ove necessario per aggiungere query personalizzate più specifiche ma riutilizzabili
  • Fornire un accesso semplice al database tramite DAO, ovvero $ data = Dao-> query (la stringa sql) per eseguire query una tantum.

Detto questo, Doctrine 2 uscirà presto, il che sembra davvero interessante.


0

È possibile utilizzare framework di mapper SQL come myBatis se si desidera utilizzare le funzionalità sql.


Non è proprio una risposta alla domanda di Jblue sui vantaggi dell'utilizzo di un tale mappatore
Lukas Eder,
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.