sql >> Databasteknik >  >> RDS >> Mysql

Lagra csv i MySQL-fältet – dålig idé?

Du vill inte lagra värdet i den kommaseparerade formen.

Tänk på fallet när du bestämmer dig för att slå samman den här kolumnen med någon annan tabell.

Tänk att du har,

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

och du vill hitta distinkta värden för varje x, dvs.:

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

eller kanske vill kontrollera om den har 3 i sig

eller kanske vill konvertera dem till separata rader:

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

Det kommer att vara EN STOR SMÄRTA.

Använd åtminstone normalisering 1:a principen - ha separata rader för varje värde.

Säg nu att du ursprungligen hade detta när du bordade:

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

Du kan enkelt konvertera det till csv-värden:

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

Om du vill söka om x =1 har punkt 3. Lätt.

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

som i tidigare fall skulle använda hemskt find_in_set :

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

Om du tror att du kan använda like med CSV-värden för att söka, like %x% först kan inte använda index. För det andra kommer det att ge felaktiga resultat.
Säg att du vill kontrollera om objekt ab finns och att du gör %ab% det kommer att returnera rader med abc abcd abcde .... .

Om du har många användare och objekt, skulle jag föreslå att du skapar en separat tabell users med ett PK-användar-id, ett annat items med PK itemid och slutligen en mappningstabell user_item har användar-id, itemid-kolumner.

Om du vet att du bara behöver lagra och hämta dessa värden och inte göra någon operation på dem, såsom join, search, distinct, konvertering till separata rader etc. etc. - det kan vara helt enkelt, du kan (jag skulle fortfarande 't).



  1. Python MySQL-anslutning - oläst resultat hittades vid användning av fetchone

  2. Rails 4 LIKE-fråga - ActiveRecord lägger till citat

  3. Varför är Oracle-tabell-/kolumn-/indexnamn begränsade till 30 tecken?

  4. MYSQL - Omöjligt att skapa en extern nyckel