sql >> Base de Datos >  >> RDS >> Mysql

Almacenar csv en el campo MySQL:¿mala idea?

No desea almacenar el valor en forma separada por comas.

Considere el caso cuando decida unir esta columna con alguna otra tabla.

Considere que tiene,

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

y desea encontrar valores distintos para cada x, es decir:

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

o puede querer verificar si tiene 3

o puede querer convertirlos en filas separadas:

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

Será un ENORME DOLOR.

Use al menos el primer principio de normalización:tenga una fila separada para cada valor.

Ahora, digamos que originalmente tenías esto como mesa:

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

Puede convertirlo fácilmente en valores csv:

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

Si desea buscar si x =1 tiene el elemento 3. Fácil.

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

que en el caso anterior usaría horrible find_in_set :

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

Si cree que puede usar Me gusta con valores CSV para buscar, primero like %x% no puede usar índices. En segundo lugar, producirá resultados incorrectos.
Digamos que desea verificar si el elemento ab está presente y lo hace %ab% devolverá filas con abc abcd abcde .... .

Si tiene muchos usuarios y elementos, le sugiero que cree una tabla separada users con un ID de usuario PK, otro items con PK itemid y, por último, una tabla de mapeo user_item tener columnas ID de usuario, ID de elemento.

Si sabe que solo necesitará almacenar y recuperar estos valores y no realizar ninguna operación en ellos, como unir, buscar, diferenciar, convertir a filas separadas, etc. 't).