7

Ho applicato le regole aziendali sia al livello dell'applicazione (modelli) che al livello del database (stored procedure che generano errori).Le regole aziendali devono essere applicate sia nel livello applicazione che nel livello database o solo in uno dei due?

Sono stato duplicando i miei convalide in entrambi i posti per alcuni motivi:

  1. Se le condizioni cambiano tra quando vengono controllati nel codice applicazione e quando sono controllato nel database, i controlli delle regole aziendali nel database salveranno il giorno. Il database mi consente anche di bloccare vari record in un modo più semplice rispetto al mio codice applicazione , quindi sembra che lo sia naturale.
  2. Se dobbiamo fare alcuni dati batch inserimenti/aggiornamenti al database direttamente, se percorso mi tutte queste operazioni attraverso le mie stored procedure/funzioni che stanno facendo la regola di business convalide, non c'è alcuna possibilità di me inserire dati errati anche se mi mancano le protezioni che otterrei se stavo facendo un input singolo attraverso l'applicazione.
  3. Mentre rinforzare queste cose solo nel database avrebbe lo stesso effetto sui dati reali, sembra improprio di gettare solo i dati al database di prima del primo fare un buon sforzo per verificare che sia conforme a vincoli e regole aziendali.

Qual è il giusto equilibrio?

risposta

6

È necessario applicare il livello dati per garantire l'integrità dei dati. Questa è la tua ultima linea di difesa, e questo è il lavoro dei DB, per aiutare a rafforzare la sua visione del mondo dei dati.

Detto questo, il lancio di dati indesiderati sul DB per la convalida è una tecnica approssimativa. Tipicamente gli errori sono progettati per essere leggibili dall'uomo piuttosto che leggibili dalla macchina, quindi è inefficiente per il programma per elaborare l'errore dal DB e farne fuori testa o croce.

Le stored procedure sono diverse. Nel passato, le stored procedure erano il modo per gestire le regole aziendali sui livelli dei dati, ecc.

Ma oggi, con i moderni ambienti dei server delle applicazioni, sono diventati, in generale, il luogo migliore per mettere questa logica. Offrono diversi modi per accedere ed esporre i dati (il Web, i servizi Web, i protocolli remoti, le API, ecc.). Inoltre, se le tue regole sono pesanti per la CPU (probabilmente la maggior parte non lo sono) è più semplice scalare i server delle app rispetto ai server DB.

L'ampia gamma di funzionalità all'interno dei server di app offre loro una flessibilità oltre a quella che i server DB possono fare, e quindi gran parte di ciò che è stato spinto indietro nei DB viene estratto con i server DB relegati a " stupida persistenza ".

Detto questo, ci sono certamente vantaggi di prestazioni con Processi memorizzati e simili, ma ora è una cosa di ottimizzazione in cui la domanda diventa "vale la pena perdere la capacità del server di app per il guadagno che otteniamo inserendolo nel server DB ".

per server app, non sto semplicemente parlando di Java, ma .NET e perfino PHP ecc

+0

Qual è la differenza tra l'applicazione della logica aziendale e l'applicazione dell'integrità dei dati? Supponiamo che io abbia una regola aziendale che dice che al massimo 3 persone possono essere assegnate a un supervisore. Quando vado a inserire la persona n. 4, è un errore perché è un errore di integrità dei dati avere> 3 persone per supervisore, o è una violazione delle regole aziendali? Senza bloccare il record del supervisore prima di verificare che ci siano al massimo 2 persone sotto un supervisore quando si fa un inserto, come può il codice dell'applicazione essere sicuro al 100% che questa regola non sarà interrotta? –

+0

@Rednerln - tasso di variazione. Le regole di integrità del database sono considerate verosimilmente più a lungo delle regole aziendali. Il tuo esempio di persone a un supervisore, mi sarebbe difficile giustificare il fatto che un vincolo di database, se lo facessi, avrebbe dovuto essere basato sui dati (udf basato su un'impostazione di configurazione). E se la regola cambia, si deve porre la domanda su cosa fare riguardo ai dati che violano tale principio. Normalmente si vogliono regole del database che siano solo rilassate, non serrate o modificate qualitativamente. –

+0

@Rednerln - in situazioni multimodali, vuoi che le persone siano in grado di raggiungere il tuo livello di accesso DB (viste, forse) con i loro strumenti di BI o qualsiasi altra cosa e sapere che le loro ipotesi sono valide, che il database ha coesione e integrità al suo perimetro. –

2

la logica di business in grado di sedersi in entrambe le località, ma non dovrebbe essere in entrambi. La logica NON dovrebbe essere duplicata perché è facile commettere un errore cercando di mantenere entrambi sincronizzati. Se lo inserisci nel modello, desideri che tutti i dati accedano ai tuoi modelli, inclusi gli aggiornamenti in batch.

Ci saranno compromessi per metterlo nel database vs i modelli applicativi (ecco alcuni della parte superiore della mia testa):

  • I database possono essere più difficile da mantenere e aggiornamento di applicazioni
  • E 'più facile per distribuire il carico se è nel livello applicazione
  • multipli, DBS disparate possono richiedere regole di business scissione (che potrebbe non essere possibile)
3

Se la regola deve essere imposto in ogni momento, non importa da dove provengono i dati o come è stato aggiornato, il database è dove deve essere. Ricordare che i database sono interessati dall'interrogazione diretta per apportare modifiche che influenzano molti record o fare qualcosa che l'applicazione normalmente non farebbe. Si tratta di risolvere un gruppo di record quando un cliente viene acquistato da un altro cliente e desidera modificare tutti i dati storici, l'applicazione di nuove aliquote fiscali agli ordini non ancora elaborati, la correzione di alcuni input di dati non validi. Sono anche interessati a volte da altre applicazioni che non utilizzano il livello dati. Possono anche essere interessati dalle importazioni eseguite tramite programmi ETL che non possono nemmeno utilizzare il livello dati. Quindi, se la regola deve essere seguita in tutti i casi, deve essere presente nel database.

Se la regola è valida solo per casi speciali relativi al funzionamento di questa particolare pagina di input, è necessario che sia presente nell'applicazione. Quindi se un responsabile vendite ha solo cose specifiche che può fare dalla sua interfaccia utente, queste cose possono essere specificate nell'applicazione.

Qualcosa è utile da fare in entrambi i posti. Ad esempio, è sciocco consentire a un utente di inserire una data non in una casella di input che si riferisca a un campo data. Il tipo di dati nel database dovrebbe essere ancora un tipo di dati datetime, ma è meglio controllare alcuni di questi elementi prima di inviarli.

Problemi correlati