2009-10-23 10 views
16

Nella mia applicazione ho un numero di enumerazioni che vengono utilizzate come tipo di proprietà in alcune classi.Il modo migliore per memorizzare i valori enum nel database - String o Int

Qual è il modo migliore per memorizzare questi valori nel database, come String o Int?

FYI, mapperò anche questi tipi di attributo utilizzando Nhibernate fluente.

codice di esempio:

public enum ReportOutputFormat 
{ 
    DOCX, 
    PDF, 
    HTML 
} 

public enum ReportOutputMethod 
{ 
    Save, 
    Email, 
    SaveAndEmail 
} 

public class ReportRequest 
{ 
    public Int32 TemplateId 
    { 
     get { return templateId; } 
     set { templateId = value; } 
    } 
    public ReportOutputFormat OutputFormat 
    { 
     get { return outputFormat; } 
     set { outputFormat = value; } 
    } 

    public ReportOutputMethod OutputMethod 
    { 
     get { return outputMethod; } 
     set { outputMethod = value; } 
    } 
} 

risposta

13

Entrambi hanno vantaggi. Se li memorizzi in base al loro valore Integer, devi essere attento a modificare la tua enumerazione più tardi nel tuo progetto. Se in qualche modo i valori interi per gli elementi di enumerazione vengono ridefiniti, tutti i dati saranno danneggiati. Ma sarà il tipo di dati più veloce/più piccolo da utilizzare.

Se si utilizza la rappresentazione di stringa, non si avrà il problema del valore ridefinito finché non si modifica il nome degli elementi nell'enumerazione. Tuttavia le stringhe occupano più spazio nel database e sono probabilmente un po 'più costose in uso.

Alla fine, non c'è un vincitore definitivo, immagino.

Modifica

Utilizzando il valore intero potrebbe essere il modo migliore. Puoi superare il problema del "valore ridefinito" per gli elementi di enumerazione, impostando tu stesso il valore per ogni elemento. Davvero un buon suggerimento da parte di Kevin.

+2

Non riesco a credere che potresti anche considerare la metà di raccomandare un approccio che potrebbe facilmente portare alla corruzione dei dati! Appena fuori da una preoccupazione immaginata per la compattezza? Se la preoccupazione di compattezza è così forte, aggiungi un campo int all'enum! MAI fare affidamento sull'ordinale. Leggi efficace Java. –

+13

Davvero non vedo dove sto raccomandando nulla per essere onesti. Sto solo affermando vantaggi e svantaggi. Sebbene tu abbia un punto, non volendo contare sul valore ordinale, potresti voler trasformare quel "fuoco" nel tuo commento in una tacca;) – pyrocumulus

+0

@KevinBourrillion Che cosa significa "aggiungere un campo int all'enum" significa? – John

16

L'implementazione è facile in entrambi i casi, e le differenze di prestazioni dovrebbe essere minore.

Pertanto, andare al significato: le stringhe sono più significative dei numeri, quindi utilizzare la stringa.

+5

+1 Ho lavorato con milioni di record. Solo allora ho capito che il significato era molto più importante della "compattezza". – Sarmaad

+0

A volte le prestazioni sono più importanti, per non perdere il significato. Quindi scegli il tuo veleno e determina quale ha più valore. – Suncat2000

Problemi correlati