Не искате да съхранявате стойността във формата, разделена със запетая.
Помислете за случая, когато решите да присъедините тази колона към друга таблица.
Считайте, че имате,
x items
1 1, 2, 3
1 1, 4
2 1
и искате да намерите различни стойности за всеки x, т.е.:
x items
1 1, 2, 3, 4
2 1
или може да искате да проверите дали има 3 в него
или може да искате да ги преобразувате в отделни редове:
x items
1 1
1 2
1 3
1 1
1 4
2 1
Ще бъде ОГРОМНА БОЛКА.
Използвайте поне 1-ви принцип на нормализиране - имайте отделен ред за всяка стойност.
Сега кажете, че първоначално сте имали това на масата:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Можете лесно да го конвертирате в csv стойности:
select x, group_concat(item order by item) items
from t
group by x
Ако искате да търсите, ако x =1 има елемент 3. Лесно.
select * from t where x = 1 and item = 3
което в по-ранен случай би използвало ужасно find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
Ако смятате, че можете да използвате like с CSV стойности за търсене, тогава първо like %x%
не може да използва индекси. Второ, това ще доведе до грешни резултати.
Кажете, че искате да проверите дали елемент ab присъства и направете %ab%
той ще върне редове с abc abcd abcde .... .
Ако имате много потребители и елементи, тогава бих предложил да създадете отделна таблица users
с PK потребителски идентификатор, друг items
с PK itemid и накрая таблица за съпоставяне user_item
с колони с userid,itemid.
Ако знаете, че просто ще трябва да съхранявате и извличате тези стойности и да не извършвате никакви операции върху тях, като присъединяване, търсене, разграничаване, преобразуване в отделни редове и т.н. и т.н. - може просто да е, можете (аз все пак не бих 't).