假设有一亿个用户,每个用户至少关注 100 个人,如何设计数据库(关系型数据库)满足下面几个需求 1,查找 a 关注了哪些人 2,查找 a 被哪些人关注了 3,查找 a 和 b 共同关注了哪些人
使用 redis, followers 一个 set, followings 一个 set, 可以搜一下微博 CTO 的一个 PPT 有讲。
如果完全使用关系型数据库来解决这个问题,好像很费劲。
#2 楼 @michael_roshen 如果只能这样的话 把 following_id 单独拎出来存,相当于做了一层缓存,但是如果没有关注上限应该也很难 . 避免从至少 1 亿*100 的数据中查. 还要分表分库什么的. 等大神...
我觉得在缺少具体情况的方案下没有什么设计的余地 hooopo 那个绝对满足条件 每个用户至少关注 100 个人 那可能这一亿个用户都关注 100 个大 V 具体优化还是要看具体遇到的问题吧
关系数据库设计出来并没有问题,但关系数据库查询所依赖的索引估计和关系表的大小一样,基本上如果过将索引全部装入内存的话,和 redis 相比没有一点优势。
我觉得这个需要做一点冗余 对于每个用户 id 记录关注这个用户的用户 已经用户关注的其他用户分成两个表信息 这样分表的时候不用做 join 直接按 id 取到相应的表就可以获取值了
Instagram 的关注数据结构很简单,不过处理关注的内容推拉的时候确实需要分大小 V 处理。第三个问题,好像没有直接枚举出某些用户共同关注的人的场景,通常是先有了一批人或者一个人,看另外其他的用户都关注了这里面的哪些人,业务场景有很大的区别,导致程序逻辑也不一样。实际使用应该针对不同用户层次的缓存机制 (比如针对频繁登录的用户),纯关系数据库实现感觉压力有点大啊,最起码的使用数据库内建的分区机制是必要的。
呵呵~~偶尔看见这个帖子,可不可以使用 nosql 的思想的方式来存呢?比如说 key:A->B value:(B's name) 就表示 A 关注 B
#25 楼 @bobby_chen 有一亿个用户,每个用户至少关注 100 个人,那就得上百亿得数据了,nosql 上百亿的数据查询估计也不行吧,而且题目要求是关系性数据库,so..
#26 楼 @michael_roshen 如果只是存两个用户之间的关系的话,数据量并没有那么大。而且正因为是关系型数据库,所以更不可能所横向的扩展多少列来存某一个用户关注的用户群