2009-10-23 8 views
16

J'ai un certain nombre d'énumérations dans mon application qui sont utilisés comme type de propriété dans certaines classes.Meilleure façon de stocker des valeurs enum dans la base de données - Chaîne ou Int

Quelle est la meilleure façon de stocker ces valeurs dans la base de données, comme String ou Int? FYI, je vais aussi cartographier ces types d'attributs en utilisant le Nhibernate fluide.

Exemple de code:

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; } 
    } 
} 

Répondre

13

Les deux ont des avantages. Si vous les stockez avec leur valeur Integer, vous devez veiller à modifier votre énumération plus tard dans votre projet. Si les valeurs entières des éléments d'énumération sont redéfinies, toutes vos données seront corrompues. Mais ce sera le type de données le plus rapide/le plus petit à utiliser.

Si vous utilisez la représentation sous forme de chaîne, vous n'aurez pas le problème de valeur redéfinie tant que vous ne modifiez pas le nom des éléments de l'énumération. Cependant, les chaînes occupent plus d'espace dans votre base de données et sont probablement un peu plus coûteuses. En fin de compte, il n'y a pas de gagnant définitif, je suppose.

Modifier

Utilisation de la valeur entière pourrait être la meilleure façon. Vous pouvez résoudre le problème de la «valeur redéfinie» pour les éléments d'énumération en définissant vous-même la valeur de chaque élément. En effet une bonne suggestion de Kevin.

+2

Je ne peux pas croire que vous considériez même à moitié recommander une approche qui pourrait facilement entraîner la corruption de données! Tout juste sorti d'un souci imaginaire de compacité? Si le souci de compacité est aussi fort, ajoutez un champ int à l'énumération! Ne comptez JAMAIS sur l'ordinal. Lire Java efficace. –

+13

Je ne vois vraiment pas où je recommande quelque chose pour être honnête. Je ne fais qu'énoncer les avantages et les inconvénients. Bien que vous ayez un point, ne voulant pas compter sur la valeur ordinale, vous voudrez peut-être tourner ce 'feu' dans votre commentaire d'un cran;) – pyrocumulus

+0

@KevinBourrillion Que signifie "ajouter un champ int à l'énumération"? – John

16

La mise en œuvre est facile dans les deux cas, et les différences de performance devraient être mineures.

Par conséquent, optez pour la signification: les chaînes sont plus significatives que les numéros, utilisez donc la chaîne.

+5

+1 J'ai travaillé avec des millions d'enregistrements. C'est seulement alors que j'ai réalisé que le sens était beaucoup plus important que la «compacité». – Sarmaad

+0

Parfois, la performance est plus importante, de peur que le sens soit perdu. Alors choisissez votre poison et déterminez lequel a plus de valeur. – Suncat2000