Du ønsker ikke at gemme værdien i den kommaseparerede form.
Overvej sagen, når du beslutter dig for at forbinde denne kolonne med en anden tabel.
Overvej at du har,
x items
1 1, 2, 3
1 1, 4
2 1
og du vil finde forskellige værdier for hvert x, dvs.:
x items
1 1, 2, 3, 4
2 1
eller vil måske tjekke, om den har 3 i sig
eller måske ønsker at konvertere dem til separate rækker:
x items
1 1
1 2
1 3
1 1
1 4
2 1
Det vil være en KÆMPE SMERTE.
Brug mindst normalisering 1. princip - hav separat række for hver værdi.
Sig nu, at du oprindeligt havde dette, da du tabel:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Du kan nemt konvertere det til csv-værdier:
select x, group_concat(item order by item) items
from t
group by x
Hvis du vil søge, hvis x =1 har punkt 3. Nemt.
select * from t where x = 1 and item = 3
som i tidligere tilfælde ville bruge horrible find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
Hvis du tror, du kan bruge like med CSV-værdier til at søge, så like %x%
først kan ikke bruge indekser. For det andet vil det give forkerte resultater.
Sig, at du vil kontrollere, om element ab er til stede, og du gør %ab%
det vil returnere rækker med abc abcd abcde .... .
Hvis du har mange brugere og elementer, så vil jeg foreslå at oprette en separat tabel users
med et PK-bruger-id, et andet items
med PK itemid og til sidst en mapping tabel user_item
har bruger-id, itemid-kolonner.
Hvis du ved, at du bare skal gemme og hente disse værdier og ikke udføre nogen handlinger på dem, såsom join, search, distinct, konvertering til separate rækker osv. osv. - det kan være, at du kan (jeg ville stadig 't).