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

Armazenando csv no campo MySQL – má ideia?


Você não deseja armazenar o valor no formulário separado por vírgulas.

Considere o caso quando você decide unir esta coluna com alguma outra tabela.

Considere que você tem,
x  items
1  1, 2, 3
1  1, 4
2  1

e você deseja encontrar valores distintos para cada x, ou seja:
x  items
1  1, 2, 3, 4
2  1

ou pode querer verificar se tem 3 nele

ou pode querer convertê-los em linhas separadas:
x  items
1  1
1  2
1  3
1  1
1  4
2  1

Será uma DOR ENORME.

Use pelo menos o 1º princípio de normalização - tenha uma linha separada para cada valor.

Agora, digamos que originalmente você tinha isso como tabela:
x  item
1  1
1  2
1  3
1  1
1  4
2  1

Você pode facilmente convertê-lo em valores csv:
select x, group_concat(item order by item) items
from t
group by x

Se quiser pesquisar se x =1 tem o item 3. Fácil.
select * from t where x = 1 and item = 3

que no caso anterior usaria horrível find_in_set :
select * from t where x = 1 and find_in_set(3, items);

Se você acha que pode usar like com valores CSV para pesquisar, primeiro like %x% não pode usar índices. Segundo, produzirá resultados errados.
Digamos que você queira verificar se o item ab está presente e você faz %ab% ele retornará linhas com abc abcd abcde .... .

Se você tiver muitos usuários e itens, sugiro criar uma tabela separada users com um ID de usuário PK, outros items com PK itemid e por último uma tabela de mapeamento user_item tendo colunas userid, itemid.

Se você sabe que precisará apenas armazenar e recuperar esses valores e não fazer nenhuma operação nele, como junção, pesquisa, distinção, conversão para linhas separadas etc. etc. - pode ser apenas pode ser, você pode (eu ainda faria 't).