In primo luogo, voglio dire che questa sembra essere una domanda / area trascurata, quindi se questa domanda necessita di miglioramenti, aiutami a renderla una grande domanda che può essere di beneficio agli altri! Sto cercando consigli e aiuto da persone che hanno implementato soluzioni che risolvono questo problema, non solo idee da provare.
Nella mia esperienza, ci sono due lati di un'applicazione: il lato "task", che è in gran parte guidato dal dominio ed è il punto in cui gli utenti interagiscono pienamente con il modello di dominio (il "motore" dell'applicazione) e il lato di reporting, in cui gli utenti ottenere dati in base a ciò che accade sul lato attività.
Dal lato delle attività, è chiaro che un'applicazione con un modello di dominio avanzato dovrebbe avere una logica aziendale nel modello di dominio e il database dovrebbe essere utilizzato principalmente per la persistenza. Separazione delle preoccupazioni, ogni libro è scritto al riguardo, sappiamo cosa fare, fantastico.
E il lato dei rapporti? I data warehouse sono accettabili o hanno una progettazione errata perché incorporano la logica aziendale nel database e i dati stessi? Per aggregare i dati dal database in dati del data warehouse, è necessario aver applicato la logica aziendale e le regole ai dati e che la logica e le regole non provenissero dal modello del dominio, provenivano dai processi di aggregazione dei dati. È sbagliato?
Lavoro su grandi applicazioni finanziarie e di project management in cui la logica di business è estesa. Quando riferisco su questi dati, avrò spesso MOLTE aggregazioni da fare per estrarre le informazioni richieste per il report / dashboard e le aggregazioni hanno molta logica aziendale in esse. Per motivi di prestazioni, l'ho fatto con tabelle altamente aggregate e stored procedure.
Ad esempio, supponiamo che sia necessario un report / dashboard per mostrare un elenco di progetti attivi (immagina 10.000 progetti). Ogni progetto avrà bisogno di una serie di metriche mostrate con esso, ad esempio:
- budget totale
- sforzo fino ad oggi
- velocità di combustione
- data di esaurimento del budget alla frequenza di combustione corrente
- eccetera.
Ognuno di questi comporta molta logica di business. E non sto solo parlando di moltiplicare numeri o qualche semplice logica. Sto parlando per ottenere il budget, è necessario applicare una scheda con 500 tariffe diverse, una per il tempo di ciascun dipendente (su alcuni progetti, altre hanno un moltiplicatore), l'applicazione delle spese e l'eventuale markup appropriato, ecc. la logica è ampia. Ci sono voluti un sacco di aggregazione e ottimizzazione delle query per ottenere questi dati in un ragionevole lasso di tempo per il client.
Questo dovrebbe essere eseguito prima nel dominio? E le prestazioni? Anche con semplici query SQL, riesco a malapena a ottenere questi dati abbastanza velocemente da consentire al client di essere visualizzato in un tempo ragionevole. Non riesco a immaginare di provare a ottenere questi dati al client abbastanza velocemente se sto reidratando tutti questi oggetti di dominio, mescolando, abbinando e aggregando i loro dati nel livello dell'applicazione o cercando di aggregare i dati nell'applicazione.
Sembra in questi casi che SQL sia bravo a sgranocchiare i dati e perché non usarli? Ma poi hai una logica aziendale al di fuori del tuo modello di dominio. Qualsiasi modifica alla logica aziendale dovrà essere modificata nel modello di dominio e negli schemi di aggregazione dei rapporti.
Sono davvero a corto di come progettare la parte di reporting / dashboard di qualsiasi applicazione rispetto alla progettazione guidata dal dominio e alle buone pratiche.
Ho aggiunto il tag MVC perché MVC è il design du jour e lo sto usando nel mio progetto attuale, ma non riesco a capire come i dati di reporting si adattano a questo tipo di applicazione.
Sto cercando aiuto in questo settore: libri, schemi di progettazione, parole chiave per google, articoli, qualsiasi cosa. Non riesco a trovare alcuna informazione su questo argomento.
MODIFICA E UN ALTRO ESEMPIO
Un altro esempio perfetto che ho incontrato oggi. Il cliente desidera un rapporto per il team di vendita del cliente. Vogliono quella che sembra una semplice metrica:
Per ogni addetto alle vendite, quali sono le loro vendite annuali fino ad oggi?
Ma è complicato. Ogni addetto alle vendite ha partecipato a molteplici opportunità di vendita. Alcuni hanno vinto, altri no. In ogni opportunità di vendita, ci sono più addetti alle vendite a cui viene assegnata una percentuale di credito per la vendita in base al ruolo e alla partecipazione. Quindi ora immagina di passare attraverso il dominio per questo ... la quantità di reidratazione degli oggetti che dovresti fare per estrarre questi dati dal database per ogni addetto alle vendite:
Ottieni tutti i
SalesPeople
->
Per ognuno ottieni i loroSalesOpportunities
->
Per ognuno ottieni la loro percentuale della vendita e calcola il loro importo delle vendite,
quindi aggiungi tutto il loroSalesOpportunity
importo delle vendite.
E questa è UNA metrica. Oppure puoi scrivere una query SQL che può farlo in modo rapido ed efficiente e ottimizzarla per essere veloce.
EDIT 2 - Pattern CQRS
Ho letto del modello CQRS e, sebbene intrigante, anche Martin Fowler afferma che non è stato testato. Come è stato risolto questo problema in passato. Questo deve essere stato affrontato da tutti in un punto o nell'altro. Qual è un approccio consolidato o logoro con una storia di successi?
Modifica 3 - Strumenti / sistemi di segnalazione
Un'altra cosa da considerare in questo contesto sono gli strumenti di reporting. Reporting Services / Crystal Reports, Analysis Services e Cognoscenti, ecc. Tutti si aspettano dati da SQL / database. Dubito che i tuoi dati verranno esaminati in seguito in futuro. Eppure loro e altri come loro sono una parte vitale del reporting in molti sistemi di grandi dimensioni. In che modo i dati per questi vengono gestiti correttamente laddove esiste persino una logica aziendale nell'origine dati per questi sistemi e, eventualmente, nei report stessi?