今日头条、微博 timeline 中的是否收藏、点赞、关注数据库应该怎么设计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kaxi
V2EX    数据库

今日头条、微博 timeline 中的是否收藏、点赞、关注数据库应该怎么设计?

  •  
  •   kaxi 2018-08-23 18:46:03 +08:00 3412 次点击
    这是一个创建于 2618 天前的主题,其中的信息可能已经有所发展或是发生改变。

    拉一页的动态,假如 20 条数据出来。每条动态上需要点亮是否关注、收藏、点赞这些状态。请问应该怎么去设计数据库比较合理?

    我目前是在关系型数据库中通过下面的方式实现的,但是感觉性能上有缺陷。 如果用 nosql 的方式,又存在点赞人数非常多比如极端几十万个用户点赞,这种问题。 麻烦佬指点一下!

    //关注状态 if($needFollow){ $in = trim(implode(',', array_unique($uid_follow)),','); $res = $this->query("SELECT `uid_follower` FROM relationship WHERE uid_follower in (".$in.")"); foreach ($res as $v){ $ufArr[$v['uid_follower']] = 1; } } //点赞状态 $in = trim(implode(',', array_unique($feedid_uid)),','); $res = $this->query("SELECT `feedid_liker` FROM feed_like WHERE feedid_liker in (".$in.")"); foreach ($res as $v){ $fuArr[$v['feedid_liker']] = 1; } //收藏状态 $in = trim(implode(',', array_unique($feedid_uid)),','); $res = $this->query("SELECT `feedid_uid` FROM collect WHERE feedid_uid in (".$in.")"); foreach ($res as $v){ $cfuArr[$v['feedid_uid']] = 1; } 
    16 条回复    2018-08-24 08:58:34 +08:00
    kaxi
        1
    kaxi  
    OP
       2018-08-23 18:51:14 +08:00
    我考虑将上面三种状态的查询通过异步执行的方式去执行。性能应该会有所提高。但是感觉还是治标不治本。

    感觉还是需要在数据库层面去想办法才行。

    望高人指点
    jininij
        2
    jininij  
       2018-08-23 19:09:22 +08:00 via iPhone   1
    经常有一条微博被点十万加的赞。但很少有人给十万条微博点赞。所以优先肯定是以用户来分组。
    每篇微博的 id,用一个 8 字节的长整数,点十万个赞也就 80k 的数据。客户端 down 到本地来,逐条处理都可以。
    只是提供一种思路。
    kaxi
        3
    kaxi  
    OP
       2018-08-23 19:19:43 +08:00
    @jininij 好像你这种方案还是没解决需要多路查询的问题,或者我没理解到位? 我想如果用 nosql 的方案每条动态里都记录点赞、收藏的用户 id 这样就可以不用查询别的表就能判断点赞、收藏状态了。但存在的问题是当点赞、收藏用户量很大的话那么对应的动态记录数据量就会异常大了。如果用关系型数据库,有需要每次都去查询多张表。
    yuanfnadi
        4
    yuanfnadi  
       2018-08-23 21:27:56 +08:00 via iPhone
    @kaxi 有一个史上最大的 redis 集群。
    kaxi
        5
    kaxi  
    OP
       2018-08-23 21:28:52 +08:00
    help
    kaxi
        6
    kaxi  
    OP
       2018-08-23 21:31:14 +08:00
    @yuanfnadi 求细说,现在主要是这种状态关系用什么方案得到最佳
    sy20030260
        7
    sy20030260  
       2018-08-23 21:54:03 +08:00 via Android   2
    这种有实时性需求的场景,存储自然会使用到 Redis 或者其他的 NoSQL,只用 MySQL 之类的数据库单机性能在这种场景肯定是不足的,除此之外一般还需要做:
    1.使用 MQ 做异步解耦
    2.数据冷热分离,热数据冷却下沉至 SSD 或硬盘
    sy20030260
        8
    sy20030260  
       2018-08-23 21:58:49 +08:00 via Android
    而且点赞关注这种消息流服务是一个完整的后台服务模块,单单考虑存储设计是不足以解决所有问题的,消息旁路,消息防丢,服务降级...是个大的系统问题
    howryan
        9
    howryan  
       2018-08-23 22:05:13 +08:00
    mark
    F281M6Dh8DXpD1g2
        10
    F281M6Dh8DXpD1g2  
       2018-08-23 22:06:19 +08:00 via iPhone
    你注意看就知道微博那个对于热点大部分时候是不准的
    kaxi
        11
    kaxi  
    OP
       2018-08-23 22:08:42 +08:00
    @sy20030260 感谢提醒。如果将三种关系表都存到缓存其实性能瓶颈就基本消失了,其实三种状态查询就是简单 key-value
    kaxi
        12
    kaxi  
    OP
       2018-08-23 22:09:18 +08:00
    @liprais 是的,包括抖音
    liubai
        13
    liubai  
       2018-08-23 22:59:11 +08:00   1
    建议使用 KV 存储,如 Redis、HBase 等,实际上这种 Feed 流系统可以直接抛弃关系型数据库,全部使用 KV 解决。当然数据量少的情况,可以用下关系型数据库。
    之前做过一个分享 https://myslide.cn/slides/9250,希望能有所帮助。
    kaxi
        14
    kaxi  
    OP
       2018-08-23 23:31:10 +08:00
    @liubai 嗯 多谢
    teek
        15
    teek  
       2018-08-23 23:39:39 +08:00
    关系型其实可以作为系统最后的一个存储地方,前面加缓存,比如 redis 这种,redis 重点可以用那些批量的操作,减少网络 io 的耗时,用好批量,在我系统下有 100 倍的提升。
    owenliang
        16
    owenliang  
       2018-08-24 08:58:34 +08:00 via Android
    微博被点赞是微博的属性,你是否点赞是你的属性,两码事吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5225 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 07:44 PVG 15:44 LAX 00:44 JFK 03:44
    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