新人请教,文章标签数据库如何设计?

2017-05-24 08:45:00 +08:00
 xiaobai987

“目前主流的博客系统、CMS 都会有一个 TAG 标签系统,不仅可以让内容链接的结构化增强,而且可以让文章根据 Tag 来区分。相比传统老式的 Keyword 模式,这种 Tag 模式可以单独的设计一个 Map 的映射表来增加系统的负载和查询的效率。”

想请问下大牛如何设计呢? php+mysql

1442 次点击
所在节点    数据库
20 条回复
Tifosi
2017-05-24 08:48:54 +08:00
同新手,我是直接抄了 wordpress 的表,然后简化了一下
creatorYC
2017-05-24 08:53:02 +08:00
像我这种新手,设计标签时还是把博客和标签看成多对多关系,查询时还得通过中间表。不过现在的 ORM 框架已经帮忙做这个了,性能不是很了解,因为我没有接触过那么大的并发访问的情况
xiaobai987
2017-05-24 08:57:19 +08:00
@creatorYC 多对多我是直接存到文章表,然后,号或者|分割
xiaobai987
2017-05-24 09:00:38 +08:00
@Tifosi 不知道 discuz 的表结构怎么样
owenliang
2017-05-24 09:01:57 +08:00
多对多关系 主要是关联表物理删除 标签表逻辑删除或者不删除 优化就是按文章维度缓存标签 id 和名称 按标签维度缓存名称
yidinghe
2017-05-24 09:02:57 +08:00
一般会设计多对多的关联表(文章 ID,标签 ID ),表记录数通常为文章数量的 2 到 3 倍(一般文章标签也就打两三个),大致是可以接受的。
xiaobai987
2017-05-24 09:13:01 +08:00
@yidinghe 意思一共 3 个表,第 3 个表只存映射关系?
littleylv
2017-05-24 09:39:58 +08:00
@xiaobai987 #7
一般你点击某个标签的时候,要反查出有这个标签的文章,一次标签需要单独一张表,只记录标签。要第三张表记录文章+标签的关系,如 6 楼说的关联表(文章 ID,标签 ID )
littleylv
2017-05-24 09:40:35 +08:00
@littleylv #8
一次标签需要单独一张表 => 因此标签需要单独一张表
xiaobai987
2017-05-24 09:56:38 +08:00
@littleylv 也就是标签表、标签文章关系表(映射表数据行数=文章数*tag 数)、文章表。
littleylv
2017-05-24 10:03:30 +08:00
@xiaobai987 #10
“映射表数据行数=文章数*tag 数” 这个你理解错了
假设你有 10 篇文章,有 20 个 tag,关系表数据不等于 10*20
因为不是每片文章都关联 20 个 tag 呀,可能 2 个,可能 3 个,可能 5 个
所以关系表行数=文章数*(大概 3-5 )
xiaobai987
2017-05-24 10:04:28 +08:00
@littleylv 谢谢,大概意思明白了
twm
2017-05-24 10:06:19 +08:00
tag
-id
-name
//...

article
-id
-title
-body
/....

article_tag
- article_id
- tag_id
zhengxiaowai
2017-05-24 10:10:19 +08:00
中间表,多对对,参考 django tag
freestyle
2017-05-24 10:11:52 +08:00
mysql 5.7 可以存数组, 有没有勇气试一下?
xiaobai987
2017-05-24 10:13:33 +08:00
@freestyle 没试过哦,能存数组那是最好了
mortonnex
2017-05-24 10:14:00 +08:00
标签建议用 redis 的 set,取交集和并集爽歪歪
yidinghe
2017-05-24 10:32:01 +08:00
@xiaobai987 多对多启用中间表这是关系数据库设计的标准套路
mooncakejs
2017-05-24 12:03:53 +08:00
都什么时候了,json 数组搞定
gulu
2017-05-24 14:28:55 +08:00
中间表存关系
id | post_id | tag_id | created_time

然后 post 表里面再存一个字段缓存

然后你拿 post 信息的时候,标题啊,内容啊,标签啊,直接就返回 post 表里的字段就好了

需要按标签索引再按时间排序的时候,再用得上中间表

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/363372

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX