新人请教,文章标签数据库如何设计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaobai987
V2EX    数据库

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

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

    “目前主流的博客系统、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 个表只存映射关系?
    U7Q5tLAex2FI0o0g
        8
    U7Q5tLAex2FI0o0g  
       2017-05-24 09:39:58 +08:00
    @xiaobai987 #7
    一般你点击某个标签的时候,要反查出有这个标签的文章,一次标签需要单独一张表,只记录标签。要第三张表记录文章+标签的关系,如 6 楼说的关联表(文章 ID,标签 ID )
    U7Q5tLAex2FI0o0g
        9
    U7Q5tLAex2FI0o0g  
       2017-05-24 09:40:35 +08:00
    @littleylv #8
    一次标签需要单独一张表 => 因此标签需要单独一张表
    xiaobai987
        10
    xiaobai987  
    OP
       2017-05-24 09:56:38 +08:00
    @littleylv 也就是标签表、标签文章关系表(映射表数据行数=文章数*tag 数)、文章表。
    U7Q5tLAex2FI0o0g
        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 )
    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     Solana     944 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 21:31 PVG 05:31 LAX 14:31 JFK 17:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86