Avantages et inconvénients de l'utilisation des types ENUM vs Integer?


110

Disons que dans une table aléatoire, vous avez une colonne nommée status . Ses valeurs du monde réel seraient activées ou désactivées .

Est-il préférable que le type de données de cette colonne soit un int / bool (1 ou zéro) ou à utiliser ENUMavec les valeurs étant enabledet disabled? Quels sont les avantages ou les inconvénients?

Disons qu'au lieu de deux statuts valides, vous en avez 4 ou 10, voire plus? Est-ce que les avantages et les inconvénients vont d'un côté ou de l'autre à mesure que le nombre de valeurs requises augmente?


5
Tous les développeurs MySQL devraient ajouter cette question à leurs favoris, car elle peut devenir une source de chagrin ou de triomphe. +1 !!!
RolandoMySQLDBA

Réponses:


70

J'ai trouvé un article très bizarre mais instructif sur 8 raisons pour lesquelles on ne devrait pas utiliser ENUM.

Même sans l'article, je sais


1
Même si les autres réponses de ce fil de discussion sont très informatives, je la marque comme la réponse en raison de l’article très utile.
Jake Wilson

6
+1 Vous ne pouvez pas réutiliser la liste des membres d'une colonne ENUM dans d'autres tables. ENUM a une portabilité limitée aux autres SGBD.
quand

Que pourrais-je faire si j'ai un champ qui a des relations avec d'autres enregistrements de la même table? Par exemple, supposons un unitsmodèle pour un élément de magasin dans lequel chaque enregistrement doit avoir une propriété pour ses unités associées composition. Soit Ton, Kg, gm
Saidbak, le

Rien de bizarre à propos de cet article - c'est génial! Je pense que c'est ce post qui m'a permis de comprendre pourquoi ils sont mauvais! Je lui ai donné un +1!
Vérace

1
L'article suggère d'utiliser un bon vieux tableau au lieu des types ENUM. Devrions-nous ajouter ceci à la réponse?
Utku

39

Tout d’abord, nous avons les exigences de stockage . Je vais supposer que vous vouliez dire un tinyint (au lieu de int).

  • ENUM prend 1 octet (si moins de 255 valeurs) ou 2 octets (jusqu’à 65 535 au maximum).
  • TinyInt prend 1 octet (255 valeurs maximum)
  • Boolean est un synonyme de TinyInt

Donc, en surface, ils sont tous identiques. ENUM utilise cependant quelques métadonnées pour la valeur de chaîne qui lui est associée ( src plus ancien )

Je dirais que, à mesure que vous ajoutez de nouvelles valeurs, tout avantage commence à disparaître ENUM. Surtout si vous ajoutez les valeurs après que la table est déjà utilisée, car vous devez modifier la structure de la table pour l'adapter.

Quel est l'avantage d'utiliser un ENUM? Une représentation sous forme de chaîne de ce que signifie la valeur. Ça y est, en ce qui me concerne. Cela dépend de votre application.


4
+1 pour mentionner le seul avantage réel: la représentation sous forme de chaîne. Tout le reste est un lavage en avant.
RolandoMySQLDBA

19

Je trouve qu'ENUM est une définition abrégée d'une table de codes. Son principal avantage est d'éviter le code nécessaire pour rejoindre et afficher la description du code. Cela facilite également la définition des valeurs si elles arrivent sous forme de chaîne.

Je trouve qu'il présente les inconvénients suivants:

  • Aucune possibilité de métadonnées supplémentaires sur le code.
  • Difficile d'ajouter ou de désactiver des valeurs. (Des codes de désactivation peuvent être obtenus avec un déclencheur et un champ d'expiration.)
  • I18n dans la base de données ne peut pas être fait.
  • Non réutilisable sur plusieurs tables.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.