V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
reid2017
V2EX  ›  程序员

微博关系链模型设计

  •  
  •   reid2017 · 2018-04-24 16:01:33 +08:00 · 5870 次点击
    这是一个创建于 2397 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教,微博的关系链模型应该如何设计:

    在我看来,微博里有两种关系链,一个是互为好友,一个是单方向的关注粉丝。

    在设计数据库时,应该把这两种关系分开设计成不同的数据表,or 可以放在同一个表里添加一个字段来标识两种不同的关系链呢?

    15 条回复    2018-04-25 11:06:51 +08:00
    reid2017
        1
    reid2017  
    OP
       2018-04-24 16:09:01 +08:00
    有没有熟悉社交产品关系链的大佬来回复下
    jadec0der
        2
    jadec0der  
       2018-04-24 16:11:13 +08:00
    如果你是想仿个 App 原型,在表里把双向的好友关系当成两条单向 follow 存就好了。

    你要是想知道新浪微博是怎么实现的…那估计就复杂了,这有 14 年的分享 http://www.infoq.com/cn/articles/weibo-relation-service-with-redis/
    reid2017
        3
    reid2017  
    OP
       2018-04-24 16:28:41 +08:00
    @jadec0der 这样设计的话,如果我要查询好友列表,那需要查询并判断是否存在两条互相 follow 的记录,这样实现起来感觉很麻烦。
    lookas2001
        4
    lookas2001  
       2018-04-24 16:31:34 +08:00 via Android
    follows
    id follower_user_id followee_user_id
    select * from follows where follower_user_id=xxx
    select * from follows where followee_user_id=xxx
    岂不美哉
    jadec0der
        5
    jadec0der  
       2018-04-24 16:38:30 +08:00
    @reid2017 如果你说的是新浪微博的话,他们好像没有显示互相关注的好友列表功能。如果是基于好友关系的 SNS,自然有另外的设计。
    sevenQu
        6
    sevenQu  
       2018-04-24 16:46:34 +08:00
    所有用户在一张表,多一张表两列的表储存用户相互关注的信息,分别是关注着外键和被关注者外键
    flask web 开发这本书就是这样做的,不知道大型应用会怎么样做,这是小型的
    vincenttone
        7
    vincenttone  
       2018-04-24 16:48:26 +08:00
    感觉一个表就可以了
    1. 如果用两个表存的话互粉和取消互粉必然涉及删除数据和数据转移操作两个表
    2. 如果是互粉表需要分表,互粉表里也自然需要保存两条记录,和好友表重复
    reid2017
        8
    reid2017  
    OP
       2018-04-24 16:49:07 +08:00
    @jadec0der 对,可能更类似是基于好友关系的 SNS,有双向的好友关系,和单向的关注关系,应该怎样设计比较好点?
    TimePPT
        9
    TimePPT  
       2018-04-24 16:52:15 +08:00
    @jadec0der 其实是有的,当你没做任何人工设置时,微博 web 端,点击进入关注列表页,左侧选「好友圈」,右侧列表就是你全部互相关注的人。
    当然,好友圈允许用户将互相关注的某些人移除出去。这样发博时选「好友圈」时,即使互相关注,那些被移除好友圈的微博互相关注用户也看不到你发的这条好友圈微博。
    banksiae
        10
    banksiae  
       2018-04-24 19:51:24 +08:00
    @jadec0der 看了下你推荐的链接,哦,跟我想的一样,redis 双向关系就可以了; 但是 redis 从 storage 降为 cache,确实是经过考验之后的做法,虽然我依然停留在 storage 这一步,但是前边我们也加了 memcache
    noNOno
        11
    noNOno  
       2018-04-24 19:53:52 +08:00
    建议使用图数据库,neo4j 了解一下?
    lvsemi1
        12
    lvsemi1  
       2018-04-24 22:31:07 +08:00 via Android
    这种需求已经值得单独弄数据结构了,楼上说的图数据库了解一下
    reid2017
        13
    reid2017  
    OP
       2018-04-24 22:37:53 +08:00
    @noNOno
    @lvsemi1
    高端,还没接触过图数据库。。
    acepcs
        14
    acepcs  
       2018-04-25 08:59:41 +08:00
    社交网络中的数据,天生适合图状的数据结构啊。。
    同楼上,neo4j 了解一下,有自己的特殊语法,不过看半个下午就差不多了。
    zhangsen1992
        15
    zhangsen1992  
       2018-04-25 11:06:51 +08:00
    @acepcs 图数据库适合 但是微博这种场景太大了 性能不行吧,定制开发估计也难突破瓶颈。infoq 那个说的 redis 还是可以的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2860 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:37 · PVG 10:37 · LAX 18:37 · JFK 21:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.