[英]Best Way to make a “hashtag” system
這可能是一個問題,因為我浪費了更多時間去思考如何正確地做,以最佳的最佳方式去思考。
我有一個表“ Contents”,並且需要添加選項以將多個“ hashtags”或“ tags”或“ keywords”與內容相關聯,例如,諸如“番茄醬炸土豆”之類的內容具有“ keys”: “土豆”,“番茄醬”和“油炸”。
當我用一個單詞(例如“ potato”)進行搜索時,我需要顯示其中包含標記該單詞的內容。
問題是,考慮到結果的速度,最好的結構是什么,因為內容表是MyISAM模式,行數超過30 Millon。
我認為是這樣的:
在(id(INT11), content_id(INT11), hashtag_id(INT11))
2個表“ contents_hashtags” (id(INT11), content_id(INT11), hashtag_id(INT11))
和“ (id(INT11), hashtag(VARCHAR(40)))
” (id(INT11), hashtag(VARCHAR(40)))
當用戶創建/修改表內容時,我在hashtags表中搜索並獲取ID,如果不存在的hashtag,則在表hashtag中創建,如果存在,則獲取ID,使用此ID創建插入表content_hashtas中的關聯內容<-contents_hashtas-> hashtahs
在搜索中,進行JOINS(左/右/內部dude ..)並按LIKE進行搜索? 通過精確(標簽=“ XXX”)還是全文搜索?
這種方法正確/快速嗎? 我不知道如何以大行數和大流量運行此程序。
三個表可以解決問題:
內容,標簽和ConTag。 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
或者,將Hashtags Name和ContentId設置為唯一鍵,並且不再需要聯結表
實際上,多一張桌子就足夠了
“標簽”(id(INT11),標簽(VARCHAR(40)),content_id(int11))
現在,您只需按名稱添加hastag即可。 要獲取內容的所有主題標簽,請使用
SELECT hashtag FROM hashtable WHERE content_id=$content_id
要添加刪除主題標簽,請使用其ID或主題標簽本身將其刪除。 要獲取特定哈希標簽的內容,只需使用
SELECT ct.* from hashtable ht, contenttable ct WHERE ht.hashtag=$hastag and ct.id=ht.content_id
等等
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.