2012-02-14 40 views
8

這可能是一個問題,我失去了更多時間去思考如何做正確的事情,並以最佳優化方式進行思考。製作「hashtag」系統的最佳方式

我有一個表「內容」,並且需要添加選項以將多個「hashtags」或「tags」或「關鍵字」關聯到內容,例如,像「tomato potatos with tomato sauce」這樣的內容具有「鑰匙」:「土豆」,「番茄醬」和「油炸」。

而當我通過一個詞搜索,例如「馬鈴薯」,我需要顯示其中的內容標記這個詞。

問題是,什麼是最好的結構來做到這一點,思考結果的速度,因爲內容表是MyISAM mith超過30 Millon行。

我想在這個:

讓2個表,「contents_hashtags」 (id(INT11), content_id(INT11), hashtag_id(INT11))和「井號標籤」 (id(INT11), hashtag(VARCHAR(40))) 2個InnoDB的

當用戶創建/修改表的內容表,我在搜索hashtags表並獲取ID,如果不存在hashtag,則在表中創建hashtag,如果存在,則獲取ID,使用此ID在表中創建插入contents_hashtas asociating contents < -contents_hashtas-> hashtahs

在搜索中,使JOINS(LEFT/RIGHT/INNER dude ..)並通過LIKE進行搜索?確切(hashtag =「XXX」)或全文搜索?

此方法正確/快速嗎?我不知道如何與一個大的行數和大流量運行這個..

回答

2

其實,一個額外的表是足夠

「井號標籤」(ID(INT11),包括hashtag(VARCHAR(40)))的content_id (int11))

現在您可以簡單地按名稱添加hastag了。要獲得內容的所有井號標籤,使用

SELECT hashtag FROM hashtable WHERE content_id=$content_id 

要添加刪除#標籤,使用ID或主題標籤本身刪除。要獲得具體hastags內容,只需使用

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

3

三表就可以了:

內容,主題標籤,並ConTags。 ConTags將是包含contents.id和hashtags.id的聯結表。通過這種方式,您可以將多個哈希標籤歸入內容中的每個項目。

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

另外,設置主題標籤名稱內容識別作爲唯一鍵和接線表不再需要

+0

什麼方法快速搜索? 3桌子還是2桌子的方法? 3表中的方法是JOINs的直接關係,但在2表方法中,hashtag對於內容是「重複的」(因爲id + hashtag無法重複)。如果我搜索例子:content.active = 1 AND(contents.name ='xxx'OR(Contags.hashtag ='XXX'and Content.id = Contags。content_id)) – Zenth 2012-02-15 09:04:18

+0

Upvoted for「或者,將Hashtags Name和ContentId設置爲唯一鍵」。不需要3桌2就足夠了。 – DeepBlue 2017-01-10 23:28:21

相關問題