OMG,到底在寻找什么..................
(构造一个完美的J2EE系统所需要的完整知识体系)
posts - 198,  comments - 37,  trackbacks - 0
原帖地址: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本:

代码
  1. CREATE TABLE store (   
  2.  bookname VARCHAR(255) NOT NULL,   
  3.  username VARCHAR(255) NOT NULL,   
  4.  PRIMARY KEY (bookname, username)   
  5. );   
  6.   
  7. INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'a');   
  8. INSERT INTO store (bookname, username) VALUES ('C++对象模型', 'a');   
  9. INSERT INTO store (bookname, username) VALUES ('C++24小时通', 'a');   
  10. INSERT INTO store (bookname, username) VALUES ('C++速成', 'a');   
  11.   
  12. INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'b');   
  13. INSERT INTO store (bookname, username) VALUES ('C++对象模型', 'b');   
  14. INSERT INTO store (bookname, username) VALUES ('C++24小时通', 'b');   
  15. INSERT INTO store (bookname, username) VALUES ('C++速成', 'b');   
  16.   
  17. INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'c');   
  18. INSERT INTO store (bookname, username) VALUES ('C++对象模型', 'c');   
  19. INSERT INTO store (bookname, username) VALUES ('C++24小时通', 'c');   
  20. INSERT INTO store (bookname, username) VALUES ('C++速成', 'c');   
  21.   
  22. INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'd');   
  23. INSERT INTO store (bookname, username) VALUES ('C++24小时通', 'd');   
  24. INSERT INTO store (bookname, username) VALUES ('C++速成', 'd');   
  25.   
  26. INSERT INTO store (bookname, username) VALUES ('C++编程语言', 'e');   
  27. INSERT INTO store (bookname, username) VALUES ('C++速成', 'e');   
  28.   
  29.     
  30.   
  31. select bookname, count(*) from store where username in   
  32. (   
  33.  select username from store where bookname = 'C++编程语言'   
  34. )   
  35. and bookname <> 'C++编程语言'   
  36. group by bookname   
  37. having count(*) >= 0  
  38. order by count(*) desc   
  39. 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

只有注册用户登录后才能发表评论。


网站导航:
 

<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(1)

随笔分类

随笔档案

IT风云人物

文档

朋友

相册

经典网站

搜索

  •  

最新评论

阅读排行榜

评论排行榜