Mysql
 sql >> Datenbank >  >> RDS >> Mysql

CSV im MySQL-Feld speichern – schlechte Idee?

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 .... .

zurückgegeben

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).