sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almacenar múltiples valores en una sola columna donde usa menos memoria?

Si un usuario puede tener varios roles, probablemente sea mejor tener un user_role tabla que almacena esta información. Está normalizado y será mucho más fácil de consultar.

Una tabla como:

user_id | role
--------+-----------------
      1 | Admin
      2 | User
      2 | Admin
      3 | User
      3 | Author

Le permitirá consultar a todos los usuarios con un rol particular, como SELECT user_id, user.name FROM user_role JOIN user WHERE role='Admin' en lugar de tener que usar el análisis de cadenas para obtener detalles de una columna.

Entre otras cosas, esto será más rápido, ya que puede indexar las columnas correctamente y ocupará un poco más de espacio que cualquier solución que coloque múltiples valores en una sola columna, lo cual es antitético para lo que están diseñadas las bases de datos relacionales.

La razón por la que esto no debe almacenarse es porque es ineficiente, por lo que DCoder indica en el comentario a esta respuesta . Para verificar si un usuario tiene un rol, se deberá escanear cada fila de la tabla de usuarios y luego se deberá escanear la columna "roles" mediante la coincidencia de cadenas; independientemente de cómo se exponga esta acción, el RMDBS deberá realizar operaciones de cadena para analizar el contenido. Estas son operaciones muy costosas y no tienen un buen diseño de base de datos.

Si necesitas para tener una sola columna, le sugiero encarecidamente que ya no tenga un problema técnico, sino uno de gestión de personas . Agregar tablas adicionales a una base de datos existente que está en desarrollo no debería ser difícil. Si esto no es algo para lo que está autorizado, explique por qué se necesita la mesa adicional a la persona adecuada, porque munging múltiples valores en una sola columna es malo, malo idea .