1.背景

1.1.关系链业务

社交系统(微信、QQ,支付宝)需要解决的一个工程问题是如何完成海量用户关系存储,并高效查询。典型代表系统是微信好友、QQ好友、蚂蚁森林游戏中的好友关系、微博粉丝、知乎粉丝偶像列表等等。这类业务其实就是关系链业务,而关系链分弱好友关系和强好友关系。

弱好友关系不需要彼此的同意,比如用户A关注用户B这类关注和粉丝的关系。而强好友关系需要经过彼此同意,比如用户A请求添加B为好友,用户B同意后,则AB就互为好友。

1.2.举例

举个例子:假设需要你设计蚂蚁森林这个系统,系统假设有1亿用户,每个用户平均有100个好友,如果是你需要如何设计数据库表结构呢?

如果进行了数据库表容量评估你会发现:如果只用一张表来存储将会产生100亿条记录,这个规模已经算超大表了。使用超大表一般会产生2个问题:这个数据规模即使建立索引,查询性能也很受单台资源的影响,

互联网系统需求总是在不断变动新增字段锁表时间会特别长。基于性能考虑,单库单表很难满足需求。

基于以上分析,面对海量用户关系,一般需要分库分表,那么问题来了,怎么进行分区呢(即分区策略是什么)?

2.基本设计

2.1.弱好友关系

弱好友关系一般需要两张表:attention(关注表)、fans(粉丝表)

CREATE TABLE `attention` (

`id` int NOT NULL AUTO_INCREMENT,

`uid` int NOT NULL,

`attention_uid` int NOT NULL,

PRIMARY KEY (`id`),

KEY `idx_uid` (`uid`)

) ENGINE=InnoDB;

CREATE TABLE `fans` (

`id` int NOT NULL AUTO_INCREMENT,

`uid` int NOT NULL,

`fans_uid` int NOT NULL,

PRIMARY KEY (`id`),

KEY `idx_uid` (`uid`)

) ENGINE=InnoDB;

关注表我们称为正表,粉丝表称为反表。

2.2.强好友关系

方案1:强好友关系即frient表

CREATE TABLE `friend` (

`id` int NOT NULL AUTO_INCREMENT,

`uid` int NOT NULL,

`friend_uid` int NOT NULL,

PRIMARY KEY (`id`),

KEY `idx_uid` (`uid`),

KEY `idx_friend_uid` (`friend_uid`)

) ENGINE=InnoDB;

uid = 1的用户加uid=2好友成功,那么插入的记录是{1,2}还是{2,1}呢,其实都可以,但为了需要约定一个规则,比如uid < friend_id。

此时,如果查询uid = 2的好友,则为:

select * from friend where uid = 2

UNION

select * from friend where friend_uid = 2;

方案2:强好友关系肯定属于弱好友关系(但弱好友关系推到不出是强好友关系),怎么理解呢?如果1,2两个用户互相是好友,那么1,2两用户互为关注同时互为粉丝。这样方案会导致持久化1,2好友的记录数是4条。产生了冗余。初步看好像没怎么好处,但在数据量很大需要做分库分表时,冗余的价值就产生了,具体体现在:Friend表在数据量大时很难做分库分表,比如如果根据uid来分库,那么通过friend_uid查询就需要一次全量遍历所有库。

attention和fans表实现分区就没那么困难,即都通过uid分库。

3.分库分表基本原则

从好友基本设计中我们了解到在进行水平分库分表时需要把握两个基本原则:避免扫库扫表:

避免跨库事务;

基于此,我们的对应策略是:分析业务查询场景,做数据冗余:按用户做分区,同一用户在一个DB,如果可能涉及跨库查询,可以通过冗余字段来满足大部分常见,比如保留好友用户_id时同时保留好友名称。

使用搜索引擎:避免扫库扫表的查询压力。

跨库事务:跨库的数据一致性属于分布式数据一致性范畴,有很多方案可以保证数据一致性,我们后面分析。

4.跨库事务

方案1:异步消息

采用数据冗余方案可通过异步消息来写入冗余数据,为此需要多引入一个消息组件(比如消息队列)和一个数据复制服务(用于接收消息并同步冗余数据)。

采用异步消息存在短暂的不一致窗口。

方案2:异步复制

比如通过数据库操作日志(比如MySQL的BInlog)完成异步操作。数据服务接收并解析Binlog完成数据同步。

跨库事务就到这,关于数据一致性的解决方案有机会我们单独分析分析。

The end.

转载请注明来源,否则严禁转载。

社交网络关系 mysql架构_社交网络海量用户关系(关系链)设计思考相关推荐

  1. 3w并发mysql架构_(DBA之路【一】)mysql 基本架构

    MySQL是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如Unix/Linux.Windows.Mac和Solaris.各种系统在底层实现方面各有不同,但是MySQL基本上能保证在各个平台上 ...

  2. 腾讯云mysql架构_一个数据库存储架构的独白

    本文由云+社区发表 本文作者:许中清,腾讯云自研数据库CynosDB的分布式存储CynosStore负责人.从事数据库内核开发.数据库产品架构和规划.曾就职于华为,2015年加入腾讯,参与过TBase ...

  3. 多租户mysql架构_团队开发框架实战—多租户架构

    1 对多租户的理解 多租户定义:多租户技术或称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在多用户环境下(此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据 ...

  4. 阿里 mysql 架构_阿里java架构教你怎么用mysql怒怼面试官

    说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化的试题,这里主要说的索引和B+Tree结构,很少提到我们的集群配置优化方案. 1.索引是什么 ...

  5. hmailserver创建MySQL失败_[hmailserver]新建用户与Email错误

     [hmailserver]新建用户与Email错误 在点晴系统中 设置--用户帐号管理--添加系统用户--填写信息--点击增加后报错: hMailServer COM library 错误 '800 ...

  6. mysql表一对多关系,mysql表与表之间的关系(多对多,一对多)

    #创建数据库 CREATE DATABASE day15; #使用 USE day15; #创建表 CREATE TABLE test1( id INT PRIMARY KEY AUTO_INCREM ...

  7. 人物关系 人脸识别_内在美人物关系介绍图谱 - 电视剧 - 星关系

    <内在美>主要人物关系介绍 顶级巨星.通过上百张面孔诠释多样演技的"百面美人",同时也是一个麻烦制造者,绯闻制造机,走到哪儿都有闪光灯聚焦.然而就是这样一位巨星,却有着 ...

  8. mysql账目表_mysql 关于用户账目明细设计的问题

    本期余额=上次余额+收入-支出 怎么能让明细的表现变成这种的 时间 ----------- 交易类型 ---- 收入/支出 ---- 可用余额 2018-03-13 ---- 购买 --------- ...

  9. 规划系统_智慧水务规划系统思维的设计思考

    近年来,智慧水务信息化项目建设如火如荼,大家对智慧水务的理解各有见解. 有人认为智慧水务只是一个概念,比较抽象,难以落地.有人认为目前较多智慧化项目其实是信息化系统的延伸概念,并没有真正意义上的达到智 ...

  10. 《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入...

    <社交红利--如何从微信微博QQ空间等社交网络带走海量用户.流量与收入>--徐志斌 著 <社交红利>这本书2013年9月才上市,卖的非常火. 我最初是在公司内部的期刊上,看到有 ...

最新文章

  1. questions for the exploitation of technologies
  2. 八种状态增加测试用例状态的精确度
  3. Apache Commons ArrayUtils.toString(Object)与JDK Arrays.toString(Object)
  4. 云栖社区云栖号(团队博客)攻略【2018版】
  5. 专访微软Greg Yang,构建神经网络的底层语言,探索AI的“万物理论”
  6. python编程类型_Python 基础编程 数据类型(一)
  7. 单关闭功能_广告弹窗关闭
  8. java.exe闪退_Tomcat7.0 exe闪退问题
  9. Android 学习笔记 databinding简单使用:使用databinding在listview加入不同类型的view
  10. linux shell指令 amp,shell入门基础amp;常见命令及用法
  11. sqli-labs(19)
  12. 雷军若愿“赌”服输给董明珠10亿元 他的身家还会剩下多少?
  13. UI交互设计:红绿立体图片的制作
  14. python从入门到住院_python从入门到入土教程(1)——入门课
  15. 安装Vmware Tools时,显示安装程序无法自动安装VMCI,需要手动安装
  16. 元宇宙广告 模式与机遇
  17. 上拉与下拉加载判断是否联网
  18. 局域网监控的分类及模式介绍
  19. ubuntu下找不到mkinitrd命令的问题
  20. 前端小作业~土豆网伪元素案例

热门文章

  1. PAT1150 Travelling Salesman Problem
  2. 二次型相似对角化的原因
  3. 【转载】23种设计模式及案例整理分享(建议收藏)【ps:方便自己收藏】
  4. 猎聘、BOSS、智联、前程无忧这几个招聘网站我都用过
  5. PHP获取服务器图片并添加水印
  6. [经典之作]vml经典之作
  7. hone hone clock创意前端时钟
  8. jcp jsr_Oracle提交了第三次JCP改革JSR,以提高透明度
  9. qemu启动openEuler Embedded镜像
  10. 第二人生的源码分析(六十四)类LLCurlEasyRequest实现Http请求