ASP.NET学习社区新生训练区数据库技术 Tags标签的数据库表设计

1  /  1  页   1 跳转 查看:409

Tags标签的数据库表设计

Tags标签的数据库表设计

闲话少说,先描述一下对象模型:
        Blog中一篇文章可以有多个Tag,一个Tag也可能包含很多文章,关于什么是Tag,您可以先看看这篇文章
        Tag在使用过程中会有以下的几种操作:
          1、添加
          2、删除
        就这个问题我咨询过不少同行,大部分的回答是在文章表中建立一个存贮Tag ID的字符串类型字段,每个TagID之间使用特殊字符分割,但我觉得这不是一个好的方法,违反了数据库使用的初衷,前几天受同学一句话的提醒,想出了下图中的这种模型:


        为了更明白的说清关系,图中的字段没设置太多,主要是中间加了个ArticleRelation表,用来记录Tags和Aritcles之间的映射关系,每个关系一条记录。

用下面的Select可以选出一篇文章的所有Tags:
      SELECT tags.name FROM Tags
      JOIN ArticleRelation
      ON tags.ID = ArticleRelation.TagID
      JOIN Articles
      ON Articles.ID=ArticleRelation.ArticlesID

用下面的Select可以选出一个Tag下面的所有文章:
      SELECT Articles.ID,Articles FROM Articles
      JOIN ArticleRelation
      ON Articles.ID=ArticleRelation.ArticlesID
      JOIN Tags
      ON tags.ID = ArticleRelation.TagID

 

我的Tags功能的实现

看了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?为了查询的时候不用关联而提高效率? 对,关联的话,数据查询应该比较大。
 
1  /  1  页   1 跳转

版权所有 ASP.NET学习门户 2.0.1214   Sitemap  

返顶部