Stockage des valeurs enum dans la base de données

FYI: je veux dire explicitement SQL Server 2000-8 et C#. Donc DBMSs avec enum support comme MySql n'est pas le sujet de ma question.

je sais que cette question a été posée plusieurs fois dans SO. Mais je vois quand même dans les réponses que différentes approches sont adoptées pour stocker les valeurs d'enum dans la base de données.

  1. enregistrer enum comme int dans db et extraire la valeur enum (ou l'attribut enum description en utilisant la réflexion) dans code:

    c'est l'approche que j'utilise habituellement. Le problème est que lorsque j'essaie de faire une requête à partir d'une base de données en SSMS, les données récupérées sont difficiles à comprendre.

  2. Enregistrer enum en tant que chaîne de caractères (varchar) en db et la fonte de retour de type int dans le code.

    En fait, c'est peut-être la meilleure solution. Mais (ne riez pas!) il ne se sent pas le droit. Je ne suis pas sûr que sur les cons. (Sauf plus d'espace en db qui est généralement acceptable) ainsi autre chose contre cette approche?

  3. avoir une table séparée en db qui est synchronisée avec la définition enum du code et faire une relation clé étrangère entre votre table principale et la table enum.

    Le problème est quand une autre valeur enum doit être ajoutée plus tard, le code et la base de données doivent être mis à jour. Aussi, il pourrait y avoir des fautes de frappe qui peuvent être une douleur!

en général quand nous pouvons accepter les frais généraux sur db en 2ème solution, quelle serait la meilleure façon de stocker les valeurs d'enum dans db? Y a-t-il une règle générale de conception définie à ce sujet?

Grâce.

21
demandé sur Kamyar 2011-05-25 20:30:41

2 réponses

Il n'existe pas de règle de conception (que je connais), mais je préfère l'approche #1.

  1. Est l'approche que je préfère. C'est simple, et les énums sont habituellement assez compacts pour que je commence à me rappeler ce que les nombres signifient.
  2. c'est plus lisible, mais cela peut vous empêcher de modifier ou de renommer vos valeurs d'énumération quand vous le voulez. Vous perdez un peu de liberté de votre code. Tout d'un coup, vous devez obtenir un DBA impliqué (selon où/comment vous travaillez) juste pour changer un énumérer la valeur, ou souffrir avec elle. L'analyse d'un enum a aussi un certain impact sur la performance puisque des choses comme le local entrent en jeu, mais probablement négligeable.
  3. Quel problème à résoudre? Vous avez encore des nombres illisibles dans une table quelque part, à moins que vous vouliez ajouter le overhead d'une jointure. Mais parfois, c'est la bonne réponse aussi selon la façon dont les données sont utilisées.

EDIT: Chris dans les commentaires avait un bon point: si vous ne descendez approche numérique, vous devriez explicitement attribuer des valeurs de sorte que vous pouvez les réorganiser aussi bien. Par exemple:

public enum Foo
{
     Bar = 1,
     Baz = 2,
     Cat = 9,
     //Etc...
}
19
répondu vcsjones 2011-05-25 16:58:50

une idée que j'ai vu avant qui est votre option 3 plus ou moins

  • Une table dans la base de données (pour les clés étrangères, etc)
  • Un correspondant Enum dans le code du client
  • une vérification de démarrage (via appel de la base de données) pour s'assurer qu'ils correspondent

la table de table de base de données peut avoir un déclencheur ou une contrainte de contrôle pour réduire le risque de changements. Il ne devrait pas avoir de permissions d'écriture car les données sont liées à une sortie de code client, mais il ajoute une sécurité facteur dans le cas où le DBA bollixes up

si vous avez d'autres clients qui lisent le code (ce qui est très courant), alors la base de données contient des données complètes.

7
répondu gbn 2011-05-25 16:56:21