2012-02-14 23 views
8

Esto es posible un problema por el cual perdí más tiempo para pensar cómo hacer las cosas correctas, pensando en la mejor manera optimizada para hacerlo.La mejor manera de hacer un sistema "hashtag"

Tengo una tabla "Contenido", y necesito agregar la opción para asociar varios "hashtags" o "etiquetas" o "palabras clave" a los contenidos, por ejemplo, el contenido como "patatas fritas con ketchup" tiene el "llaves": "papa", "ketchup" y "frito".

Y cuando hago una búsqueda por una palabra, por ejemplo "patata", necesito mostrar los contenidos que tienen etiquetas esta palabra.

La pregunta es, ¿cuál es la mejor estructura para hacer esto, pensando en la velocidad de los resultados porque la tabla de contenido es un MyISAM con más de 30 Millones de filas.

Creo que en esto:

hacer 2 más mesas, "contents_hashtags" (id(INT11), content_id(INT11), hashtag_id(INT11)) y "hashtags" (id(INT11), hashtag(VARCHAR(40))) las 2 tablas en InnoDB

Cuando el usuario crear/modificar el contenido de la tabla, que busco en el tabla de hashtags y obtener los ID, si hay un hashtag que no existe, créelo en el hashtag de la tabla, si existe, obtenga el ID, usando estos IDs cree los insertos en la tabla contents_hashtas que asocian contenidos < -contents_hashtas-> hashtahs

En la búsqueda, realice las UNIONES (IZQUIERDA/RIGHT/INNER dude ..) y hacer una búsqueda por LIKE ?? por exacto (hashtag = "XXX") o BÚSQUEDA DE TEXTO COMPLETO?

¿Es este método correcto/rápido? No sé cómo funciona esto con unas grandes cantidades de filas y de gran tráfico ..

Respuesta

2

En realidad, una mesa extra es suficiente

"hashtags" (id (INT11), hashtag (VARCHAR (40))), content_id (int11))

Ahora puede simplemente agregar hastag por su nombre. Para obtener todos los hashtags para un contenido, utilice

SELECT hashtag FROM hashtable WHERE content_id=$content_id 

Para añadir una Retirar un hashtag, debe eliminarlos mediante su identificador o hashtag en sí. Para obtener el contenido de hastags específicos, sólo tiene que utilizar

SELECT ct.* from hashtable ht, contenttable ct WHERE ht.hashtag=$hastag and ct.id=ht.content_id 

y así sucesivamente

3

tres mesas hará el truco:

Contenido, hashtags, y ConTags. ConTags será una tabla de unión que contiene contents.id y hashtags.id. De esta forma, puede atribuir múltiples hashtags a cada elemento en Contents.

SELECT * FROM Contents c, Hashtags h LEFT JOIN ConTags t ON c.Id = t.ConId AND h.Id = t.HashId 

Alternativamente, establezca Hashtags Nombre y contentID clave como único y la tabla de unión ya no es necesario

+0

Qué son los métodos de ayunar en la búsqueda? el método de 3 tablas o 2 tablas? En el método de la tabla 3 hay una relación directa por JOINs, pero en el método de la tabla 2 el hashtag está "duplicado" para los contenidos (porque id + hashtag no se puede repetir). Si realizo una búsqueda, por ejemplo: content.active = 1 AND (contents.name = 'xxx' OR (Contags.hashtag = 'XXX' y Content.id = Contags.content_id)) – Zenth

+0

Upvoted para "Alternativamente, establezca Hashtags Name and ContentId como clave única". Ninguna necesidad de 3 tablas 2 será suficiente. – DeepBlue

Cuestiones relacionadas