2008-12-03 22 views
22

Por ejemplo, tengo una tabla de "usuarios" que tiene una columna enum "tipo" con dos valores posibles: "individual" y "organización". Son mutuamente excluyentes y obligatorios (cada fila debe tener exactamente un valor de los dos posibles. ¿Sería este un buen caso para usar enumeraciones? ¿Por qué so/no?Enum de la base de datos: pros y contras

¿Cuáles son algunos pros y contras sobre el uso de ENUM (conjunto) ?. tipos de campos de la base

+1

¿Qué RDBMS aparte de MySQL admiten un tipo de datos ENUM? (Esta no es una consulta retórica.) – Tomalak

+0

@Tomalak: Sé que postgresql sí. –

+0

Excelente pregunta, me gustaría que otros participen y traigan respuestas. Tomalak, tal vez debería publicar su pregunta como una respuesta positiva si conoce algunos RDBMS populares que en realidad no son compatibles con enum y enumerelos. – Tom

Respuesta

17

Sí, esto parece ser un buen candidato para una enumeración

Pros:

  • Pequeño (espacio en disco)
  • rápida (comparación de enteros)
  • fácil de entender (en su mayoría)

Contras:

  • No se puede agregar un valor sin cambiar la estructura de la tabla
  • tiene que tener cuidado con las mayúsculas y minúsculas en lugares
  • Puede ser muy confuso si se usa mal ... ¡no use active = enum ('1', '0') ya que tengo que soportarlo!
  • no soportados por todas las bases de
+3

+1 (Yo agregaría el "bloqueo" a un determinado producto del servidor de bases de datos a los Cons) – Tomalak

+0

¿Qué hay de malo con el activo? = enum (1,0)? – Tom

+3

activo = 0 no es lo mismo que active = '0'! – Greg

9

Personalmente siempre he preferido tener columnas int estándar para esto, con un enlace clave externa a una tabla de descripción. Esto le permite limitar los valores para la columna de identificación de tipo.

Por supuesto, esto puede conducir a la saturación de la tabla, pero le permite tener una tabla "localizada" para ir con la tabla de descripción, para que sus aplicaciones puedan mostrar contenido localizado en desplegables/informes, etc.

User.UserTypeID -> UserType.UserTypeID -> UserTypeLocalised.UserTypeID where locality = ?? 

Ésta es también la base de datos más agnóstica y por lo tanto más fácilmente portado a diferentes plataformas.

Además, no suena bien para un usuario ser un individuo o una organización. Esperaría que un usuario sea parte de una organización, lo que requeriría una tabla de organización y el usuario tendría una columna de ID de organización. Normalmente, el tipo de usuario sería una diferenciación de "Ser humano/sistema" (suponiendo que sus sistemas utilicen inicios de sesión a temperatura ambiente para realizar operaciones y que desee realizar auditorías).

6

Poner los datos de referencia en una tabla con una clave externa significa que la base de datos puede aplicar una regla de integridad de datos. También puede agregar un tipo diferente (por ejemplo, 'Interno' o 'Sin fines de lucro') sin tener que extender el esquema de la base de datos. Finalmente, puede anotar la tabla de referencia con indicadores u otra codificación para permitirle implementar lógica de negocios basada en datos si así lo desea.

Cuestiones relacionadas