首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  数据库

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

  •  
  •   xiaobai987 · 2017-05-24 08:45:00 +08:00 · 1047 次点击
    这是一个创建于 927 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    20 回复  |  直到 2017-05-24 14:28:55 +08:00
        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   2017-05-24 08:57:19 +08:00
    @creatorYC 多对多我是直接存到文章表,然后,号或者|分割
        4
    xiaobai987   2017-05-24 09:00:38 +08:00
    @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   2017-05-24 09:13:01 +08:00
    @yidinghe 意思一共 3 个表,第 3 个表只存映射关系?
        8
    littleylv   2017-05-24 09:39:58 +08:00
    @xiaobai987 #7
    一般你点击某个标签的时候,要反查出有这个标签的文章,一次标签需要单独一张表,只记录标签。要第三张表记录文章+标签的关系,如 6 楼说的关联表(文章 ID,标签 ID )
        9
    littleylv   2017-05-24 09:40:35 +08:00
    @littleylv #8
    一次标签需要单独一张表 => 因此标签需要单独一张表
        10
    xiaobai987   2017-05-24 09:56:38 +08:00
    @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   2017-05-24 10:04:28 +08:00
    @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   2017-05-24 10:13:33 +08:00
    @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
    gulu   2017-05-24 14:28:55 +08:00 via Android
    中间表存关系
    id | post_id | tag_id | created_time

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

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

    需要按标签索引再按时间排序的时候,再用得上中间表
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2238 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 44ms · UTC 10:27 · PVG 18:27 · LAX 02:27 · JFK 05:27
    ♥ Do have faith in what you're doing.