问一个文章管理系统数据库设计的问题

palm_civet 2008-05-09 03:10:50
先在很多blog都有文章标签的功能,就是说一片文章不仅可以有一个分类,还可以给文章额外的添加一些标签,比如一篇跟smarty,mysql,php有关的文章可以放到php分类里面,但是用户还可以给文章贴标签,比如smarty标签和mysql标签。

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

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

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

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

数据库例子

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文章最多这种统计的信息
...全文
388 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xing007008 2009-03-04
  • 打赏
  • 举报
回复
前面提到的索引是指主键索引吗?
palm_civet 2008-05-10
  • 打赏
  • 举报
回复
冗余,非常多的冗余


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


这个怎么样啊
懒得去死 2008-05-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fafa211 的回复:]
关于联表的性能,只要索引建得恰当,
如3楼说的
aritlce: aid索引
tag: tid索引
上建索引就是很正确的.
这样数据查询会先根据索引来确定需要读取的数据,而索引通常情况下都是缓存在内存中的(这个要mysql服务器设置好),当然速度自然不可能会慢的.
可以说只要有适当的索引,联表对性能的影响是非常小的.

[/Quote]

分析的挺好。
赞一个。

至少对于前期是非常的好的设计。



懒得去死 2008-05-10
  • 打赏
  • 举报
回复
热门标签和你的标签表tag-article表(aid, tid)

属性完全一样就可以了。
palm_civet 2008-05-09
  • 打赏
  • 举报
回复
楼上的方法不错,我没想到这个方法啊,看看楼下还有什么好的建议
猪猪执行官 2008-05-09
  • 打赏
  • 举报
回复
关于联表的性能,只要索引建得恰当,
如3楼说的
aritlce: aid索引
tag: tid索引
上建索引就是很正确的.
这样数据查询会先根据索引来确定需要读取的数据,而索引通常情况下都是缓存在内存中的(这个要mysql服务器设置好),当然速度自然不可能会慢的.
可以说只要有适当的索引,联表对性能的影响是非常小的.
猪猪执行官 2008-05-09
  • 打赏
  • 举报
回复
aritlce表 (aid, aname, acontent)
tag表(tid,tname)
tag-article表(aid, tid)

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

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

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

增加usecount字段的代价就是要多一些更新操作(update).所以不建议在这个字段上加索引(因加索引后频繁更新的话相对来说会慢一些).
一般热门标签(如最热门的前100个标签),从数据库读取之后最好进行缓存.这样可确保性能.
palm_civet 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yueliangdao0608 的回复:]
引用 8 楼 palm_civet 的回复:
yueliangdao0608

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


热门标签重新做一个表不就行了.
[/Quote]

你的意思是tagname保存在文章表里,同时也往tag表里面存数据?这个也不错,就是跟你上面说的一样有冗余了,看来没有两全其美的方法啊
懒得去死 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 palm_civet 的回复:]
yueliangdao0608

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

热门标签重新做一个表不就行了.
palm_civet 2008-05-09
  • 打赏
  • 举报
回复
yueliangdao0608

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

[Quote] aritlce表 (aid, aname, acontent)
tag表(tid,tname)
tag-article表(aid, tid) [/Quote]

这个方法很好了
==== ====
WWWWA 2008-05-09
  • 打赏
  • 举报
回复
一个表冗余多,还是分表好一些
懒得去死 2008-05-09
  • 打赏
  • 举报
回复
1、你的设计完全符合标准的3NF
缺点是有连表开销
2、aritlce表 (aid, aname, acontent,tagname,category_name)
这样只需要一个单表,缺点是冗余数据太多。
palm_civet 2008-05-09
  • 打赏
  • 举报
回复
谢谢 WWWWA 明天结贴 o(∩_∩)o...
WWWWA 2008-05-09
  • 打赏
  • 举报
回复
aritlce: aid索引
tag: tid索引
palm_civet 2008-05-09
  • 打赏
  • 举报
回复
应该建哪些索引呢?
每个表上的aid,tid都要建吗?
WWWWA 2008-05-09
  • 打赏
  • 举报
回复
但是查询一篇文章要连接3张表,会不会有性能上的问题
只要有合适的索引的话,对性能的影响不大

56,867

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧