Riscrivere i calcoli di formula C # in T-SQL

3

Abbiamo un'applicazione a 3 livelli con un client C # che si connette a un servizio Web C # tramite WCF e richiede dati da un database SQL Server.

Una funzione della nostra applicazione è un'app per moduli creata dall'utente in cui i nostri clienti impostano i moduli con campi. I campi si riferiscono a valori che possono essere importati, inseriti dall'utente o calcolati. I calcoli possono essere pensati come Operation / Value / Timeframe. Ogni valore referenziato in un calcolo potrebbe anche essere un valore calcolato. (Si presta attenzione a garantire che i calcoli circolari non esistano.)

Ad esempio, un utente potrebbe impostare un campo che mostra Cash Over / Short che sottrae il valore Total a Account For e Total Accounted For. Questi campi potrebbero a loro volta aumentare le vendite, i pagamenti con carta di credito, i totali di cassa, ecc. Cambiare le vendite di generi alimentari nell'interfaccia utente del modulo attiverebbero una modifica che ricalcola il totale su Account For e la modifica di quel campo attiva il campo Cash Over / Short per ricalcolare stesso.

La complicazione dei calcoli sono valori storici. Alcuni calcoli potrebbero essere formulati in inglese come "Sottrai il valore del totalizzatore di oggi dal valore del totalizzatore di ieri". Oppure, qualcuno potrebbe semplicemente impostare un campo Vendite anno scorso sul valore delle vendite totali esattamente 365 giorni fa.

Tutto questo calcolo viene eseguito nell'interfaccia utente C #. Il codice C # crea alberi di dipendenza e imposta i gestori di eventi quando i valori cambiano. La modifica di un valore attiva un evento e i calcoli che dipendono dal valore modificato vengono ricalcolati.

Abbiamo anche un motore di ricalcolo che verifica che i totali siano corretti prima di apportare modifiche permanenti (ad esempio prima di redigere l'account di qualcuno, quindi è meglio che gli importi siano corretti). Questo motore di ricalcolo utilizza lo stesso motore di calcolo C # su più thread. Ciò comporta penalità di lettura dal database, creazione degli oggetti C #, esecuzione di calcoli e scrittura nel database.

Le dipendenze temporali significano che dobbiamo davvero calcolare in una sorta di ordine del giorno. Potrei usare un qualche tipo di cursore per muoverti giorno per giorno, raccogliere tutti i dati di ogni giorno, capire le dipendenze, unire i valori storici, ma ...

La mia domanda: come ti appresti ad eseguire calcoli complessi definiti dall'utente in modo set-based in SQL? Non vedo come farlo senza RBAR operazioni su ogni valore calcolato.

    
posta Paul Williams 06.07.2013 - 00:08
fonte

1 risposta

1

LINQ to SQL è un'opzione, ed ecco una procedura dettagliata che fa genericamente ciò che hai descritto . Tuttavia, è essenzialmente una soluzione riga per riga.

Entity Framework può anche fornire ulteriori modi per risolvere la tua sfida. Questa domanda SO e questo P.SE Question hanno alcune informazioni rilevanti nel confronto tra L2S ed EF.

Un'altra opzione da considerare è un database noSQL come MongoDB o Cassandra o pick-your-flavor. Le query su dati statici come il tuo esempio di "Vendite dell'anno scorso" possono essere eseguite abbastanza rapidamente all'interno di un database noSQL / non relazionale.

La sfida deciderà dove gestire ciascun calcolo. Generalmente, i calcoli complessi sono fatti meglio nel codice poiché non sono operazioni impostate. Allo stesso modo, i DB relazionali possono ridurre il lavoro a qualcosa che è essenzialmente un'operazione impostata. I DB noSQL forniscono un grado di approccio ibrido, ma possono richiedere la ristrutturazione dei dati. Sfortunatamente, è necessario valutare ogni calcolo e identificare quale sarà l'ambiente ottimale per l'elaborazione.

    
risposta data 10.07.2013 - 19:44
fonte

Leggi altre domande sui tag