Ha senso utilizzare un cursore per una logica aziendale complessa?

6

Ho a che fare con un set di dati piuttosto esteso. Dopo alcuni join, la tabella di fondazione ha qualcosa come 40 colonne. Le prossime 40 colonne saranno tutte calcolate. Sto cercando di mantenere pulito il mio Java dalla logica di business perché è abbastanza dettagliato, a volte difficile da seguire, e non necessariamente appartiene a un singolo modello. In breve, penso che a causa della vastità della logica aziendale, Java potrebbe essere difficile da seguire per gli utenti futuri.

D'altra parte, ho provato a fare la logica di business in SQL. Tuttavia, supponiamo di avere le colonne A, B, C, D, dove A e B sono dalla tabella di fondazione.

C = A + B
D = C + B

Ora, poiché D dipende da C, ciò richiede una clausola annidata o una clausola with e, di conseguenza, diventa molto caotica molto rapidamente.

Recentemente il mio collega mi ha introdotto a cursori, non qualcosa con cui ho molta esperienza, ma sembrano ideali per questo caso d'uso. Faccio un select...join... per recuperare una vista di base abbastanza grande, quindi uso il cursore per quella vista per scorrere ciclicamente ogni riga e calcolare tutte le colonne aggiuntive. In questo modo, posso fare D = C + B molto più facilmente. Ci sarà ancora un bel po 'di rumore qui, tuttavia sembra che la mia logica di business sarà centralizzata qui. Alla fine di tutti i calcoli, inserirò semplicemente i valori come una riga in una tabella, quindi il mio Java può interrogare quella tabella.

Alcune letture preliminari mi dicono che i cursori non sono consigliabili poiché introducono un sovraccarico aggiuntivo. Tuttavia, se tutto quello che sto facendo sono operazioni puramente aritmetiche per popolare un numero di colonne, l'utente di un cursore è valido? Ho scritto parte del codice ed è facile da seguire e centralizzato.

Capisco che posso fare lo stesso in Java, ma preferisco avere la tabella completamente calcolata disponibile nel mio DB, e sembra che il viaggio di andata e ritorno con Java non sia necessario perché la pulizia del codice non ci sarà molto meglio .

EDIT: Vorrei includere anche che sebbene l'estensione della colonna sia abbastanza grande, la quantità prevista di righe non è poi così grande, è compresa tra 1-2.000. In tal senso, un INSERT in un ciclo sembra non essere troppo male.

    
posta mike 03.05.2016 - 00:03
fonte

2 risposte

11

Vorrei usare una serie di clausole:

WITH some_stuff AS (
  SELECT ...
  FROM ...
  INNER JOIN ... ON 
  ...
),
some_stuff_with_c AS (
  SELECT *,
    a + b AS c
  FROM some_stuff
),
some_stuff_with_d AS (
  SELECT *,
    b + c AS d
) ...

e avvolgere tutto in una vista. Penso che sia abbastanza facile da capire, è solo un elenco di definizioni di colonne. L'utilizzo di SELECT * elimina la ripetizione. Se si dispone di valori intermedi non necessari, è possibile rilasciarli nella SELEZIONE finale. Questo sembra molto più semplice dell'uso di un cursore.

    
risposta data 03.05.2016 - 00:52
fonte
1

I cursori possono essere la soluzione preferita, ma il più delle volte, sono [ab] utilizzati per la logica che sarebbe meglio implementata usando join, case statement, whiles ecc.

Hai affermato questa logica:

C = A + B
D = C + B

Ma D realmente dipende da C? Potresti non scrivere tutte le colonne derivate come una serie di istruzioni a mano lunga, ad es.

C = A + B
D = A + B + B

Se puoi, è discutibile se un cursore sia davvero la soluzione qui.

    
risposta data 03.05.2016 - 15:56
fonte

Leggi altre domande sui tag