sql >> Database >  >> RDS >> Mysql

Csv opslaan in MySQL-veld - slecht idee?

U wilt de waarde niet in de door komma's gescheiden vorm opslaan.

Overweeg het geval wanneer u besluit deze kolom samen te voegen met een andere tabel.

Denk dat je hebt,

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

en u wilt voor elke x verschillende waarden vinden, bijv.:

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

of wil misschien controleren of er 3 in staan

of wil je ze misschien omzetten in aparte rijen:

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

Het zal een ENORME PIJN zijn.

Gebruik ten minste het eerste principe van normalisatie - zorg voor een aparte rij voor elke waarde.

Stel nu dat u dit oorspronkelijk had terwijl u tafelde:

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

Je kunt het gemakkelijk omzetten in csv-waarden:

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

Als je wilt zoeken of x =1 item 3 heeft. Makkelijk.

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

die in eerder geval verschrikkelijk . zou gebruiken find_in_set :

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

Als je denkt dat je like kunt gebruiken met CSV-waarden om te zoeken, dan moet je eerst like %x% kan geen indexen gebruiken. Ten tweede zal het verkeerde resultaten opleveren.
Stel dat u wilt controleren of item ab aanwezig is en u doet %ab% het zal rijen teruggeven met abc abcd abcde .... .

Als je veel gebruikers en items hebt, raad ik aan om een ​​aparte tabel users te maken met een PK-gebruikers-ID, nog een items met PK itemid en als laatste een toewijzingstabel user_item met userid, itemid kolommen.

Als u weet dat u deze waarden alleen maar hoeft op te slaan en op te halen en er geen bewerkingen op hoeft uit te voeren, zoals samenvoegen, zoeken, onderscheiden, converteren naar afzonderlijke rijen enz. enz. - misschien kan het zijn (ik zou nog steeds 't).



  1. Hoe localdb afzonderlijk te installeren?

  2. Hoe de uitvoer van DBMS_OUTPUT.PUT_LINE omleiden naar een bestand?

  3. brew services lijst toont mysql actief maar kan geen verbinding maken

  4. MySQL behandelt ı niet als i?