原帖地址:
http://www.javaeye.com/topic/41018————————————————————————————————
Tag已经成为Blog的一个事实标准之一,但是对于Tag的设计和实现方面很少找到相关资料:( 1.Tag是否需要单独建表统计管理?那么增加、更新和删除如何处理? 2.Tag的关联性如何实现? ————————————————————————————————————————
一种是用一个tag表和一个tag与其它表的关联表来实现,实现方式稍复杂些,你要记录关联的类型和ID。增加删除就是处理这个关联的表,更新可以分解为增加和删除。 另一种是利用类似lucene的引擎,把tag丢进去就可以了,实际上我没用过它,不过简单测试过在rails项目里用ferret,它没有中文分词,搜索中文不太好用,但对于tag正合适,只要用一个字段把tag用空格分开再放进去,只索引这一个字段。增加、删除、更新其实只需要更新tags字段,ferret索引也更新一下就可以了。 关联性是个复杂点的问题,以前问了别人一个SQL语句,不过测试性能一般。没想到好主意,不过暂时也用不上它。
———————————————————————————————————————————— |
1.使用数据库来存储,总觉得很难处理,但是方便统计和检索,再更新上效率低下,另外但数据量非常大的时候,性能会下降很快。
2.使用Lucene是一个非常好的建议,但是我希望对Tag的使用上做不少细化的工作,如“Java”这个Tag在我的博客、我所在的圈子、网站等各级的统计,不知道Lucence是否支持?
3.JavaEye使用了Tag技术,不知道如何实现的?
_____________________________________________________________________________
1.使用数据库来存储,总觉得很难处理,但是方便统计和检索,再更新上效率低下,另外但数据量非常大的时候,性能会下降很快。
2.使用Lucene是一个非常好的建议,但是我希望对Tag的使用上做不少细化的工作,如“Java”这个Tag在我的博客、我所在的圈子、网站等各级的统计,不知道Lucence是否支持?
3.JavaEye使用了Tag技术,不知道如何实现的?
————————————————————————————————————————————
frank_cn 写道
1.使用数据库来存储,总觉得很难处理,但是方便统计和检索,再更新上效率低下,另外但数据量非常大的时候,性能会下降很快。
这要看如何设计以及如何检索,如果是搜索某个tag对应的记录,其实是非常快的,tag关联表用复合主键,把tag_id作复合主键的第1个,检索是非常快的,因为用了主键索引。
frank_cn 写道
2.使用Lucene是一个非常好的建议,但是我希望对Tag的使用上做不少细化的工作,如“Java”这个Tag在我的博客、我所在的圈子、网站等各级的统计,不知道Lucence是否支持?
如果是统计这个,用数据库效率也可以很高,加上适当的缓存(比如热门tag缓存起来)。lucence不清楚。
我当时有点兴趣的是如何查询“购买了某书的人也购买了XX书”,这和标签关联有点相似,可以做一些关联性内容的推送。以前在CSDN问了一个,有人回复我一个,可以查询“购买了C++编程语言书的人也购买了XX书”,列出前2本:
代码
- CREATE TABLE store (
- bookname VARCHAR(255) NOT NULL,
- username VARCHAR(255) NOT NULL,
- PRIMARY KEY (bookname, username)
- );
-
- INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'a');
- INSERT INTO store (bookname, username) VALUES ('C++对象模型', 'a');
- INSERT INTO store (bookname, username) VALUES ('C++24小时通', 'a');
- INSERT INTO store (bookname, username) VALUES ('C++速成', 'a');
-
- INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'b');
- INSERT INTO store (bookname, username) VALUES ('C++对象模型', 'b');
- INSERT INTO store (bookname, username) VALUES ('C++24小时通', 'b');
- INSERT INTO store (bookname, username) VALUES ('C++速成', 'b');
-
- INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'c');
- INSERT INTO store (bookname, username) VALUES ('C++对象模型', 'c');
- INSERT INTO store (bookname, username) VALUES ('C++24小时通', 'c');
- INSERT INTO store (bookname, username) VALUES ('C++速成', 'c');
-
- INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'd');
- INSERT INTO store (bookname, username) VALUES ('C++24小时通', 'd');
- INSERT INTO store (bookname, username) VALUES ('C++速成', 'd');
-
- INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'e');
- INSERT INTO store (bookname, username) VALUES ('C++速成', 'e');
-
-
-
- select bookname, count(*) from store where username in
- (
- select username from store where bookname = 'C++编程语言'
- )
- and bookname <> 'C++编程语言'
- group by bookname
- having count(*) >= 0
- order by count(*) desc
- limit 2;
效率不太高。我觉得tag最应该有的作用就是这个了。
————————————————————————————————————————————
一张tag表存储tag到文章的对应关系。
然后每个文章还有个tagtxt字段,各个tag用空格进行分隔。
在增加/修改文章的时候,对tag进行一次关联,并增加新增的tag。
现在有些问题。tag名字的修改,得修改所有的tagtxt字段。不过修改tag名字的功能应当不是很必要。
posted on 2007-01-14 02:30
OMG 阅读(866)
评论(0) 编辑 收藏 所属分类:
Ajax/RSS/Tag