2010-06-02 14 views
7

tengo una tabla de MySQL, users, con las siguientes columnas:Enum datatype versus tabla de datos en MySQL?

  1. user_id (PK)
  2. correo electrónico
  3. nombre
  4. contraseña

para gestionar un sistema de papeles, ¿Habría algún inconveniente en alguna de las siguientes opciones?

Opción 1:

Crear una segunda tabla denominada roles con tres columnas: role_id (clave primaria), name, y description, a continuación, asociar users.user_id con roles.role_id como claves externas en una tercera tabla llamada users_roles?

O ...

Opción 2:

Crear una segunda tabla denominada roles con dos columnas: user_id (clave externa de users.user_id) y role (ENUM)? La columna de tipo de datos ENUM permitiría insertar una lista corta de roles permitidos como valores.

Nunca antes había usado el tipo de datos ENUM en MySQL, así que solo tengo curiosidad, ya que la opción 2 significaría una tabla menos. Espero que tenga sentido, esta es la primera vez que intento describir las tablas de MySQL en un foro.

Respuesta

9

En general, los tipos ENUM no están destinados a ser utilizados en estas situaciones. Este es especialmente el caso si tiene la intención de atender la flexibilidad de agregar o quitar roles en el futuro. La única forma de cambiar los valores de ENUM es con ALTER TABLE, mientras que definir los roles en su propia tabla simplemente requerirá una nueva fila en la tabla roles.

Además, utilizando la tabla roles le permite añadir columnas adicionales para definir mejor el papel, al igual que el campo description usted sugirió en la Opción 1. Esto no es posible si se va a utilizar un tipo de ENUM como en la opción 2.

Personalmente, no optaría por un ENUM en estos escenarios. Tal vez pueda ver que se utilizan para columnas con un conjunto de valores absolutamente finitos, como {Spades, Hearts, Diamonds, Clubs} para definir la demanda de una tarjeta, pero no en casos como el que se menciona, por las desventajas mencionadas anteriormente.

+0

Gracias! Hiciste un gran trabajo al explicar esto. –

0

Usar ENUM para el caso Lo sugerido solo tiene sentido cuando tiene un ORM estrictamente definido en el extremo receptor que para istance asigna db filas a una lista de objetos planos automáticamente.

Ejemplo: animal de mesa (ENUM ('reptiles', 'mamals') Categoría, (varchar 50) Nombre);

se maped automáticamente a

objeto animales animal-> Categoría animal-> Nombre

Cuestiones relacionadas