Nechcete ukládat hodnotu ve formě oddělené čárkami.
Zvažte případ, kdy se rozhodnete spojit tento sloupec s jinou tabulkou.
Zvažte, že ano,
x items
1 1, 2, 3
1 1, 4
2 1
a chcete najít odlišné hodnoty pro každé x, tj.:
x items
1 1, 2, 3, 4
2 1
nebo možná budete chtít zkontrolovat, zda obsahuje 3
nebo je možná budete chtít převést do samostatných řádků:
x items
1 1
1 2
1 3
1 1
1 4
2 1
Bude to VELKÁ BOLEST.
Použijte alespoň 1. princip normalizace – pro každou hodnotu mějte samostatný řádek.
Nyní řekněte, že jste původně měli na stole toto:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Můžete jej snadno převést na hodnoty csv:
select x, group_concat(item order by item) items
from t
group by x
Pokud chcete vyhledat, zda x =1 má položku 3. Snadno.
select * from t where x = 1 and item = 3
což by v dřívějším případě znamenalo strašný find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
Pokud si myslíte, že můžete použít jako s hodnotami CSV k vyhledávání, pak nejprve like %x%
nelze použít indexy. Za druhé to povede k nesprávným výsledkům.
Řekněme, že chcete zkontrolovat, zda je přítomna položka ab, a uděláte %ab%
vrátí řádky s abc abcd abcde .... .
Pokud máte mnoho uživatelů a položek, pak bych navrhoval vytvořit samostatnou tabulku users
s PK userid, další items
s PK itemid a nakonec mapovací tabulkou user_item
se sloupci userid, itemid.
Pokud víte, že budete muset tyto hodnoty pouze uložit a načíst a nebudete s nimi provádět žádné operace, jako je spojení, vyhledávání, odlišení, převod na samostatné řádky atd. atd. – může být jen může být, můžete (stále bych rád 't).