web-dev-qa-db-fra.com

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

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

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

Disons qu'au lieu de seulement deux statuts valides, vous en avez 4 ou 10 ou même plus? Les avantages et les inconvénients se balancent-ils d'un côté ou de l'autre lorsque le nombre de valeurs requises augmente?

117
Jake Wilson

J'ai trouvé un article très bizarre mais informatif environ 8 raisons pour lesquelles il ne faut pas utiliser ENUM.

Même sans l'article, je sais

73
RolandoMySQLDBA

Eh bien, tout d'abord, nous avons les exigences de stockage . Je vais supposer que vous vouliez dire une minuscule (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 synonyme de TinyInt

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

Je dirais cependant que lorsque vous ajoutez plus de valeurs, tout avantage commence à s'éloigner de ENUM. Surtout si vous ajoutez les valeurs une fois 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. Voilà, en ce qui me concerne. La valeur de ces informations dépend de votre application.

39
Derek Downey

Je trouve que ENUM est une définition abrégée d'une table de code. Son principal avantage est qu'il évite le code requis pour rejoindre et afficher la description du code. Il 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. (La désactivation des codes peut être effectuée avec un champ de déclenchement et d'expiration.)
  • I18n dans la base de données ne peut pas être fait.
  • Non réutilisable sur plusieurs tables.
20
BillThor