V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
piqizhu8
V2EX  ›  问与答

有 1000w 个用户,有 10w 个文章,数据库如何存每个用户收藏的文章呢?

  •  
  •   piqizhu8 · 2021-03-06 22:30:12 +08:00 · 1820 次点击
    这是一个创建于 1358 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库:PostgreSQL 10

    假设有 1000w 个用户,且用户还会增长

    有 10w 个文章,且文章也会不停增长,但文章增加较慢

    怎么设计数据库,来存储,每个用户收藏的文章呢


    我目前的方案是, 新建了一个中间表 user_article

    字段有:

    id // 自增 id    
     
    user_id //用户 id       
    
    article_id // 已收藏文章 id   
    

    但是这样的话, 随着时间的推移,这个中间表 user_article 就会有 几百亿 甚至更多的记录


    另外一个方案,是借助 PostgreSQL 10 的 json 字段功能,重新设计中间表 user_article

    字段有 :

    id // 自增 id     
    
    user_id  //存用户 id    
    
    article_json // 该用户收藏的所有文章的 id 集合,用 json array 表示
    
    

    但是这样的话,article_json 里面的 array 长度,可能会有 10w 那么大,当然实际情况中,几乎没有用户会收藏所有文章

    想问问大家, 该如何设计呢, 对于实时性要求不高, 延迟个 1 秒都是可以接受的

    9 条回复    2021-03-10 21:32:10 +08:00
    leonme
        1
    leonme  
       2021-03-06 22:45:06 +08:00 via iPhone   ❤️ 1
    1. 现实中一个用户不会收藏那么多文章 2. 即使用户太多,表太大,可以分表(甚至分库),根据 uid hash 映射一下 3. 延迟这东西直接上缓存,影响不大
    piqizhu8
        2
    piqizhu8  
    OP
       2021-03-06 22:47:26 +08:00
    @leonme

    谢谢老哥

    老哥 你的意思是, 用第一个方案 对吗
    nl101531
        3
    nl101531  
       2021-03-07 08:33:36 +08:00 via iPhone   ❤️ 1
    第一个方案,标准标准解决方式
    Cyron
        4
    Cyron  
       2021-03-07 09:44:24 +08:00 via iPhone   ❤️ 1
    方案 1
    luckyrayyy
        5
    luckyrayyy  
       2021-03-07 10:48:35 +08:00   ❤️ 1
    方案一,上缓存。建议了解下微博的关注数据,比这个量级大多了
    mejee
        6
    mejee  
       2021-03-07 12:54:52 +08:00 via iPhone   ❤️ 1
    方案一,到变化一下。表名字叫关系表,有个字段是关系类型。这种一般后来还会有点赞等关系,可以复用
    lraining
        7
    lraining  
       2021-03-07 12:56:15 +08:00 via Android   ❤️ 1
    之前做的电商应用收藏功能也是采用方案一
    leonme
        8
    leonme  
       2021-03-07 14:10:27 +08:00 via iPhone   ❤️ 1
    @piqizhu8 对,第二种不符合数据库范式设计,扩展性也差
    ch2
        9
    ch2  
       2021-03-10 21:32:10 +08:00
    方案一是标准的办法,再大的量也能保存下来,大不了用 redis 缓存,轻松上亿条关系都能保存在里面
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1102 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:57 · PVG 02:57 · LAX 10:57 · JFK 13:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.