Ventajas y desventajas de usar ENUM vs tipos enteros?


110

Digamos que en una tabla aleatoria, tienes una columna llamada estado . Sus valores del mundo real estarían habilitados o deshabilitados .

¿Es mejor que el tipo de datos de esta columna sea int / bool (1 o cero) o que se use ENUMcon los valores siendo enabledy disabled? ¿Cuáles son las ventajas o desventajas?

Digamos que en lugar de solo dos estados válidos, ¿tiene 4 o 10 o incluso más? ¿Las ventajas y desventajas se balancean hacia un lado u otro a medida que aumenta el número de valores requeridos?


55
Esta pregunta debe ser marcada por todos los desarrolladores de MySQL porque puede convertirse en una fuente de desamor o triunfo. +1 !!!
RolandoMySQLDBA

Respuestas:


70

Encontré un artículo muy extraño pero informativo sobre 8 razones por las cuales uno no debería usar ENUM.

Incluso sin el artículo, lo sé


1
Aunque la (s) otra (s) respuesta (s) en este hilo son muy informativas, estoy marcando esta como la respuesta debido al artículo muy útil.
Jake Wilson

66
+1 No puede reutilizar la lista de miembros de una columna ENUM en otras tablas. ENUM tiene portabilidad limitada a otros DBMS.
cuando el

¿Qué podría hacer si tengo un campo que tiene relaciones con otros registros de la misma tabla? Por ejemplo, suponga un unitsmodelo para artículos de una tienda donde cada registro debe tener propiedades para sus unidades relacionadas composition. es decir, Ton, Kg, gm
SaidbakR

Nada extraño en ese artículo, ¡es genial! ¡Creo que fue esta publicación la que me hizo entender por qué son malos! ¡Le di un +1!
Vérace

1
El artículo sugiere utilizar una buena tabla antigua, en lugar de los tipos ENUM. ¿Deberíamos agregar esto a la respuesta?
Utku

39

Bueno, primero tenemos los requisitos de almacenamiento . Voy a suponer que te referías a un tinyint (en lugar de int).

  • ENUM toma 1 byte (si está por debajo de 255 valores) o 2 bytes (hasta un máximo de 65,535
  • TinyInt toma 1 byte (máximo de 255 valores)
  • Boolean es sinónimo de TinyInt

Entonces, en la superficie, son todos iguales. Sin embargo, ENUM toma algunos metadatos para el valor de cadena asociado con él ( src anterior )

Sin embargo, a medida que agrega más valores, cualquier ventaja comienza a alejarse ENUM. Especialmente si agrega los valores después de que la tabla ya está en uso, porque tiene que alterar la estructura de la tabla para acomodarla.

¿Cuál es la ventaja de usar un ENUM? Una representación de cadena de lo que significa el valor. Eso es todo, en lo que a mí respecta. Lo valioso que sea depende de su aplicación.


44
+1 por mencionar la única ventaja real: representación de cadena. Todo lo demás es un lavado en el futuro.
RolandoMySQLDBA

19

Encuentro ENUM es una definición abreviada de una tabla de códigos. Su principal ventaja es que evita el código requerido para unirse y mostrar la descripción del código. También facilita la configuración de los valores si llegan en forma de cadena.

Creo que tiene las siguientes desventajas:

  • No hay capacidad para metadatos adicionales sobre el código.
  • Difícil de agregar o deshabilitar valores. (Los códigos de desactivación se pueden lograr con un disparador y un campo de caducidad).
  • I18n en la base de datos no se puede hacer.
  • No reutilizable en las mesas.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.