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

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

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

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

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

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

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

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

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

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

    需要按标签索引再按时间排序的时候,再用得上中间表
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2648 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:50 · PVG 10:50 · LAX 18:50 · JFK 21:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.