Scelta del valore nel codice SQL query vs (Java)

4

Ho bisogno di scegliere uno dei tre valori di un intero usando il valore di una colonna su una colonna nullable di una tabella.

Ci sono almeno due approcci: 1) usare SQL per fare tutto il lavoro: testare valori nulli e scegliere tra gli altri valori, oppure 2) leggere il valore e usare il codice, in questo caso Java, per scegliere.

Quale è "migliore", es. più facile da capire & più mantenibile? Avete altri usi metrici da decidere?

Ad esempio, ho il seguente codice:

// If id is equal to:
//   -1, then make v = 1
//   null, then make v = 2
//   in any other case, make v = 3

// Option 1:
int v;
String query = "SELECT CASE min(Id) WHEN NULL THEN 2 WHEN -1 THEN 1 ELSE 3 END AS Id"
        + "FROM TableA WHERE SomeField IN (SELECT ...blah blah...)";
ResultSet rs = // execute query
if (rs.next()) {
    v = rs.getInt("Id");
} else {
    // TODO something went *very* wrong...
}

// Option 2:
int v;
String query = "SELECT CASE min(Id) Id"
        + "FROM TableA WHERE SomeField IN (SELECT ...blah blah...)";
ResultSet rs = // execute query
if (rs.next()) {
    final int id = rs.getInt("Id");
    if (rs.wasNull()) {
        v = 2;
    } else if (id == -1) {
        v = 1;
    } else {
        v = 3;
    }
} else {
    // TODO something went *very* wrong...
}
    
posta Arturo Tena 11.02.2014 - 19:18
fonte

4 risposte

1

Nell'esempio che offri, non penso che faccia la differenza.

Una cosa importante è essere coerenti con la tua logica, quindi saprai dove cercarla in seguito. Quando si interrogano i database, è meglio tirare solo i dati necessari. Nel tuo esempio, non sembra fare la differenza (stesso numero di record e quantità di dati).

Che cosa hai intenzione di fare quando la tua logica sarà più coinvolta? Potresti scoprire che stai meglio maneggiandolo in Java o in qualche altro linguaggio procedurale di scelta. Questa è probabilmente una preferenza personale, ma potrebbe essere influenzata dalla lingua in cui sei più abile.

Se si desidera disporre di una sorta di libreria di codici per riutilizzare questa logica, non è consigliabile averla nel codice del database. Non tutti i dati provengono dallo stesso database. Cosa succede se si desidera eseguire questa logica su una tabella diversa o colonne diverse? Non sarai in grado di riutilizzare questo codice.

Questi consigli non si basano sul tentativo di pre-ottimizzare o di estendere le cose che non ti servono. Probabilmente sei riuscito a costruire entrambe le soluzioni con lo stesso sforzo. Se pensi che possa verificarsi uno di questi potenziali pit-down, vai in quella direzione ed essere coerente. Il prossimo programmatore lo apprezzerà anche se sei tu.

EDIT: Inoltre, scrivo un sacco di codice SQL nel mio lavoro (come oggetti di database), ma non lo sopporto quando devo scriverli nelle stringhe in altre lingue. I semplici selezioni vanno bene. Più corto è, meglio è.

IDE - il debugger in Java qui sarà probabilmente più utile. Ovviamente puoi testare il tuo sql da qualche altra parte.

Numeri magici: sarebbe più facile nel codice Java rappresentare i tuoi numeri (1,2,3) come variabili / costanti descrittive.

    
risposta data 11.02.2014 - 20:56
fonte
1

La risposta alla tua domanda è un'altra domanda. Perché codifichi questi risultati come numeri interi arbitrari 1, 2, 3? È per alcune API Java esterne o API interne che non puoi modificare? Se è così, quindi eseguire la traduzione in alcuni wrapper Java attorno a tale interfaccia. Ciò impedirà di ripetere questa traduzione in più query.

== Addendum ==

Secondo l'OP, questi sono numeri magici che rappresentano un tipo di evento. In tal caso, vorrei andare avanti e fare la traduzione nella query. Se avessi creato un'altra query che doveva ripetere quella traduzione, avrei considerato la traduzione in una vista. Ma non chiamerei la colonna "ID" risultante, che non mi dice nulla. Lo chiamerei "event_type".

    
risposta data 12.02.2014 - 05:58
fonte
0

In parole semplici:

La prima opzione è migliore, perché:

  1. La parte di SQL utilizzata per le query di scrittura è dichiarativa, non procedurale, quindi intrinsecamente è meno complessa di java, quindi la prima opzione ha meno complessità ciclomatica.
  2. Capire l'SQL è un'abilità molto comune, quindi la manutenzione del codice SQL è più economica. Un programmatore potrebbe non conoscere Java, ma c'è una grande possibilità che lui / lei conosca SQL.

Questa mia risposta ( qui ) a una domanda simile si sviluppa su questo.

Questa altra risposta a un'altra domanda simile supporta anche quella.

    
risposta data 12.02.2014 - 14:07
fonte
-1

Come best practice del settore, abbiamo bisogno di creare una stored procedure per gestire quella logica. Il lavoro del codice Java è quello di eseguire la stored procedure (SP) e ottenere l'output.

Sarà facile cambiando la logica in futuro. Se è SP, abbiamo solo bisogno di modificare la logica modificando la stored procedure.

Se stai scrivendo in java. abbiamo bisogno di costruire e distribuire di nuovo l'intero progetto. Come sviluppatore, commettiamo errori effettuando il check-in o la versione errata del codice da o verso la produzione. Risulterà un problema dopo la distribuzione.

. la stored procedure è sempre la migliore.

    
risposta data 12.02.2014 - 05:42
fonte

Leggi altre domande sui tag