Quali sono gli argomenti a favore o per mettere la logica dell'applicazione nel livello del database?


74

NOTA Il pubblico di programmers.se e dba.se è diverso e avrà punti di vista diversi, quindi in questo caso penso che sia valido duplicare Quali sono gli argomenti a favore o per mettere la logica dell'applicazione nel livello del database? su programmers.se.

Non ho già trovato discussioni su dba su questo, e il post originale dice tutto, quindi:

La maggior parte degli sviluppatori di software desidera mantenere la logica dell'applicazione nel livello dell'applicazione e probabilmente ci sembra naturale mantenerla qui. Gli sviluppatori di database sembrano voler mettere la logica dell'applicazione nel livello del database, come trigger e procedure memorizzate.

Personalmente preferirei mantenere il più possibile il livello applicazione per rendere più semplice il debug e mantenere separate le responsabilità dei livelli.

Cosa ne pensi e cosa dovrebbe o non dovrebbe essere ok implementare a livello di database?

NB Non sono il PO per quella domanda, ma ho lasciato intatta la formulazione originale.


4
Confrontando le risposte qui e su SO, il divario è evidente. Gli sviluppatori protestano per i ritardi derivanti dalla centralizzazione dei processi nel database, ma per i DBA è una buona cosa. Forzare le persone a dedicare più tempo e impegno alla richiesta di una nuova vista o sproc riduce il numero di punti di contatto con i dati, facilitando il mantenimento della coerenza e riducendo il numero di punti di ottimizzazione.
Jon of All Trades,

Mi sembra che le risposte qui assumano un certo modo di utilizzare il database (applicazioni multiple, consentendo ad alcuni utenti l'accesso diretto al database, ecc.) Penso che sia la ragione principale della differenza.
JMD Coalesce,

Risposte:


56

Pensieri assortiti ...

Il codice del database sopravviverà alla tecnologia client dell'applicazione. Pensa a ADO.NET -> Linq -> EF e ORM assortiti. Considerando che è ancora possibile eseguire il codice SQL Server 2000 dall'ultimo millennio su tutte le tecnologie client di cui sopra.

Hai anche il problema con più client: ho .net, java ed Excel. Sono 3 serie di logiche applicative.

La "logica di business" non deve essere confusa con la "logica di integrità dei dati". Se hai clienti che iniziano transazioni e fanno assegni assortiti, ci sono molte chiamate db e una transazione lunga.

La logica dell'applicazione non viene ridimensionata per volumi di dati elevati. Abbiamo 50k righe al secondo usando i proc memorizzati. Una squadra sorella che utilizza Hibernate non può ottenerne una al secondo


Finché rimani con database relazionali
JMD Coalesce,

1
@JMDCoalesce: hai ancora bisogno della logica di business e potresti avere più app client. Qual è il tuo punto?
gbn,

40

Voglio tutta la logica che deve essere applicata a tutti gli utenti e a tutte le applicazioni nel database. Questo è l'unico posto sano per dirlo.

L'ultima Fortune 500 a cui ho lavorato ha avuto applicazioni scritte in almeno 25 lingue colpendo il loro database OLTP. Alcuni di questi programmi passarono alla produzione negli anni '70.

L'alternativa all'implementazione di questo tipo di requisiti nel database è quella di consentire a tutti i programmatori di applicazioni di reimplementarli in tutto o in parte al 100% correttamente, ogni volta che accendono il loro editor, dal giorno in cui camminano per la prima volta fino a quando la società esce attività commerciale.

Quali sono le probabilità?

Non è questo il singolo più grande " non ripeterti " sul pianeta?


Questo vale solo se più applicazioni utilizzano un solo database
JMD Coalesce,

1
@JMDCoalesce che è comune in molti ambienti. App principale, report Excel, report lato server, estratti in blocco: presto si aggiunge. Quasi ogni applicazione bancaria ha una miriade di app client,
gbn

Sicuro ma non tutte le applicazioni sono per il settore bancario.
JMD Coalesce,

29

Sto spostando la mia vecchia risposta inedita da programmers.se, poiché le risposte sembrano piuttosto polarizzate tra i siti.

So di essere qui per un mondo ferito, ma inserisco la logica aziendale nel database perché:

  • Puoi consentire agli utenti business power l'accesso diretto al database e non preoccuparti che si rovinino (o preoccupati meno di quanto faresti con la logica basata su app)
  • Un utente esperto può creare nuovi report senza attendere una nuova versione del software.
  • È possibile testare il codice SP / TRIGGER in una copia del database, proprio come testare la logica basata su app
  • Puoi mantenere l'SQL per creare sp e trigger nei file di testo (dovresti farlo comunque per il codice tabella / vista)
  • È possibile combinare le lingue senza eseguire il porting della logica aziendale
  • È possibile apportare modifiche alla logica aziendale senza aggiornare ogni bit di software
  • La struttura di controllo cambia nello stesso modo in cui si verifica l'attività del database, mediante la registrazione
  • Sicurezza notevolmente migliorata e controllo di accesso accurato (la maggior parte delle implementazioni logiche basate su app utilizzano il proprio modello di sicurezza, quindi i dati sono molto più facili da compromettere. La crittografia della password reversibile non è rara)
  • La sicurezza dell'utente lato database riduce notevolmente il danno / furto che SQL può fare

I contro sono: - Gli sviluppatori sono minacciati quando gli utenti diventano meno dipendenti dagli sviluppatori per i report personalizzati - Gli sviluppatori devono imparare un altro linguaggio di programmazione

Nessuno di questi dovrebbe essere importante per uno sviluppatore esperto.

È interessante notare che la maggior parte delle risposte parla di "logica dell'applicazione", non di "logica aziendale", come se il software non fosse presente per fornire una funzione aziendale.


1
* I processi / trigger memorizzati possono fornire un livello di astrazione che consente di apportare modifiche strutturali al database senza dover modificare tutto il codice dell'applicazione. * Non tutti gli utenti del database useranno fedelmente il tuo middleware. * Dai, una chiave esterna è una regola commerciale !! * Rimuovere tutti i controlli / vincoli / codice dal db significa che non può proteggersi da incoerenze / corruzioni. * Ogni app non richiede progetti senza transazione basati sulla coda come quello sviluppato da eBay dopo il successo e la possibilità di costruirlo. * SQL non è poi così difficile, gente.
Craig

23

Il problema più importante è se qualsiasi "livello" sopra il database pensa di possedere i dati. La concorrenza e l'integrità dei dati sono problemi per i quali la soluzione è un RDBMS: alcune applicazioni sono sviluppate come se il database fosse solo il loro bit bucket personale e, naturalmente, finiscono per provare a reinventare la ruota in tutti i modi, nonché essere irreparabilmente interrotto non appena un'altra applicazione accede allo stesso database


1
Penso che chiunque sponsorizzi il sistema possieda i dati: li hanno pagati. Inoltre risolvo molti problemi di concorrenza prima che colpiscano il database - in molti casi è molto più semplice.
AK,

4
stai usando "proprio" in un senso diverso da me: il mio punto è che se "risolvi" i problemi di concorrenza prima che colpiscano il database, devi anche assicurarti che le tue siano le uniche applicazioni che colpiscono il database o devono essere risolte ancora una volta a quel livello. Sono d'accordo con la risposta più votata: "Il codice del tuo database sopravviverà [probabilmente] alla tecnologia della tua applicazione client".
Jack Douglas,

17

Ho scritto la mia risposta a questa nel mio blog . La mia conclusione è che farlo nell'applicazione non si ridimensiona una volta considerato l'intero ciclo di vita dell'applicazione.

...
3. Aggiungere vincoli di integrità / controllo al database sottostante,con codice più complesso implementato nel linguaggio delle procedure memorizzate del database. Da questo abbiamo una posizione centrale da mantenere e otteniamo l'applicazione assoluta delle regole anche per le applicazioni che non conosciamo! Otteniamo una lingua per esprimere le regole aziendali in tutto il portafoglio di applicazioni e il ciclo di vita, poiché la lingua del giorno cambia molto più spesso rispetto al database. Funziona su un sistema già critico come le applicazioni più importanti. Gli errori sono gestiti dal codice esistente che gestisce gli errori del database in tali applicazioni. Esiste ancora il rischio che un'applicazione si rompa naturalmente, ma dei tre scenari, questo è il minimo e solo l'applicazione interrotta necessita di modifiche, non tutti (e la maggior parte dei meccanismi di SP / database consentirà di fare un'eccezione per un'applicazione se è davvero, davvero necessaria). Pensi che questo non abbia importanza nel tuo sito greenfield o piccola azienda? Bene, se la tua attività ha successo, tra 30 anni vorrai aver prestato attenzione alla mia saggezza!

... Alcune [obiezioni] che sento spesso:

  • È difficile controllare la versione del codice SP distribuito nel DB. Non penso che sia più vero che dire che è difficile controllare la versione del codice Java distribuito in un server di app, vale a dire, non è affatto difficile, è banale. E in Ruby-land, interi libri sono scritti proprio su come ottenere il codice da un ambiente di sviluppo alla produzione, qualcosa con cui nessun'altra comunità linguistica sembra lottare. Tuttavia, la versione che controlla una procedura memorizzata è apparentemente troppo difficile.
  • Le procedure memorizzate sono difficili da testare. Questo è strano. Per cominciare, gli SP sono fortemente tipizzati; il compilatore ti dirà se esiste o meno un percorso di codice che non ha senso e, almeno in Oracle, calcolerà tutte le dipendenze per te. Quindi questa è una serie di test di unità comuni che potresti aver bisogno in Ruby eliminati fuori dal pipistrello. Per testare il codice OO è necessario prendere in giro per forzare l'oggetto nello stato interno necessario per rappresentare lo scenario di test: in che modo l'impostazione dei dati di test è diversa? Esiste inoltre un produttore TAP per PL / SQL e altri strumenti. Ci sono anche debugger e profiler.
  • Una lingua di procedura memorizzata non è una lingua completa. Bene, non stiamo cercando di scrivere un'intera applicazione solo nelle procedure memorizzate! La maggior parte dei linguaggi SP dedicati ha tutti i costrutti moderni che ci si aspetterebbe e, almeno in Oracle, è possibile utilizzare le procedure memorizzate Java con tutte le funzionalità linguistiche con cui gli sviluppatori OO hanno familiarità o le procedure esterne in qualsiasi lingua. Ciò che conta è dove viene implementata la logica - in un posto, vicino ai dati - il linguaggio reale è solo un dettaglio. PL / SQL si compila in codice nativo ed esegue in-process con il database; non esiste un'architettura dalle prestazioni più elevate di quella.
  • Non voglio imparare un'altra lingua. Trascurando per un secondo questa è un'enorme bandiera rossa in qualsiasi sviluppatore (in particolare uno che propone di modificare app di produzione che potrebbero essere comunque in altre lingue!) C'è molto da imparare a lavorare in qualsiasi ambiente moderno: un tipico negozio Java potrebbe avere Eclipse , WebLogic, Maven, Hudson, Anthill, Subversion e un'intera pletora di altri, che devi imparare prima di scrivere una singola riga di codice dell'applicazione. Una conoscenza pratica di un linguaggio SP di altissimo livello è semplice in confronto, e molto probabilmente ci sarà uno specialista o un DBA in giro per aiutarti. Per non parlare del fatto che il preferito dagli sviluppatori Hibernate ha un suo linguaggio di query ...

...


12

SQL fa cose come impostare la logica e il filtraggio dei risultati orientato all'applicazione? SQL è un linguaggio di manipolazione set meraviglioso.

Inoltre, come indicato in precedenza da GBN, il codice SQL sopravviverà quasi universalmente al codice dell'applicazione.

Sebbene sia vero che EF o NHibernate o LinqToSql o qualsiasi altra cosa ti consentano di generare codice più velocemente, ogni programmatore degno delle sue prestazioni sa che solo l'ottimizzazione dell'SQL ottimizzerà il recupero dei dati. RDBMS capisce solo SQL, quindi devi trasformare tutto in SQL prima che sia detto e fatto. (supponendo che possiamo concordare sul fatto che TSQL e PLSQL sono ancora SQL)


11

Uno svantaggio che le persone non stanno necessariamente discutendo - i professionisti sono stati esauriti qui - è il costo.

Le CPU sul server di database sono spesso le CPU più costose in qualsiasi organizzazione quando si paga il costo della licenza del software. Quindi spostare la logica di business al livello dati è qualcosa che dovrebbe essere fatto con giudizio, non necessariamente in modo uniforme.


7

Qui è dove l'incontro delle menti, vale a dire le menti degli sviluppatori (DV) e dei DBA, deve inevitabilmente avvenire. Lavorare con Business Logic (BL) e archiviarlo in un database può avere un impatto che può glorificare o sconvolgere la sua implementazione.

Per alcuni prodotti RDBMS, esistono librerie / strumenti / API superiori per la logica aziendale e le infrastrutture di oggetti che si possono apprendere e impiegare rapidamente nelle loro applicazioni. Per altri RDBMS, non esistono librerie / strumenti / API.

In passato, le app del server client trasformavano il bridge in BL tramite Stored Procedures (SP). Per prodotti come Oracle e SQL Server, questo è stato fatto in anticipo. Con la creazione di database open source come PostgreSQL e MySQL, quelli che li utilizzavano rischiavano di aprire nuove strade con le procedure memorizzate in BL. PostgreSQL è maturato molto rapidamente in questo, poiché non solo sono state implementate le procedure memorizzate ma anche la capacità di creare le lingue dei clienti. MySQL sostanzialmente ha smesso di evolversi nel mondo delle procedure memorizzate ed è arrivato in una forma ridotta di un linguaggio con molte restrizioni. Pertanto, quando si tratta di BL, si è completamente in balia di MySQL e del suo linguaggio Stored Procedure.

Rimane davvero solo una domanda: indipendentemente dal RDBMS, BL dovrebbe risiedere in tutto o in parte nel database?

Pensa allo sviluppatore. Quando le cose vanno male in un'applicazione, il processo di debug farà entrare e uscire dallo sviluppatore da un database per seguire le variazioni di dati che possono essere o meno corrette in modo intermittente. È come codificare un'applicazione C ++ e chiamare il codice Assembler nel mezzo. Devi passare da codice sorgente, classi e strutture a interruzioni, registri e offset E INDIETRO !!! Questo porta il debug allo stesso livello.

Gli sviluppatori potrebbero essere in grado di elaborare un metodo ad alta velocità per eseguire BL in combinazione con le configurazioni del linguaggio (flag del compilatore per C ++, impostazioni diverse per PHP / Python, ecc.) Tramite oggetti business che si trovano in memoria anziché in un database. Alcuni hanno provato a collegare questa ideologia per un codice runnng più veloce nel database scrivendo librerie in cui il debug di Stored Procedure e trigger è ben integrato nel database e apparentemente utilizzabile.

Pertanto, allo sviluppatore viene richiesto di sviluppare, eseguire il debug e mantenere il codice sorgente e BL in due lingue.

Ora pensa al DBA. Il DBA vuole mantenere il database snello e significare il più possibile nel regno delle procedure memorizzate. Il DBA potrebbe vedere BL come qualcosa di esterno al database. Tuttavia, quando SQL richiede i dati necessari per BL, SQL deve essere snello e medio.

Ora, per l'incontro delle menti !!!

Lo sviluppatore codifica SP e utilizza metodi iterattivi. DBA guarda la SP. DBA determina che una singola istruzione SQL può sostituire i metodi iterattivi scritti dallo sviluppatore. Lo sviluppatore vede che l'istruzione SQL suggerita dal DBA richiede la chiamata di altro codice BL correlato o SQL che non segue i normali piani di esecuzione dell'istruzione SQL.

Alla luce di ciò, la configurazione, l'ottimizzazione delle prestazioni e la codifica SP diventano una funzione della profondità e dell'intensità dei dati di BL per il recupero dei dati. Maggiore è la profondità e l'intensità dei dati del BL, più sviluppatori e DBA devono trovarsi sulla stessa pagina per la quantità di dati e la potenza di elaborazione fornita al database.

CONCLUSIONE

Le modalità di recupero dei dati dovrebbero sempre coinvolgere sia i campi degli sviluppatori sia i campi DBA. Si devono sempre fare delle concessioni su quali metodi di codifica e paradigmi di recupero dei dati possano lavorare insieme, sia per la velocità che per l'efficienza. Se la preparazione dei dati da gestire per il codice sorgente viene eseguita una sola volta prima che il codice ottenga i dati, il DBA dovrebbe dettare l'uso di SQL snello e medio. Se il BL è qualcosa con cui il DBA non è in sintonia, le redini sono quindi nelle mani dello sviluppatore. Questo è il motivo per cui il DBA dovrebbe vedere se stesso e parte del team di progetto e non un'isola per se stesso, mentre lo sviluppatore deve consentire a DBA di perfezionare l'SQL se lo giustifica.


4

È una bella domanda da porre in un sito Web pieno di DBA. Speriamo che la maggior parte delle risposte siano "pro" per mantenere il database in uno stato ACID, e quindi mantenere la logica di business nel database. :-)

Per quanto riguarda la mia opinione, penso che dovresti implementare la logica di business sia nelle tue applicazioni che nei tuoi database. Questo approccio avrà un costo maggiore in termini di tempo e denaro, ma di conseguenza penso che avrà una soluzione aziendale qualitativa migliore.


1
La stessa logica in due strati?
dezso,

Se vuoi creare un nuovo cliente e devi memorizzare il suo nome e un numero cliente (che contiene sempre 4 numeri), vorrei che l'applicazione controllasse se il numero cliente è valido, prima di inviare un'istruzione SQL al mio database (sapendo che l'istruzione non passerà la mia logica di business nel database).
Ruud van de Beeten,

2
Tutta la logica di business dovrebbe essere implementata nel database (quindi non dividere la "logica"). Tutto ciò che puoi facilmente controllare nelle applicazioni (ad es. Con espressioni regolari in Javascript) è meno lavoro per il database (in caso di input non valido).
Ruud van de Beeten,

2
+1 questo è quello che faccio: lo chiamo semplicemente "inserendo il login aziendale nel database e inserendo i controlli di convenienza nell'app"
Jack Douglas,

1
Devi avere un approccio sistematico per farlo funzionare. La logica di integrità del core che rende i dati sempre corrispondenti alle aspettative deve essere eseguita prima nel database. Mantenere una buona comunicazione all'app dal database delle condizioni eccezionali e il cliente che riesce a comunicarle adeguatamente all'utente viene dopo. Quindi anticipare quelli prima di fare un viaggio nel database sarà la parte più duplicativa e dovrà necessariamente essere mantenuta sincronizzata - se puoi minimizzare la necessità di mantenerli sincronizzati, ti conviene.
Cade Roux,

2

Come ha detto Adam Musch sopra, c'è altro da considerare qui per la performance. Uso della CPU. Utilizzo della memoria.

Blocca ovviamente cose sbagliate dal raggiungere il database.

  • Elimina gli indirizzi email che non sono conformi in qualche modo di base.
  • Controlla le lunghezze

Quando si approfondisce, è necessario prendere le decisioni. Il server DB è un posto molto costoso per fare cose che il client potrebbe fare facilmente. esempio: formattazione dei dati, formattazione delle date, assemblaggio di stringhe, ecc. lato client.

Ti occupi di matematica / elaborazione sul client o sul server DB? Per me ciò dipende dalla complessità e dal numero di record coinvolti. La logica aziendale dovrebbe davvero essere eseguita nel DB stesso in modo che tutto sia trattato allo stesso modo.
Dovresti davvero creare un'API di viste per leggere e archiviare i proc per scrivere i dati nel DB per salvarti il ​​mal di testa in futuro.

Usa i punti di forza di ciascuna estremità a tuo vantaggio.

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.