2012-07-27 12 views
6

Ho già molti dati esistenti nel mio database e voglio sviluppare un meccanismo a punti che calcoli un punteggio per ciascun utente in base a quali azioni eseguono.Progettazione di un sistema a punti in primavera

Sto implementando questa funzionalità in modo collegabile, in modo che sia indipendente dalla logica principale e si basa su eventi Spring inviati, una volta che un'entità viene modificata.

Il problema è cosa fare con i dati esistenti. Non voglio iniziare a raccogliere punti da ora, ma piuttosto includere tutti i dati fino ad ora.

Qual è il modo più pratico per farlo? Devo progettare i miei plugin in modo tale da fornire un metodo index(), che costringerà il mio sistema a recuperare ogni singola entità dal database, a inviare un EntityDirtyEvent, a sparare i plugin dei punti, per ognuno, e quindi ad aggiornare per lasciare che i punti vengano salvati accanto a ciascuna entità. Ciò potrebbe comportare un sacco di spese generali, giusto?

La cosa più semplice sarebbe quella di creare una stored procedure complessa e quindi fare in modo che index() chiami quella stored procedure. Tuttavia, anche a me sembra una cosa brutta. Dal momento che dovrò scrivere la logica per calcolare i punti in java comunque, perché averlo ancora una volta in SQL? Inoltre, in generale, non sono un fan della suddivisione della logica di business nei diversi livelli.

Qualcuno ha già fatto questo? Per favore aiuto.

risposta

4

In primo luogo, facciamo una distinzione tra la strategia di implementazione e le regole aziendali.

Poiché si dispone già dei dati, prendere in considerazione l'ottenimento di risultati direttamente dai dati. Questo costituisce il modello del dominio dei dati. Progetta il modello di dati per memorizzare tutti i tuoi dati. Quindi, creare una serie di query, visualizzazioni e stored procedure per accedere e aggiornare i dati.

Una volta ottenute tali viste, utilizzare una libreria di accesso ai dati come il modello JDBC di Spring per recuperare questi dati e rappresentarli in oggetti java (elenchi, mappe, persone, tabelle dei punti, ecc.).

Ciò che avete completato fino ad ora non cambia molto, indipendentemente da ciò che accade negli strati superiori del sistema. Questo è chiamato Modello.

Quindi, sviluppare una rule base o implementazione logica che determina, in base a quali input, azioni utente, condizioni dei dati o per tutte le altre condizioni, quali dati sono necessari. In senso matematico, questo è come una matrice. In senso programmatico, questo sarebbe un insieme di istruzioni logiche. Se questo e questo e questo è vero, quindi ottenere questi dati, altrimenti ottenere tali dati, ecc. Questo comprende la logica nel vostro sistema. Quindi è chiamato "Controller".

Non spostare questa logica nelle query/stored procedure/viste.

Quindi finalmente sviluppare un front-end o "console" per questo. Nel caso più semplice, sviluppare un sistema di input della console, che prende un .. e visualizza un insieme di risultati. Questa è la tua "visione" del sistema.

È possibile sviluppare la vista in un'applicazione Web. La precedente vista della riga di comando può ancora essere valida sotto forma di server API riposante.

2

Penso che ci sia un problema da considerare: ho capito che ci sono enormi dati nel Database quindi l'idea di creare un solo meccanismo per calcolare il sistema a punti non potrebbe essere l'approccio migliore.

Infatti, se non si desidera iniziare a raccogliere punti ma includere tutti i dati, è necessario elaborare e calcolare le informazioni che si hanno ora. Sì, la prima volta che eseguirai questo può comportare un sovraccarico, ma come hai detto, hai bisogno di questi dati calcolati.

D'altra parte è possibile includere un altro meccanismo che asseconda le modifiche in un'entità e avvia un processo diverso in grado di calcolare la nuova differenza di puntamento che si applica a questa particolare modifica.

Quindi, è possibile utilizzare un servizio responsabile del calcolo del sistema di puntamento, uno per una singola entità e un altro, potrebbe essere più lungo, in grado di calcolare i punti globali. Anche se non è necessario essere calcolati in tempo reale, è possibile creare un lavoro programmato responsabile dell'avvio.

Infine, so che non è un buon approccio per dividere la logica di business in due livelli (Db + Java), ma a volte è un requisito farlo, ad esempio, se è necessario rispondere rapidamente a una richiesta che finalmente funziona con un sacco di registri Ho trovato alcuni casi che non c'è altra opzione che aggiungere la business logic al database (come stored procedure, ecc.) Per gestire molti dati e restituire il risultato finale al client del browser (es: processo di calcolo in un tempo specifico).

2

Stai cercando di eseguire "bootstrap". L'approccio scelto dipende dalla complessità dei calcoli dei punti. Se le stored procedure o semplici istruzioni di aggiornamento sono la soluzione più semplice, fallo.

Se i calcoli sono complicati, scrivere un processo batch che carichi i dati esistenti, probabilmente ordina prima quelli meno recenti e attiva gli eventi corrispondenti a tali dati come se fossero appena accaduti. Il codice che si occupa di un evento dovrebbe essere esattamente lo stesso codice che gestirà un evento futuro, quindi non sarà necessario scrivere alcun codice aggiuntivo diverso dai processi batch stessi.

Dal momento che si eseguirà questa cosa solo una volta, seguire la soluzione più semplice, anche se è veloce e sporca.

2

Sembra che tu stia andando nella giusta direzione. Sai che vuoi la tua cosa "punti" disaccoppiata dall'applicazione principale. Poiché è implicito che stai già utilizzando la modalità di sospensione (tramite il tag!), Puoi attingere al sistema di eventi di ibernazione (vedere la sezione 14.218). A seconda della dimensione/complessità del tuo sistema, puoi qui collegare i calcoli dei punti (se non si tratta di un sistema grande/complesso), oppure puoi pubblicare il tuo evento per essere prelevato da qualunque software sia in ascolto.

Il punto in entrambi gli approcci progettuali è che nessuno dei due sa o si preoccupa dei calcoli dei punti. Se sei, come sto immaginando, cercando di creare un meccanismo di plugin abbastanza generale, allora pubblichi i tuoi eventi su quel sistema da questo punto di collegamento. Quindi, se non si dispone di plug-in su una determinata installazione/installazione, nessuno riceve/elabora gli eventi. Se si dispone di più plug-in su un'altra installazione/configurazione, ciascuno di essi può decidere quale elaborazione devono eseguire in base all'evento ricevuto. Nel caso del "plugin punti" calcolerebbe il suo valore in punti e lo memorizzerebbe. Nessun processo memorizzato richiesto ....

1

Ci sono due modi diversi. Uno è già noto che - esegue il polling del database per i dati modificati. In quel caso stai colpendo il database quando potrebbero non esserci cambiamenti e potrebbe rallentare il tuo processo.

Secondo approccio: ogni volta che si verifica un cambiamento nel database, il database genera l'evento. Che puoi usare CDC (Change Data Capture). Ridurrà al minimo il sovraccarico.

Potete cercare per altre opzioni in Spring Integration

Problemi correlati