Devo creare una mappatura Enum nella tabella del mio database

5

Ho una tabella di database contenente un elenco di sistemi rilevanti per lo strumento che sto costruendo, per lo più applicazioni interne o sistemi di terze parti dai quali riceviamo i dati. Questa tabella viene aggiunta raramente, circa ogni 2 mesi.

Uno di questi sistemi è Windows stesso, che è dove archiviamo le LAN dei nostri utenti, e ora devo fare esplicito riferimento all'ID relativo a Windows per interrogare nome utente, team ecc. So che sarebbe una cattiva pratica incorporare l'ID stesso nel codice, quindi la mia domanda è quale sarebbe il modo migliore per evitarlo? Suppongo che le mie opzioni siano:

  • crea una costante globale che rappresenta questo ID
  • crea un enum globale contenente tutti i sistemi ora
  • crea un enum globale e aggiungi sistemi come & quando sono richiesti nel codice
  • recupera l'ID dal database in base al nome del sistema

Apprezzo che questa possa sembrare una domanda banale, ma avrò molte situazioni come questa durante il corso di questa build, e anche se siamo in completo controllo del database mi piacerebbe conformarmi alle migliori pratiche per quanto possibile.

Grazie mille!

    
posta CrazyHorse 27.09.2012 - 14:56
fonte

4 risposte

6

Risposta breve: manterrei i miei dati nel database. L'ultima opzione è buona.

retrieve the ID from the database based on system name

Per poter trattare con garbo gli ID a cui ti stai riferendo, puoi usare Dizionari per caricare tutti gli ID di riferimento dalla tabella del database ( s) nella tua applicazione. A seconda della frequenza con cui questi ID possono cambiare, puoi anche memorizzare in cache questo dizionario per un rendimento molto migliore.

    
risposta data 27.09.2012 - 15:21
fonte
1

Retrieve the ID from the database based on system name

Tutte le altre opzioni implicano la duplicazione dei dati del database nel codice. La progettazione di database e programmi di solito è un processo di riduzione di duplicazione dei dati, non di aumento.

Se stavi partendo da zero, e non ti aspettavi un nuovo sistema molto spesso e c'erano solo pochi sistemi, forse avresti iniziato con un enum. Quando ti sei stancato di ricompilare e rilasciare nuovamente il codice ogni volta che avevi supportato un nuovo sistema, avresti creato una tabella di database. Ma dato che hai già una tabella del database, non riesco a pensare a un motivo per non usarlo.

I now need to explicitly reference the ID relating to Windows to query for user name, team etc.

Semplice:

select u.user_name, u.team, u.other_field
  from user u
  join system s on u.system_id = s.id
  where s.name = 'Windows';

O se lo stesso utente può trovarsi in più sistemi:

select u.user_name, u.team, u.other_field
  from user u
  join user_system_xref usx on usx.user_id = u.id
  join system s on usx.system_id = s.id
  where s.name = 'Windows';

Hmm ... Vedo il tag "Object Oriented" nel tuo post. Immagino che andrò ancora un po 'oltre e che se usi Hibernate, potresti fare qualcosa di simile con una query sui criteri:

Crit<System> crit = Crit.create(System.class);
crit.add(Restrictions.eq("name", "Windows"));
System currSystem = crit.uniqueResult();

for (user : currSystem.getUsers()) {
    System.out.println(user.getName());
    System.out.println(user.getTeam().getName());
}
    
risposta data 27.09.2012 - 18:39
fonte
0

I dati che devono essere modificati devono essere conservati in un file di configurazione o nel database. I dati che devono essere utilizzati nelle query che rappresentano i dati aziendali devono essere nel database. Sceglierei l'integrità rispetto alle prestazioni, specialmente per i dati di piccole dimensioni. Vorrei andare con l'opzione 4. Ricorda che le modifiche al codice richiedono la gestione della versione. Se questa pratica diventerà frequente, trascorrerai un tempo inutile nella gestione delle versioni.

    
risposta data 27.09.2012 - 15:14
fonte
0

Idealmente sarebbe meglio interrogare il database e memorizzare i dati restituiti per uso futuro. La creazione di enumerazioni per tabelle specifiche in cui è necessario l'ID duplica i dati che è possibile ottenere in un altro modo che dovrebbe essere evitato. Detto questo, in molti casi ha più senso, in pratica, creare enumerazioni con questi dati e aggiornarli man mano che si aggiornano le informazioni in quelle tabelle, perché lo sforzo necessario per farlo in modo "corretto" paga solo se le tabelle cambiare un po 'di frequente. Lo sforzo richiesto per aggiornare un enum una volta all'anno aggiungendo una voce o due non è significativo.

Non creare nulla come globale, ma creare una classe di costanti ed esporla solo dove ne hai bisogno. Inoltre sarebbe meglio andare avanti e creare l'intero tavolo come enum ora, questo metodo può diventare davvero brutto se l'enum non viene sincronizzato con il database.

    
risposta data 27.09.2012 - 15:15
fonte

Leggi altre domande sui tag