Vincoli dati complicati - Regole aziendali o vincoli di database?

5

Ho ereditato un progetto che include un database (MS SQL Server) pieno di dati non validi. L'ho pulito manualmente, che è stato un processo faticoso e noioso sto lavorando per modernizzare l'applicazione (ASP.NET MVC w / EF6).

Una delle tabelle è per il tracciamento di un oggetto in quanto vari processi vengono eseguiti su di esso attraverso la struttura dell'organizzazione. Ci sono molte regole che entrano in questa tabella per assicurarsi che lo stato di un oggetto sia valido. Alcune delle molte regole includono:

  • Un elemento ha un processo solo su di esso se quel processo è valido per il lavoro a cui è assegnato l'articolo. (semplice ricerca per verificare)
  • Il processo B non può essere eseguito fino a quando il processo A non è stato contrassegnato come completo (cercare un record nel database che Employee X abbia completato il processo A, tenendo presente che un dipendente può avere un record che ha lavorato su un processo, ma non ha completalo)
  • Il dipendente 1 non può contrassegnare un processo completato su un articolo se lo stava lavorando con Employee 2, ma Employee 2 è ancora controllato nell'elemento per quel processo (più dipendenti possono lavorare su un articolo per lo stesso processo al stessa ora).
  • Non dovrebbe mai esserci un'ora di inizio per il processo B che si verifica prima del tempo di completamento del processo A.

Ci sono alcune altre regole, ma quelle dovrebbero dare a chiunque una sensazione per il tipo di vincoli che sono necessari. Sono stato in grado di creare CHECK CONSTRAINTS per alcune cose, come un processo che è valido per un particolare articolo, gli orari di inizio sono sempre prima dei tempi di fine, ecc. Tuttavia, alcune delle regole più complicate che richiedono ricerche prima dell'inserimento, aggiornamenti o eliminazioni (come descritto sopra) Non sono sicuro che dovrebbero essere regole aziendali all'interno dell'applicazione o una procedura trigger / memorizzata che impedisce l'inserimento / l'aggiornamento / la rimozione di dati che potrebbero causare uno stato non valido per un articolo.

Suppongo di non essere sicuro se sia giusto consentire il potenziale di uno stato non valido se qualcuno tenta di eseguire una query C_UD direttamente sul database. Se questo è il caso, è abbastanza chiaro che queste sarebbero le migliori regole aziendali che posso avere all'interno di un'entità, ma potrebbe essere più veloce avere il database a gestire queste operazioni, poiché la velocità di lettura è molto più importante della velocità di scrittura per questa applicazione . Qual è il consenso su dove all'interno dello stack di un'applicazione dovrebbero risiedere questi tipi di vincoli?

    
posta JNYRanger 24.01.2017 - 17:45
fonte

1 risposta

13

Per regole complicate, quasi sempre le vuoi implementare in codice non nel database, specialmente nel mondo moderno. I vantaggi nel codice sono:

    Il codice
  • è molto più capace di funzioni logiche avanzate - cose come l'inversione del controllo e l'iniezione delle dipendenze rendono le regole molto più facili da implementare in modo flessibile.
  • Il codice
  • è molto più leggibile dei vincoli db per la maggior parte degli sviluppatori; è anche significativamente più facile controllare e implementare la versione
  • Il codice
  • è molto più facile da testare: non è necessario creare un mock up del DB per simulare i vincoli per testare i vincoli.
  • Il codice
  • è molto più semplice da modificare: cosa succede quando una regola cambia che è stata implementata come un vincolo di DB, ma è necessario lasciare che i dati per le vecchie cose rimangano mentre si cambiano nuovi elementi? Ciò diventa molto, molto difficile con i vincoli di DB.

I vincoli di DB non sono del tutto inutili, ma è meglio lasciarli a scenari arretrati che non dovrebbero mai accadere. Come una riga d'ordine senza un ID ordine associato. Ma gli elementi aziendali dovrebbero essere mantenuti nel livello di codice, ove possibile.

    
risposta data 24.01.2017 - 18:11
fonte