Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker plusieurs valeurs dans une seule colonne où utiliser moins de mémoire ?

Si un utilisateur peut avoir plusieurs rôles, il est probablement préférable d'avoir un user_role table qui stocke ces informations. Il est normalisé et sera beaucoup plus facile à interroger.

Un tableau comme :

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

Vous permettra d'interroger tous les utilisateurs avec un rôle particulier, tel que SELECT user_id, user.name FROM user_role JOIN user WHERE role='Admin' plutôt que d'avoir à utiliser l'analyse de chaînes pour extraire les détails d'une colonne.

Entre autres choses, cela sera plus rapide, car vous pouvez indexer les colonnes correctement et prendra un peu plus d'espace que n'importe quelle solution qui met plusieurs valeurs dans une seule colonne - ce qui est contraire à ce pour quoi les bases de données relationnelles sont conçues.

La raison pour laquelle cela ne devrait pas être stocké est qu'il est inefficace, pour la raison que DCoder indique dans le commentaire à cette réponse . Pour vérifier si un utilisateur a un rôle, chaque ligne de la table des utilisateurs devra être analysée, puis la colonne "rôles" devra être analysée à l'aide de la correspondance de chaîne - quelle que soit la façon dont cette action est exposée, le RMDBS devra effectuer des opérations de chaîne pour analyser le contenu. Ce sont des opérations très coûteuses et pas du tout une bonne conception de base de données.

Si vous avez besoin pour avoir une seule colonne, je suggérerais fortement que vous n'ayez plus un problème technique, mais un problème de gestion des personnes . L'ajout de tables supplémentaires à une base de données existante en cours de développement ne devrait pas être difficile. Si ce n'est pas quelque chose que vous êtes autorisé à faire, expliquez pourquoi le tableau supplémentaire est nécessaire à la bonne personne - parce que munging plusieurs valeurs dans une seule colonne est un mauvais, mauvais idée .