La cattiva progettazione del software consente di combinare le chiamate JDBC SQL e utilizzare un ORM in un'applicazione? [chiuso]

4

La cattiva progettazione del software ha JDBC / raw SQL e usa anche un ORM? Non mi dispiace usare un ORM per il CRUD standard, ma alcune query sono migliori in SQL (per me). Non sto discutendo a favore o contro gli ORM. Ho letto su di loro fino a quando sono blu in faccia.

Ho usato JDBC nella mia domanda, ma avrebbe potuto essere DBI, o qualche altra interfaccia di database. ORM può essere uno di questi.

Che ne dici di manutenibilità? Mescolare le strategie lo complicherebbe? Per me la manutenibilità di un'applicazione diventa in modo efficiente ancora più sfocata, se si tratta di un linguaggio compilato rispetto a un linguaggio di scripting. Devo ricompilare Java. Non devo ricompilare Python o PHP.

Se il mio SQL si trova in un livello del modello, cambia qualcosa?

EDIT: Se utilizzo, trovo un punto in cui ho bisogno di usare SQL nel mio ORM, nel mio modello, che tipo di dati viene restituito? Per esempio, non sarò in grado di usare qualcosa come person.save ('somevalue')?

    
posta johnny 24.03.2014 - 17:53
fonte

5 risposte

1

Dipende dalle esigenze dell'applicazione. Ad esempio, ho lavorato per il settore bancario e, quando devi generare migliaia di ordini di pagamento delle fatture, è meglio avere una stored procedure per eseguire l'attività (sarà molto più veloce) e aggiornare direttamente le tabelle del modello nel database.

Quindi puoi mostrare i risultati con ORM, anche aggiornare un ordine di pagamento (ma non migliaia).

Se la tua applicazione non è critica dal punto di vista delle prestazioni, è meglio programmare la manutenibilità per gestire ORM, in modo che non sia necessario conoscere la tecnologia DB sottostante.

Ancora una volta, dipende dalle tue esigenze e se mantieni il codice organizzato e pulito (applica un pattern DAO, ad esempio), non è un'architettura cattiva, né un codice non mantenibile.

    
risposta data 24.03.2014 - 20:18
fonte
6

Di solito è male perché l'ORM memorizzerà i dati nella cache, quindi girando attorno a esso non sarà possibile trarre vantaggio da tale memorizzazione nella cache. Inoltre, non puoi condividere cose come le dichiarazioni preparate. Se mescoli troppo le cose, potresti anche finire con un deadlock se il tuo codice JDBC e l'ORM non usano la stessa strategia di blocco, o hai problemi di promozione della serratura.

Alcuni ORM forniscono la possibilità di eseguire istruzioni all'interno dello stesso contesto dell'ORM, che può eliminare molti dei problemi.

    
risposta data 24.03.2014 - 19:04
fonte
3

I relatori di oggetti non sono una proposizione del tutto o niente. Usi gli ORM in modo da non dover passare attraverso la noia di scrivere query CRUD, che possono comprendere circa l'80% della tua applicazione.

Ma ogni ORM ha ancora un meccanismo per l'utilizzo di SQL raw o stored procedure o consente di scrivere tali procedure al di fuori dell'ORM. Questo ti permette di ottimizzare quella piccola parte del tuo programma (forse il restante 20%) che non si presta in modo soddisfacente alla mappatura ortodossa oggettuale-relazionale.

    
risposta data 24.03.2014 - 19:03
fonte
2

Dipende. La maggior parte dei framework ORM fornisce un "escape hatch" che consente di eseguire SQL raw, ma ciò che dovrebbe essere nella parte posteriore della tua mente è: "Perché sto facendo questo quando il mio layer ORM è in grado di ricreare un'intera gerarchia di oggetti su richiesta ? "

Direi che veramente calpestare il ghiaccio sottile se stai facendo aggiornamenti al di fuori del tuo livello ORM. Le query probabilmente andrebbero bene se si sta facendo qualcosa che riguarda i report (aggregazione o join), in cui il costo della creazione di gerarchie di oggetti è elevato e fornisce poco valore. Tuttavia, anche allora devi pensare a cosa stai facendo trading. Il motivo per cui utilizziamo gli ORM è tale che possiamo pensare negli oggetti, e scrivendo SQL raw rispetto alle tabelle sottostanti, anche quando si tratta solo di query, stiamo scrivendo il codice che interromperà quando cambiamo il nostro oggetto attributi o relazioni. Che sia un grosso problema o no dipende interamente dall'applicazione.

Quindi, sfortunatamente, la risposta alla tua domanda è: "Dipende".

    
risposta data 26.03.2014 - 02:59
fonte
0

Direi di sì, probabilmente dovresti evitarlo se possibile.

Il codice viene letto drasticamente più regolarmente di quanto non sia scritto. Quando gestisci un'applicazione, il codice che funziona e si legge nello stesso modo è molto più semplice da mantenere rispetto al fatto che i bit funzionino in un modo e quelli che ne fanno un altro.

    
risposta data 24.03.2014 - 20:03
fonte

Leggi altre domande sui tag