Sie möchten den Wert nicht in kommagetrennter Form speichern.
Betrachten Sie den Fall, wenn Sie sich entscheiden, diese Spalte mit einer anderen Tabelle zu verbinden.
Denken Sie, Sie haben,
x items
1 1, 2, 3
1 1, 4
2 1
und Sie möchten unterschiedliche Werte für jedes x finden, z. B.:
x items
1 1, 2, 3, 4
2 1
oder vielleicht möchten Sie überprüfen, ob 3 drin ist
oder möchten sie vielleicht in separate Zeilen umwandeln:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Es wird ein RIESIGER SCHMERZ sein.
Verwenden Sie mindestens Normalisierung 1. Prinzip - separate Zeile für jeden Wert.
Nehmen wir nun an, Sie hatten ursprünglich Folgendes als Tabelle:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Sie können es einfach in CSV-Werte umwandeln:
select x, group_concat(item order by item) items
from t
group by x
Wenn Sie suchen möchten, ob x =1 Element 3 hat. Einfach.
select * from t where x = 1 and item = 3
was im früheren Fall horrible verwenden würde find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
Wenn Sie glauben, dass Sie like mit CSV-Werten für die Suche verwenden können, dann like %x%
kann keine Indizes verwenden. Zweitens führt es zu falschen Ergebnissen.
Angenommen, Sie möchten überprüfen, ob Element ab vorhanden ist, und Sie geben %ab%
ein es werden Zeilen mit abc abcd abcde .... .
Wenn Sie viele Benutzer und Elemente haben, würde ich vorschlagen, separate Tabellen users
zu erstellen mit einer PK-Benutzer-ID ein weiterer items
mit PK itemid und zuletzt einer Zuordnungstabelle user_item
mit userid, itemid Spalten.
Wenn Sie wissen, dass Sie diese Werte nur speichern und abrufen müssen und keine Operationen daran ausführen müssen, wie z nicht).