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?