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

Stocker csv dans le champ MySQL - mauvaise idée ?

Vous ne voulez pas stocker la valeur sous la forme séparée par des virgules.

Considérez le cas où vous décidez de joindre cette colonne à une autre table.

Considérez que vous avez,

x  items
1  1, 2, 3
1  1, 4
2  1

et vous voulez trouver des valeurs distinctes pour chaque x, c'est-à-dire :

x  items
1  1, 2, 3, 4
2  1

ou peut-être voulez-vous vérifier s'il en contient 3

ou peut-être souhaitez-vous les convertir en lignes séparées :

x  items
1  1
1  2
1  3
1  1
1  4
2  1

Ce sera une ÉNORME DOULEUR.

Utilisez au moins le 1er principe de normalisation - ayez une ligne séparée pour chaque valeur.

Maintenant, disons qu'à l'origine, vous aviez ceci comme table :

x  item
1  1
1  2
1  3
1  1
1  4
2  1

Vous pouvez facilement le convertir en valeurs CSV :

select x, group_concat(item order by item) items
from t
group by x

Si vous voulez rechercher si x =1 a l'élément 3. Facile.

select * from t where x = 1 and item = 3

qui dans le cas précédent utiliserait horrible find_in_set :

select * from t where x = 1 and find_in_set(3, items);

Si vous pensez que vous pouvez utiliser comme avec des valeurs CSV pour rechercher, alors d'abord like %x% ne peut pas utiliser les index. Deuxièmement, cela produira des résultats erronés.
Disons que vous voulez vérifier si l'élément ab est présent et que vous faites %ab% il renverra des lignes avec abc abcd abcde .... .

Si vous avez de nombreux utilisateurs et éléments, je suggérerais de créer une table séparée users avec un identifiant PK, un autre items avec PK itemid et enfin une table de mapping user_item ayant des colonnes userid, itemid.

Si vous savez que vous aurez juste besoin de stocker et de récupérer ces valeurs et de ne faire aucune opération dessus comme joindre, rechercher, distinct, conversion en lignes séparées, etc. etc. - peut-être juste peut-être, vous pouvez (je le ferais toujours 't).