Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazenar vários valores em uma única coluna onde usa menos memória?


Se um usuário pode ter vários papéis, provavelmente é melhor ter um user_role tabela que armazena essas informações. Está normalizado e será muito mais fácil de consultar.

Uma tabela como:
user_id | role
--------+-----------------
      1 | Admin
      2 | User
      2 | Admin
      3 | User
      3 | Author

Permite consultar todos os usuários com uma função específica, como SELECT user_id, user.name FROM user_role JOIN user WHERE role='Admin' em vez de ter que usar análise de string para obter detalhes de uma coluna.

Entre outras coisas, isso será mais rápido, pois você pode indexar as colunas corretamente e ocupará um pouco mais de espaço do que qualquer solução que coloque vários valores em uma única coluna - o que é antitético para os bancos de dados relacionais.

O motivo pelo qual isso não deve ser armazenado é que é ineficiente, pelo motivo que o DCoder declara no comentário para esta resposta . Para verificar se um usuário tem uma função, cada linha da tabela de usuários precisará ser verificada e, em seguida, a coluna "funções" deverá ser verificada usando correspondência de string - independentemente de como essa ação é exposta, o RMDBS precisará executar operações de string para analisar o conteúdo. Essas são operações muito caras e não são um bom design de banco de dados.

Se você precisar para ter uma única coluna, sugiro fortemente que você não tenha mais um problema técnico, mas sim de gestão de pessoas . Adicionar tabelas adicionais a um banco de dados existente que está em desenvolvimento não deve ser difícil. Se isso não for algo que você está autorizado a fazer, explique por que a tabela extra é necessária para a pessoa certa - porque mungando vários valores em uma única coluna é ruim, ruim ideia .