web-dev-qa-db-fra.com

Quel type de données dois-je utiliser: Enum, Tinyint ou Char?

Je crée une nouvelle table et je voudrais le faire correctement. La table sera une liste des membres avec leur type professionnel et leur décile associé.

Le type professionnel est une chaîne de 3 caractères. Il n'y a que 8 chaînes autorisées pour ce champ. Devrais-je utiliser Enum ou Char (3) ou quelque chose de mieux?

Le décile peut être n'importe quel nombre entre 1 et 10, mais seulement ces chiffres. Devrais-je utiliser un tinyint enum ou quelque chose de mieux?

Quelles sont les meilleures options d'efficacité?

4
NorthMikeDBA

Enums me faire peur à cause de tout problème en ce qui concerne l'ajout/supprimer des valeurs de type. Vous êtes probablement mieux en train de représenter à la fois ProfessionalType et Decile comme TINYINT ou CHAR(3). Quoi que ce soit sauf enum.

Voir mes anciens messages sur ENUM:

Pour l'efficacité, veuillez ne pas indexer ce champ seul, étant donné une cardinalité aussi basse (8,10).

3
RolandoMySQLDBA

J'ajouterais une autre chose à toutes les réponses précédentes et aux questions reliées. Cela m'est arrivé que j'avais une colonne de Tinyint pour représenter Boolean. Mais un jour, j'avais besoin de diviser la valeur true à deux valeurs distinctes. S'étendant 0,1 à 0,1,2 était trivial, alors que le changeant à String-Enum nécessiterait plus d'efforts. Renvoyant également Tinyint-Enum de trois valeurs à Tinyint-Boolean serait de la même manière facile.

3
Vojtěch

Si vous êtes certain de ne pas avoir plus de 10 types, utilisez ENUM. Sinon, utilisez un TINYINT, éventuellement pointé vers une petite table de mappage de ces valeurs aux noms/descriptions acceptables.

Évitez d'utiliser CHAR(3); Il est long et sujette à la confusion (sensible à la casse? Non? Les index sont pires lorsque l'insensibilité).

2
Shlomi Noach