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

问一个文章管理系统数据库设计的问题
先在很多blog都有文章标签的功能,就是说一片文章不仅可以有一个分类,还可以给文章额外的添加一些标签,比如一篇跟smarty,mysql,php有关的文章可以放到php分类里面,但是用户还可以给文章贴标签,比如smarty标签和mysql标签。

csdn发帖的地方就有这个功能(刚发现)

我想请教一下这种功能数据库怎么实现最方便,我是新手哦

我自己设计的,想知道还有什么更加简单的方法

aritlce表 (aid, aname, acontent)
tag表(tid,tname)
tag-article表(aid, tid)

数据库例子
SQL code

aritlce表
--------------------------
aid    aname   acontent
1      hehe    hehehe
2      hehe    hehehe
3      hehe    hehehe
--------------------------
tag表
--------------------------
tid    tname
1      php
2      smarty
--------------------------
tag-article表
---------------------------
aid    tid
1      1
1      2
2      1
----------------------------



这样设计我觉得应该可以,但是查询一篇文章要连接3张表,会不会有性能上的问题,此外可能还要列出那些tag文章最多这种统计的信息


------解决方案--------------------
但是查询一篇文章要连接3张表,会不会有性能上的问题
只要有合适的索引的话,对性能的影响不大
------解决方案--------------------


引用 aritlce表 (aid, aname, acontent)
tag表(tid,tname)
tag-article表(aid, tid)

------解决方案--------------------
探讨
yueliangdao0608

你这样写的话tagname这列怎么写呢?用逗号分隔吗?这样如果我要显示最热门的标签(比如top10)这样的统计信息貌似性能很低而且很麻烦啊

------解决方案--------------------
aritlce表 (aid, aname, acontent)
 tag表(tid,tname)
 tag-article表(aid, tid) 

你的设计非常的正确与合理.
为了给标签排列进行热门标签统计,建议在tag表上增加一个字段:

usecount //使用次数
tag表(tid,tname,usecount) 

若不这样,从性能上来说对tag-article表进行热门标签统计性能是很低的.尤其是tag-article表很大的时候(这个表是比较容易大的,因为一篇文章可以有很多个标签)

增加usecount字段的代价就是要多一些更新操作(update).所以不建议在这个字段上加索引(因加索引后频繁更新的话相对来说会慢一些).
一般热门标签(如最热门的前100个标签),从数据库读取之后最好进行缓存.这样可确保性能.