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

Archiviare csv nel campo MySQL:cattiva idea?

Non vuoi memorizzare il valore nel modulo separato da virgole.

Considera il caso in cui decidi di unire questa colonna con qualche altra tabella.

Considera di averlo fatto,

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

e vuoi trovare valori distinti per ogni x cioè:

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

o potresti voler controllare se ne contiene 3

oppure potresti volerli convertire in righe separate:

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

Sarà un GRANDE DOLORE.

Usa almeno il 1° principio di normalizzazione:avere una riga separata per ogni valore.

Ora, supponiamo che all'inizio avevi questo come tavolo:

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

Puoi convertirlo facilmente in valori CSV:

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

Se vuoi cercare se x =1 ha l'elemento 3. Facile.

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

che nel caso precedente avrebbe usato orribile find_in_set :

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

Se pensi di poter utilizzare like con i valori CSV per la ricerca, prima like %x% non è possibile utilizzare gli indici. In secondo luogo, produrrà risultati errati.
Supponiamo di voler controllare se l'elemento ab è presente e lo fai %ab% restituirà righe con abc abcd abcde .... .

Se hai molti utenti ed elementi, ti suggerisco di creare una tabella separata users con un ID utente PK, un altro items con PK itemid e infine una tabella di mappatura user_item con colonne userid, itemid.

Se sai che dovrai solo archiviare e recuperare questi valori e non eseguire alcuna operazione su di essi come unire, cercare, distinguere, convertire in righe separate ecc. ecc. 't).