看了jessezhao的Web2.0里面的Tags功能的实现 (http://www.cnblogs.com/jessezhao/archive/2007/03/20/680520.html)。
于是把自己的tags实现也贴上来吧:
1.表的关系
我是用三个表来实现的:一个主的文章表,两个tags的附加表。
2.数据插入
在文章表news里边有一个字段news_tags,放置该文章的所有tags。
比如一个简单的文章:五邑大学第十四届辩论赛
添加者提取的tags是:五邑大学 第十四届辩论赛 赛徽 辩题
这四个tag就放在news_tags里边。
插入这个文章的代码实现上有四个过程,后边三个用事务实现就是了:
单个tag是否存在(已经存在就跳过最后一步的单个tag插入),文章插入(news),tag和文章连接的插入(news_tags_link),news_tags还不存在的单个tag插入
3.数据修改
修改这个文章就只是需要加多一个删除原来的news_tags_link就可以了。
代码实现上有五个过程,后边四个是用事务来实现:
单个tag是否存在(已经存在就跳过最后一步的单个tag插入),文章插入(news),删除所有的与该文章相关的news_tags_link,tags和文章连接管理的插入(news_tags_link),news_tags的单个tag插入
很容易看到,这个方法没有删除news_tags中多余的tag(在news修改时候删除的tags)。
不好意思,文章乱乱的。希望能看明白。
====
tag实际上就是把相关的日志联系起来.比如过年的时候tag写"高兴,过年",过生日的时候写"高兴,生日",那么点高兴就可以连到这两个日志.
实现起来不复杂
以前写过一个博客程序,下面是tag部分,不知道好不好看懂
if p_tags<>"" then
tags=split(p_tags,",")
for i=0 to ubound(tags)
set rs=conn.execute("select tagid from tags where name='"&tags(i)&"'")
if rs.eof then
conn.execute("insert into tags (name,addTagStyle) values ('"&tags(i)&"','"&request("nTagStyle")&"')")
tag_t=conn.execute("select top 1 TagID FROM tags ORDER BY TagID DESC")(0)
new_tag=new_tag & tags(i) & ","
new_tagid=new_tagid & tag_t & ","
else
tag_t=rs(0)
end if
conn.execute("insert into taglink (tagid,fid) values ("& tag_t &","& fid &")")
rs.close
if i=ubound(tags) then
tagidlist=tagidlist & tag_t
else
tagidlist=tagidlist & tag_t & ","
end if
next
end if