Il tuo principio guida dovrebbe essere Non ripetere te stesso :
In software engineering, Don't Repeat Yourself (DRY) is a principle of software development aimed at reducing repetition of information of all kinds, especially useful in multi-tier architectures. The DRY principle is stated as "Every piece of knowledge must have a single, unambiguous, authoritative representation within a system."
L'ORM è essenzialmente un livello extra (o di livello se si preferisce), comodamente seduto tra l'applicazione e lo / gli spazio / i dati / i. I tuoi vincoli dovrebbero essere in un posto, e solo in un posto, che si tratti dell'ORM o dell'archiviazione dei dati, altrimenti presto finirai per mantenerne versioni diverse. davvero non vuoi farlo.
Tuttavia, in pratica, la maggior parte degli ORM decenti genera automaticamente una grande quantità di modelli dallo schema dei dati. Sebbene ci sia ancora una duplicazione, le possibilità di interruzione della manutenzione sono minime poiché il codice ORM duplicato viene generato ogni volta seguendo lo stesso schema. Sarebbe ideale non avere codice duplicato, ma i vincoli generati automaticamente sono la cosa migliore.
Inoltre, avere i tuoi vincoli in un posto non significa necessariamente che dovresti avere tutti i tuoi vincoli nello stesso posto. Alcuni, come i vincoli di integrità referenziale, possono essere più adatti all'archiviazione dei dati (ma potrebbero andare persi se ci si sposta in un'altra memoria di dati) e alcuni, soprattutto quelli che riguardano la logica aziendale complessa, sono più adatti per l'ORM. Sarebbe preferibile avere tutte le tue mele nello stesso cestino, ma ...
Guasti
Hai menzionato il mancato funzionamento di ORM. Questo è assolutamente irrilevante per la tua domanda, la tua applicazione dovrebbe pensare all'ORM e all'archiviazione dei dati come un'unica entità. Se fallisce, fallisce, scavalcare l'ORM per parlare direttamente con l'archiviazione dei dati è non una buona idea.
Bypassare l'ORM per qualsiasi altra cosa
Inoltre non è una buona idea. Tuttavia, può accadere per una serie di motivi:
-
Parti legacy dell'applicazione che sono state create prima che l'ORM sia stato introdotto.
È difficile, e esattamente la situazione che sto trattando con adesso , quindi la mia ripetizione costante di "manutenzione infernale". O si continua a mantenere le parti non ORM o le si riscrive per utilizzare l'ORM. La seconda opzione potrebbe avere più senso inizialmente, ma è una decisione basata esclusivamente su quali sono esattamente le parti della tua applicazione e sulla preziosa riscrittura completa a lungo termine.
Prova a cambiare una chiave in una tabella MySQL 2 * 10 ^ 8 righe mal progettata (senza tempi di inattività) e capirai da dove vengo.
-
Parti non legacy dell'applicazione che devono assolutamente parlare direttamente alla memoria dati:
Ancora più complicato. Gli ORM sono strumenti elaborati e si occupano di quasi tutto, ma a volte si mettono semplicemente in mezzo o addirittura sono assolutamente inutili. La buzzword (veramente la buzzphrase) è disadattamento dell'impedenza relazionale all'oggetto , semplicemente non è tecnicamente possibile che il tuo ORM faccia tutto il tuo database relazionale fa, e per alcune delle cose che fanno, c'è una penalità significativa nelle prestazioni.
Commenti
From the point of data integrity, constraints MUST be on the database, and SHOULD be on the application. What if your application is accessed from a web and a desktop applications, or a mobile app, or a webservice? – Luiz Damim
Questo è il punto in cui l'aggiunta di un ulteriore livello sarebbe estremamente utile, e se stiamo parlando di un'applicazione web andrei con un'API REST. Un design eccessivamente semplicistico per questo sarebbe:
L'ORM si posizionerebbe tra l'API e gli archivi di dati e tutto ciò che si trova dietro l'API (incluso esso) sarebbe considerato una singola entità dalle varie applicazioni.