sql >> Database teknologi >  >> RDS >> Mysql

Lagring af csv i MySQL-feltet – dårlig idé?

Du ønsker ikke at gemme værdien i den kommaseparerede form.

Overvej sagen, når du beslutter dig for at forbinde denne kolonne med en anden tabel.

Overvej at du har,

x  items
1  1, 2, 3
1  1, 4
2  1

og du vil finde forskellige værdier for hvert x, dvs.:

x  items
1  1, 2, 3, 4
2  1

eller vil måske tjekke, om den har 3 i sig

eller måske ønsker at konvertere dem til separate rækker:

x  items
1  1
1  2
1  3
1  1
1  4
2  1

Det vil være en KÆMPE SMERTE.

Brug mindst normalisering 1. princip - hav separat række for hver værdi.

Sig nu, at du oprindeligt havde dette, da du tabel:

x  item
1  1
1  2
1  3
1  1
1  4
2  1

Du kan nemt konvertere det til csv-værdier:

select x, group_concat(item order by item) items
from t
group by x

Hvis du vil søge, hvis x =1 har punkt 3. Nemt.

select * from t where x = 1 and item = 3

som i tidligere tilfælde ville bruge horrible find_in_set :

select * from t where x = 1 and find_in_set(3, items);

Hvis du tror, ​​du kan bruge like med CSV-værdier til at søge, så like %x% først kan ikke bruge indekser. For det andet vil det give forkerte resultater.
Sig, at du vil kontrollere, om element ab er til stede, og du gør %ab% det vil returnere rækker med abc abcd abcde .... .

Hvis du har mange brugere og elementer, så vil jeg foreslå at oprette en separat tabel users med et PK-bruger-id, et andet items med PK itemid og til sidst en mapping tabel user_item har bruger-id, itemid-kolonner.

Hvis du ved, at du bare skal gemme og hente disse værdier og ikke udføre nogen handlinger på dem, såsom join, search, distinct, konvertering til separate rækker osv. osv. - det kan være, at du kan (jeg ville stadig 't).



  1. Sortering af MYSQL Tag-tabel

  2. serie i postgres bliver øget, selvom jeg tilføjede om konflikt gør ingenting

  3. Hvad er rækkefølgen af ​​poster i en tabel med en sammensat primærnøgle

  4. Almindelige SQL Server-uheld