2012-02-14 3 views
8

Questo è possibile un problema in quanto ho perso più tempo per pensare a come correggere, pensando nel modo migliore ottimizzato per farlo.Il modo migliore per creare un sistema "hashtag"

Ho una tabella "Contenuti", e devo aggiungere l'opzione per associare più "hashtag" o "tag" o "parole chiave" al contenuto, ad esempio, il contenuto come "patate fritte con ketchup" ha il "chiavi": "patata", "ketchup" e "fritto".

E quando faccio una ricerca con una parola, ad esempio "patata", ho bisogno di mostrare il contenuto che contiene questa parola.

La domanda è, quale è la struttura migliore per farlo, pensando alla velocità dei risultati perché la tabella dei contenuti è un mastro MyISAM più di 30 file Millon.

Credo che in questo:

fare più 2 tavoli, "contents_hashtags" (id(INT11), content_id(INT11), hashtag_id(INT11)) e "hashtag" (id(INT11), hashtag(VARCHAR(40))) 2 tavoli InnoDB

Quando l'utente di creare/modificare il contenuto della tabella, I Cerca nel hashtags table e ottenere gli ID, se un hashtag che non esiste, crearlo nell'hashtag della tabella, se esiste, ottenere l'ID, utilizzando questi ID creare gli inserimenti nella tabella contents_hashtas asociating contents < -contents_hashtas-> hashtahs

Nella ricerca, effettuare le JOINS (SINISTRA/DESTRO/Tizio INTERIORE ..) e fai una ricerca di LIKE ?? da esatta (hashtag = "XXX") o RICERCA TESTO COMPLETO?

Questo metodo è corretto/veloce? Non so come eseguire questo con un grande conteggio delle righe e grande traffico ..

risposta

2

In realtà, uno tavolo extra è abbastanza

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

Ora è possibile aggiungere semplicemente il nome hastag. Per ottenere tutte le hashtags per un contenuto, utilizzare

SELECT hashtag FROM hashtable WHERE content_id=$content_id 

per aggiungere un rimuovere un hashtag, cancellarlo usando la sua identità o hashtag stesso. Per ottenere contenuti per hastags specifici, basta usare

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

e così via

3

tre tabelle farà il trucco:

Contenuto, hashtag, e ConTags. ConTags sarà una tabella di giunzioni contenente contents.id e hashtags.id. In questo modo, puoi attribuire più hashtag a ciascun elemento nel Contenuto.

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

In alternativa, impostare Hashtags Nome e ContentID chiave come unico e tabella di collegamento non è più necessario

+0

Quali sono i metodi di digiunare in cerca? il 3 o 2 metodi di tabella? Nel metodo a 3 tabelle è una relazione diretta da JOINs, ma nel metodo a 2 tabelle l'hashtag è "duplicato" per i contenuti (perché id + hashtag non può ripetersi). Se faccio una ricerca per esempio: content.active = 1 AND (contents.name = 'xxx' OR (Contags.hashtag = 'XXX' e Content.id = Contags.content_id)) – Zenth

+0

Suvviato per "In alternativa, imposta Nome hash e ContentId come chiave univoca". Non c'è bisogno di 3 tavoli 2 sarà sufficiente. – DeepBlue