web-dev-qa-db-fra.com

Comment devrais-je représenter un type énuméré dans une base de données relationnelle?

Je travaille sur le développement d'une base de données relationnelle qui suit les transactions qui se produisent sur un périphérique que je travaille pour ma société. Il existe différents types de transactions pouvant survenir sur l'appareil, nous avons donc un champ "TRANS_TYPE" dans l'une de nos principales tables d'enregistrement. Mon groupe a décidé de faire le type de ce champ un entier et de le traiter comme un type énuméré. Mon intuition me dit que ce serait une meilleure idée de rendre ce champ une chaîne de sorte que nos données de base de données soient plus lisibles et utilisables. Mes collègues semblent craigner que cela causerait plus de problèmes que cela ne vaut. Les comparaisons de cette chaîne sont trop coûteuses et la possibilité de fautes de frappe est trop grande d'une barrière.

Ainsi, à votre avis, lorsque vous traitez avec un domaine dans une base de données relationnelle essentiellement une valeur énumérée, constitue-t-il une meilleure décision de conception pour rendre ce champ un entier ou une chaîne? Ou y a-t-il une autre alternative que j'ai négligée?

Remarque: les types énumérés explicites ne sont pas pris en charge par la base de données que nous utilisons. Et le logiciel que nous développons qui s'interfacera avec cette base de données est écrit en C++.

12
c.hughes

Les types énumérés doivent être une table séparée de votre base de données disposant d'un numéro d'identification et d'un nom de chaîne et d'autres colonnes que vous pourriez trouver utiles. Ensuite, chaque type existe comme une rangée dans cette table. Ensuite, dans votre table, vous enregistrez les transactions que le champ "TRANS_TYPE" doit être une clé étrangère à la clé de ce tableau de référence. Ceci est une pratique standard dans la normalisation de la base de données.

De cette façon, vous avez stocké la chaîne de nom officielle, utilisez des comparaisons de numéros pour la performance et d'avoir une intégrité référentielle que chaque transaction a un type valide.

26
Ryathal

Une pratique courante est de créer un trans_types table, puis avez votre table principale la référence avec une clé étrangère nommée trans_type_id. Cela garantit que vos enregistrements ne feront que référence à des types énumérés valides.

Exemple:

 trans_type 
 ----------- 
 ID 
 Nom 
 Transactions [.____] - ------------- 
 ID 
 Trans_Date 
 Détails 
 trans_type_id (fk to trans_type.id) 

Exemple de données:

 
 TRANS_TYPE [.____] 
 id | Nom [.____] ------------ 
 1 | Soumettre 
 2 | Annuler 
 
 
 Transactions 
 
 Id |] id |] id |] id |] id | trans_date | trans_type_id 
 ----------------------------------- [.____] 1 | 2012-12-31 | 1 [.____] 2 | 2013-01-09 | 2 [.____]

Si les valeurs entrent dans la base de données comme entiers, rangez-les de cette façon. Il n'est pas nécessaire de mettre la sur-tête de convertir en chaînes tout en écrivant à la base de données. Vous pouvez toujours nous rapporter à une table de recherche avec les valeurs de chaîne/texte (plus normalisées).

Cela a l'avantage supplémentaire de mettre à jour la valeur de chaîne dans un seul emplacement au lieu d'exécuter une sorte de routine de mise à jour. Au lieu de 1 = 'rouge', il pourrait être égal à "vraiment rouge"

Ce n'est pas idéal pour les performances de la déclaration par rapport à une seule table avec des valeurs de chaîne (dénormalisation). Un index sur ce champ rendrait suffisamment la performance.

La plupart des RDBM permettront une puissance suffisante. Bien que votre idée d'être capable de "lire" la table dans sa forme de données unis, rejoindre une table n'est pas une grosse affaire. Il suffit d'obtenir l'habitude d'utiliser une vue ou un autre objet similaire.

3
JeffO

Je dois être en désaccord avec les autres réponses à cette question préconisant l'approche de la table de dénombrement séparée.

Cependant, je suis certainement en faveur de ne pas répéter ce qui a déjà été dit, je vais donc simplement vous référer à la réponse acceptée à (plus ou moins) la même question sur le débordement de la pile: https://stackoverflow.com/A/229919/114626

2
Eyal Roth