Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Problema con los tags del post.

Estas en el tema de Problema con los tags del post. en el foro de Bases de Datos General en Foros del Web. Hola, Me acaba de surgir un problema que no sé ni como buscarlo por internet... Tengo una tabla que se llama "blog_post". Dentro tenemos campos ...
  #1 (permalink)  
Antiguo 01/07/2015, 04:58
 
Fecha de Ingreso: abril-2003
Ubicación: Valencia
Mensajes: 223
Antigüedad: 21 años
Puntos: 7
Problema con los tags del post.

Hola,

Me acaba de surgir un problema que no sé ni como buscarlo por internet...

Tengo una tabla que se llama "blog_post".
Dentro tenemos campos como "post_category" y "post_tags".

Resulta que "post_tags" es un VARCHAR(255) con contiene por ejemplo "samsung, android, 6 pulgadas".

Como puedo hacer un SELECT que muestre todos los posts cuyos "post_tags" contenga "android"?

¿Se puede hacer?

Gracias por la ayuda y un saludo.
  #2 (permalink)  
Antiguo 01/07/2015, 06:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con los tags del post.

Bueno, es uno de esos casos medio espantosos de performance. Lamentablemente es muy habitual...
Lo que tienes es lo que se denomina "campo multivaluado", que están prohibidos en las bases de datos relacionales, pero infortunadamente es la forma en que la inmensa mayoría de los desarrolladores sin bases firmes en arquitectura de datos pone los campos de "tags",.
En fin.
Mira, en forma genérica, todos los DBMS, cualquiera que uses reconocerá esta sinaxis:

Código SQL:
Ver original
  1. SELECT *
  2. FROM blog_posts
  3. WHERE post_tags LIKE '%android%'
El problema es que es un método súmamente ineficiente. Su performance es un espanto para cualquier DBMS y especialmente con tablas que contengan muchos registros, porque lo que hace esa consulta es un full table scan (lectura completa de toda la tabla), para analizar uno a uno ese campo en todos los registros.

Por otro lado, si usases por ejemplo MySQL, existe una función capaz de hacer un barrido más performántico, e incluso se puede plantear usar indices FULLTEXT, que podrían mejorar todo.

Nota: Con el LIKE usado con dos comodines, como te lo pongo, no hay índice que sirva.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 01/07/2015, 09:23
 
Fecha de Ingreso: abril-2003
Ubicación: Valencia
Mensajes: 223
Antigüedad: 21 años
Puntos: 7
Respuesta: Problema con los tags del post.

gnzsoloyo, gracias por la respuesta. Me ha parecido muy útil.

Llevo menos de un año programando y me queda mucho por aprender...

Podrías explicar un poco lo de:
Cita:
existe una función capaz de hacer un barrido más performántico, e incluso se puede plantear usar indices FULLTEXT
Gracias.

PD: ¿tú como habrías hecho lo de las tags?
  #4 (permalink)  
Antiguo 01/07/2015, 11:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con los tags del post.

¿Como hacerlos?
Bueno, si se tiene forzosamente que poner un sólo campo, lo podría en un tipo de campo y DBMS que permita índices fulltext, pero con la condición de no admitir tags que tengan menos de cinco caracteres de longitud (sin espacios), porque eso destruye la performance.
Por otro lado, hay que ver si es funcional usar una tabla de tags, la verdad nunca me lo plantee en profundidad porque el FULLTEXT con la condición que te digo es bastante bueno.
En el caso de los multivalores con separación de comas, se puede usar en MySQL FIND_IN_SET(), por ejemplo, que evalúa ese tipo de casos y suele dar buenos resultados.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:23.