日期:2014-05-16  浏览次数:20502 次

文章、主题等使用标签功能的几种方法

这段时间利用工作之余在做点东西,最初的出发点很简单,就是想有份长期维护的东西,有什么想法或者碰到什么新技术可以在上面直接进行实验,另外,也可以尝试着去学一些维护和运营之类的东西。

回到主题上,需要用到标签的功能,比如对文章或者主题之类的,添加标签关键进行描述。其实标签的使用最主要就以下几个场景:

1.一篇文章或者主题在显示的时候显示出它使用的标签列表;

2.按某种方式查看部分已有的标签列表,比如总的被关联次数;

3.查看使用某个标签的文章或者主题列表;

?

花了点时间想了下这方面的问题,然后在网上找了些相关的资料看了下,貌似基本上数据库层面基本上都是这几种方法:

1.最简单的方法:直接在需要添加标签功能的文章、主题表上添加一个varchar类型的tag字段,用于保存这个文章或主题使用的标签,多个标签使用空格或者逗号之类的进行分隔;

这种方法实现简单,但是存在几个较明显的问题。a. 因为受到varchar长度限制,单篇文章或主题关联的标签数量有限制(varchar设太长了性能问题);b. 存在大量标签名称的数据冗余; c. 要查询某个标签下的文章数量或文章列表时需要对每行记录中的tag字段做like查询,效率很慢。于是扩展出了第2种和第3种方法。

2.加一张标签表,其中有id, name(标签名), quote_time(被关联次数),原先的表中还是使用一个tag字段,其中用分隔符隔开关联的标签id;该方法可以解决第1种方法的a和b问题,c问题的前一部分可以解决;但是会引入新的问题,就是查看一篇文章或主题使用的标签名称时,需要根据tag字段的值做切割后再去查对应的标签名称。通常来说标签本身数据量不大,可以将标签放入缓存,减少数据库查询;

3.将第1种方法中的tag属性由varchar改为text,可以有效解决标签数量限制问题,然后对tag做fulltext,利用mysql的全文检索功能,降低查询时的代价;

4.新加一个标签文章关系表,其中有标签名称,文章id,解决第1种方法中的数量限制问题,也能解决做like查询造成的性能代价。然后,通过定时任务加缓存等策略解决查看标签被关联次数的问题,附带还可以统计出时间段内标签关联上升最快等功能。但是,标签名的数据冗余依旧。

5.最常规的做法:文章与标签为多对多关系,分解成三张表,文章表+标签+关联关系表。

?

上面几个都是今天晚上发现的一些比较常规的做法,希望起到抛砖引玉的效果,看到大家提出更加有创意的方法。

对于1、3、4、5方法,国外有人使用MySQL做了性能测试,不能的场景各有好坏,感兴趣的朋友可以看下这篇文章。