V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
laoli123
V2EX  ›  数据库

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

  •  
  •   laoli123 · May 24, 2017 · 1989 views
    This topic created in 3260 days ago, the information mentioned may be changed or developed.

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

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

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

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

    article_tag
    - article_id
    - tag_id
    zhengxiaowai
        14
    zhengxiaowai  
       May 24, 2017
    中间表,多对对,参考 django tag
    freestyle
        15
    freestyle  
       May 24, 2017
    mysql 5.7 可以存数组, 有没有勇气试一下?
    laoli123
        16
    laoli123  
    OP
       May 24, 2017
    @freestyle 没试过哦,能存数组那是最好了
    mortonnex
        17
    mortonnex  
       May 24, 2017 via iPhone
    标签建议用 redis 的 set,取交集和并集爽歪歪
    yidinghe
        18
    yidinghe  
       May 24, 2017 via Android
    @xiaobai987 多对多启用中间表这是关系数据库设计的标准套路
    mooncakejs
        19
    mooncakejs  
       May 24, 2017 via iPhone
    都什么时候了,json 数组搞定
    HFcbyqP0iVO5KM05
        20
    HFcbyqP0iVO5KM05  
       May 24, 2017 via Android
    中间表存关系
    id | post_id | tag_id | created_time

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

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

    需要按标签索引再按时间排序的时候,再用得上中间表
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3379 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 12:28 · PVG 20:28 · LAX 05:28 · JFK 08:28
    ♥ Do have faith in what you're doing.