2009-09-02 6 views
5

qual è la migliore soluzione in termini di prestazioni e "leggibilità/stile di codifica buono" per rappresentare un'enumerazione (Java) (set fisso di costanti) sul livello DB rispetto a un intero (o qualsiasi tipo di dato numerico in generale) vs una rappresentazione di stringa.Come rappresentare al meglio costanti (enumerazioni) nel database (INT vs VARCHAR)?

Attenzione: ci sono alcuni sistemi di database che supportano direttamente "Enum", ma ciò richiederebbe di mantenere la definizione di Enum del database in sincronia con l'implementazione Business-Layer. Inoltre questo tipo di datatype potrebbe non essere disponibile su tutti i sistemi di database e potrebbe anche differire nella sintassi => Sto cercando una soluzione facile, facile da gestire e disponibile su tutti i sistemi di database. (Quindi la mia domanda riguarda solo la rappresentazione Number vs String.)

La rappresentazione numero di una costante mi sembra molto efficiente da memorizzare (ad esempio, consuma solo due byte come numero intero) ed è molto probabile molto veloce in termini di indicizzazione , ma difficile da leggere ("0" rispetto a "1" ecc.)

La rappresentazione di stringa è più leggibile (memorizzazione "abilitata" e "disabilitata" rispetto a "0" e "1"), ma consuma molto più spazio di archiviazione ed è molto probabilmente anche più lento per quanto riguarda l'indicizzazione.

Le mie domande sono, ho perso alcuni aspetti importanti? Cosa suggeriresti di usare per una rappresentazione enum sul livello Database.

Grazie mille!

+0

duplicato esatto: http://stackoverflow.com/questions/229856/ways-to-save-enums-in-database – ChssPly76

risposta

3

Nella maggior parte dei casi, preferisco utilizzare un codice alfanumerico breve e quindi disporre di una tabella di ricerca con il testo espanso. Quando necessario, costruisco dinamicamente la tabella delle enum nel programma dalla tabella del database.

Ad esempio, supponiamo di avere un campo che deve contenere, ad esempio, il tipo di transazione e che i valori possibili sono Sale, Resi, Servizio e Layaway. Creerei una tabella dei tipi di transazione con codice e descrizione, rendere i codici "SA", "RE", "SV" e "LY" e utilizzare il campo codice come chiave primaria. Quindi in ogni record di transazione pubblicherei quel codice. Ciò richiede meno spazio di una chiave intera nel record stesso e nell'indice. Il modo esatto in cui viene elaborato dipende dal motore del database, ma non dovrebbe essere notevolmente meno efficiente di una chiave intera. E perché è mnemonico è molto facile da usare. È possibile scaricare un record e vedere facilmente quali sono i valori e probabilmente ricordare quale è quale. È possibile visualizzare i codici senza traduzione nell'output dell'utente e gli utenti possono capirli. In effetti, questo può darti un guadagno in termini di prestazioni rispetto alle chiavi intere: in molti casi l'abbreviazione è buona per gli utenti - spesso vogliono le abbreviazioni per mantenere le visualizzazioni compatte ed evitare lo scorrimento - quindi non è necessario unirsi alla tabella delle transazioni per ottenere una traduzione

NON memorizzerei assolutamente un valore di testo lungo in ogni record. Come in questo esempio, non vorrei rinunciare alla tabella delle transazioni e memorizzare "Layaway". Non solo questo è inefficiente, ma è del tutto possibile che un giorno gli utenti diranno che vogliono essere cambiati in "Layaway sale", o anche qualche sottile differenza come "Lay-away". Quindi non devi solo aggiornare ogni record nel database, ma devi cercare attraverso il programma per ogni posto in cui questo testo si verifica e cambiarlo.Inoltre, più lungo è il testo, più è probabile che da qualche parte lungo la linea un programmatore lo scriverà male e crei bug oscuri.

Inoltre, disporre di una tabella dei tipi di transazione fornisce un luogo comodo in cui memorizzare ulteriori informazioni sul tipo di transazione. Mai e poi mai scrivere codice che dice "se whatevercode = 'A' o whatevercode = 'C' o whatevercode = 'X' allora ..." Qualunque cosa sia che rende quei tre codici in qualche modo diversi da tutti gli altri codici, metti un campo per nella tabella delle transazioni e testare quel campo. Se dici "Bene, questi sono tutti i codici fiscali" o qualsiasi altra cosa, allora va bene, crea un campo chiamato "tax_related" e impostalo su true o false per ogni valore di codice appropriato. Altrimenti, quando qualcuno crea un nuovo tipo di transazione, deve esaminare tutti gli if/o gli elenchi e capire a chi deve essere aggiunto questo tipo e quale non dovrebbe. Ho letto molti programmi sconcertanti in cui ho dovuto capire perché alcune logiche applicate a questi tre valori di codice ma non altre, e quando pensate che un quarto valore dovrebbe essere incluso nella lista, è molto difficile dire se sia manca perché è davvero diverso in qualche modo, o se il programmatore ha commesso un errore.

L'unico tipo che non creo la tabella di conversione è quando la lista è molto breve, non ci sono dati aggiuntivi da conservare, ed è chiaro dalla natura dell'universo che è improbabile che cambi mai così il i valori possono essere tranquillamente codificati. Come vero/falso o positivo/negativo/zero o maschio/femmina. (E hey, anche l'ultimo, ovvio come sembra, ci sono persone che insistono sul fatto che ora includiamo "transgender" e simili.)

Alcune persone insistono dogmaticamente sul fatto che ogni tabella abbia una chiave intera sequenziale generata automaticamente. Tali chiavi sono una scelta eccellente in molti casi, ma per gli elenchi di codici preferisco il tasto alfa breve per i motivi sopra indicati.

1

Memorizzerei la rappresentazione di stringa, in quanto è facilmente correlata all'enumerazione e molto più stabile. L'uso di ordinal() sarebbe negativo perché può cambiare se si aggiunge una nuova enumerazione al centro della serie, quindi è necessario implementare il proprio sistema di numerazione.

In termini di prestazioni, tutto dipende da ciò per cui l'enumerazione sarebbe utilizzata, ma è molto probabilmente una prematura ottimizzazione sviluppare una rappresentazione separata con conversione piuttosto che utilizzare semplicemente la rappresentazione String naturale.