
“目前主流的博客系统、CMS 都会有一个 TAG 标签系统,不仅可以让内容链接的结构化增强,而且可以让文章根据 Tag 来区分。相比传统老式的 Keyword 模式,这种 Tag 模式可以单独的设计一个 Map 的映射表来增加系统的负载和查询的效率。”
想请问下大牛如何设计呢? php+mysql
1 Tifosi 2017-05-24 08:48:54 +08:00 同新手,我是直接抄了 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 |
8 U7Q5tLAex2FI0o0g 2017-05-24 09:39:58 +08:00 @xiaobai987 #7 一般你点击某个标签的时候,要反查出有这个标签的文章,一次标签需要单独一张表,只记录标签。要第三张表记录文章+标签的关系,如 6 楼说的关联表(文章 ID,标签 ID ) |
9 U7Q5tLAex2FI0o0g 2017-05-24 09:40:35 +08:00 @littleylv #8 一次标签需要单独一张表 => 因此标签需要单独一张表 |
10 xiaobai987 OP @littleylv 也就是标签表、标签文章关系表(映射表数据行数=文章数*tag 数)、文章表。 |
11 U7Q5tLAex2FI0o0g 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 表里的字段就好了 需要按标签索引再按时间排序的时候,再用得上中间表 |