2012-02-14 104 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

相关问题