“目前主流的博客系统、CMS 都会有一个 TAG 标签系统,不仅可以让内容链接的结构化增强,而且可以让文章根据 Tag 来区分。相比传统老式的 Keyword 模式,这种 Tag 模式可以单独的设计一个 Map 的映射表来增加系统的负载和查询的效率。”
想请问下大牛如何设计呢? php+mysql
1
Tifosi 2017-05-24 08:48:54 +08:00 1
同新手,我是直接抄了 wordpress 的表,然后简化了一下
|
2
creatorYC 2017-05-24 08:53:02 +08:00 via Android
像我这种新手,设计标签时还是把博客和标签看成多对多关系,查询时还得通过中间表。不过现在的 ORM 框架已经帮忙做这个了,性能不是很了解,因为我没有接触过那么大的并发访问的情况
|
3
xiaobai987 OP @creatorYC 多对多我是直接存到文章表,然后,号或者|分割
|
4
xiaobai987 OP @Tifosi 不知道 discuz 的表结构怎么样
|
5
owenliang 2017-05-24 09:01:57 +08:00 via Android
多对多关系 主要是关联表物理删除 标签表逻辑删除或者不删除 优化就是按文章维度缓存标签 id 和名称 按标签维度缓存名称
|
6
yidinghe 2017-05-24 09:02:57 +08:00 via Android
一般会设计多对多的关联表(文章 ID,标签 ID ),表记录数通常为文章数量的 2 到 3 倍(一般文章标签也就打两三个),大致是可以接受的。
|
7
xiaobai987 OP @yidinghe 意思一共 3 个表,第 3 个表只存映射关系?
|
8
littleylv 2017-05-24 09:39:58 +08:00
@xiaobai987 #7
一般你点击某个标签的时候,要反查出有这个标签的文章,一次标签需要单独一张表,只记录标签。要第三张表记录文章+标签的关系,如 6 楼说的关联表(文章 ID,标签 ID ) |
10
xiaobai987 OP @littleylv 也就是标签表、标签文章关系表(映射表数据行数=文章数*tag 数)、文章表。
|
11
littleylv 2017-05-24 10:03:30 +08:00
@xiaobai987 #10
“映射表数据行数=文章数*tag 数” 这个你理解错了 假设你有 10 篇文章,有 20 个 tag,关系表数据不等于 10*20 因为不是每片文章都关联 20 个 tag 呀,可能 2 个,可能 3 个,可能 5 个 所以关系表行数=文章数*(大概 3-5 ) |
12
xiaobai987 OP @littleylv 谢谢,大概意思明白了
|
13
twm 2017-05-24 10:06:19 +08:00
tag
-id -name //... article -id -title -body /.... article_tag - article_id - tag_id |
14
zhengxiaowai 2017-05-24 10:10:19 +08:00
中间表,多对对,参考 django tag
|
15
freestyle 2017-05-24 10:11:52 +08:00
mysql 5.7 可以存数组, 有没有勇气试一下?
|
16
xiaobai987 OP @freestyle 没试过哦,能存数组那是最好了
|
17
mortonnex 2017-05-24 10:14:00 +08:00 via iPhone
标签建议用 redis 的 set,取交集和并集爽歪歪
|
18
yidinghe 2017-05-24 10:32:01 +08:00 via Android
@xiaobai987 多对多启用中间表这是关系数据库设计的标准套路
|
19
mooncakejs 2017-05-24 12:03:53 +08:00 via iPhone
都什么时候了,json 数组搞定
|
20
HFcbyqP0iVO5KM05 2017-05-24 14:28:55 +08:00 via Android
中间表存关系
id | post_id | tag_id | created_time 然后 post 表里面再存一个字段缓存 然后你拿 post 信息的时候,标题啊,内容啊,标签啊,直接就返回 post 表里的字段就好了 需要按标签索引再按时间排序的时候,再用得上中间表 |