这可能是一个问题,我失去了更多的时间来思考如何做到正确,以最佳的优化方式思考。
我有一个表"内容",并且需要添加选项以关联多个" hashtags"或"标签"或"关键字"对于内容,例如,用番茄酱和#34;油炸马铃薯等内容。有#34;键":"马铃薯","番茄酱"和"炒"。
当我用一个单词进行搜索时,例如" potato",我需要显示其中的内容标记这个单词。
问题是,它的最佳结构是什么,考虑结果的速度,因为内容表是MyISAM mith超过30 Millon行。
我想在这:
再制作两张桌子," contents_hashtags" (id(INT11), content_id(INT11), hashtag_id(INT11))
和" hashtags" (id(INT11), hashtag(VARCHAR(40)))
InnoDB中的2个表
当用户创建/修改表格内容时,我在hashtags表中搜索并获取ID,如果不存在的标签,则在表格标签中创建它,如果存在,则获取ID,使用此ID在表contents_hashtas中创建插入内容< -contents_hashtas-> hashtahs
在搜索中,进行JOINS(LEFT / RIGHT / INNER dude ..)并通过LIKE进行搜索? by exact(hashtag =" XXX")或FULL TEXT SEARCH?
这种方法是正确/快速的吗?我不知道如何以大排量和大流量来运行它。
答案 0 :(得分:3)
三个表格可以解决问题:
内容,Hashtags和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
或者,将Hashtags 名称和 ContentId 设置为唯一键,不再需要联结表
答案 1 :(得分:2)
实际上,一个额外的表就足够了
“hashtags”(id(INT11),hashtag(VARCHAR(40))),content_id(int11))
现在您只需按名称添加hastag即可。要获取内容的所有主题标签,请使用
SELECT hashtag FROM hashtable WHERE content_id=$content_id
要添加删除主题标签,请使用其ID或主题标签将其删除。要获取特定hastag的内容,请使用
SELECT ct.* from hashtable ht, contenttable ct WHERE ht.hashtag=$hastag and ct.id=ht.content_id
等等