Nie chcesz przechowywać wartości w postaci oddzielonej przecinkami.
Rozważ przypadek, gdy zdecydujesz się połączyć tę kolumnę z jakimś innym stołem.
Uważaj, że tak,
x items
1 1, 2, 3
1 1, 4
2 1
i chcesz znaleźć różne wartości dla każdego x, np.:
x items
1 1, 2, 3, 4
2 1
a może chcesz sprawdzić, czy ma w sobie 3
a może chcesz przekonwertować je na osobne wiersze:
x items
1 1
1 2
1 3
1 1
1 4
2 1
To będzie OGROMNY BÓL.
Użyj co najmniej pierwszej zasady normalizacji - dla każdej wartości należy mieć osobny wiersz.
Powiedzmy, że pierwotnie miałeś to przy stole:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Możesz łatwo przekonwertować go na wartości csv:
select x, group_concat(item order by item) items
from t
group by x
Jeśli chcesz wyszukać, jeśli x =1 ma element 3. Łatwo.
select * from t where x = 1 and item = 3
które we wcześniejszym przypadku użyłoby straszne find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
Jeśli uważasz, że możesz użyć like z wartościami CSV do wyszukiwania, najpierw like %x%
nie można używać indeksów. Po drugie, spowoduje to nieprawidłowe wyniki.
Powiedz, że chcesz sprawdzić, czy element ab jest obecny i robisz %ab%
zwróci wiersze z abc abcd abcde .... .
Jeśli masz wielu użytkowników i przedmiotów, sugeruję utworzenie osobnej tabeli users
z identyfikatorem użytkownika PK, inne items
z itemid PK i na końcu tabelą mapowania user_item
mający identyfikator użytkownika, kolumny itemid.
Jeśli wiesz, że będziesz musiał tylko przechowywać i pobierać te wartości i nie wykonywać na nich żadnych operacji, takich jak łączenie, wyszukiwanie, rozróżnianie, konwersja do oddzielnych wierszy itp. itd. - może być po prostu może być, możesz (nadal bym nie).