新浪微博,腾讯微博mysql数据库主表猜想

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 用户信息表(t_user_info)字段名称字节数类型描述User_id4uint32用户编号(主键)User_name...

用户信息表(t_user_info)

字段名称

字节数

类型

描述

User_id

4

uint32

用户编号(主键)

User_name

20

Char[20]

名称

Msg_count

4

uint32

发布消息数量,可以作为t_msg_info水平切分新表的auto_increment

Fans_count

4

uint32

粉丝数量

Follow_count

4

Uint32

关注对象数量

备注:以User_id取模分表

 

用户之间关系表(t_user_relation),必须有关注与被关注的关系

字段名称

字节数

类型

描述

User_id

4

uint32

用户编号(联合主键)

Follow_id

4

uint32

被关注者编号(联合主键)

Type

1

Uint8

关系类型(0,粉丝;1,关注)

备注:关系是单向的,以User_id取模分表

 

用户消息索引表(t_uer_msg_index)

字段名称

字节数

类型

描述

User_id

4

uint32

用户编号(联合主键)

Author_id

4

uint32

消息发布者编号(可能是被关注者,也可能是自己)(联合主键)

Msg_id

4

uint32

消息编号(由消息发布者的msg_count自增)(联合主键)

Time_t

4

Uint32

发布时间(必须是消息元数据产生时间)

备注:此表就是当我们点击“我的首页”时拉取的消息列表,只是索引,Time_t对这些消息进行排序

 

消息与消息关系表(t_msg_msg_relation)

字段名称

字节数

类型

描述

Reference_id

4

uint32

引用消息用户编号(联合主键)

Reference _msg_id

4

uint32

引用消息编号(联合主键)

Referenced_id

4

uint32

消息发布者编号

Referenced _msg_id

4

uint32

被引用消息编号

Type

1

Uint8

操作类型(1,评论;2,转发)

Time_t

4

Uint32

发布时间

Page_index

4

Uint32

转发或者评论页码

备注:以Reference_id取模分表。

腾讯微博比新浪微博好的一点是一个消息的所有评论和转发都是被固定页码,这样在点击看评论的时候搜索效率更高,因为多了一个where Page_index的定位条件,当然带来的问题就是可能看到有些页的评论排版并不是满页,这就是因为标识为这个Page_index的评论有删除操作。

 

消息元数据表(t_msg_info)

字段名称

字节数

类型

描述

User_id

4

uint32

发消息用户编号(联合主键)

Msg_id

4

uint32

消息编号(联合主键)

Content

140

Char[140]

消息内容

Type

1

Uint8

消息类型(0,原创;1,评论;2,转发)

Commented_count

4

Uint32

评论过数量(只增不减,删除评论不影响此值,可以作为评论多页显示的页码)

Comment_count

4

Uint32

保留的评论数量

Transferred_count

4

Uint32

转发过数量(只增不减,删除转发不影响此值,可以作为转发多页显示的页码)

Transfer_count

4

Uint32

保留的转发数量

Time_t

4

Uint32

发布时间

 备注:消息元数据中,content像可能存在图片,这部分可以在分布式文件系统中存储。在2011年数据库大会上听杨海潮的演讲,对于nosql 也有涉及,本人能力有限,对这部分的职责还不清楚,希望高人指点。

 

非常推崇杨海潮ppt中的归档做法,因为微博是有时间轴线的,对于一定时间之前的记录可以分层次归档,这样在前端的最新的数据表的压力就会减轻很多。

 

业务逻辑:

1.A关注B

1)在t_user_relation_A中添加

A

B

1

2)在t_user_relation_B中添加

B

A

0

2.原创发消息

1)在t_msg_info_A中添加这条元消息,type为0

2)更新t_user_info_A中Msg_count

3)在t_uer_msg_index_A中插入A发的这条消息的索引(A的编号和消息编号)

4)在t_user_relation_A中找到所有关注A的人,比如B,C,D,E,F等等,并发在这些用户的t_uer_msg_index中插入A的这条信息索引,比如名人微博可以并发多个进程来实现对粉丝的消息同步

3.A转发B的消息msg_b

1)在t_msg_info_A中添加这条元消息msg_a,type为2

2)更新t_user_info_A中Msg_count

3)在t_uer_msg_index_A中插入A发的这条消息的索引(A的编号和消息编号)

4)在t_msg_info_B中更新msg_b的Transferred_count和Transfer_count

5)在t_msg_msg_relation中添加User_a,msg_a与User_b,msg_b的转发关系,page_index为Transferred_count%page_count

4.A评论B的消息msg_b

1)在t_msg_info_A中添加这条元消息msg_a,type为1

2)更新t_user_info_A中Msg_count

3)在t_uer_msg_index_A中插入A发的这条消息的索引(A的编号和消息编号)

4)在t_msg_info_B中更新msg_b的Commented_count和Comment_count

5)在t_msg_msg_relation中添加User_a,msg_a与User_b,msg_b的评论关系,page_index为Commented_count%page_count

5.A删除消息msg_a

1)删除t_msg_info中的元数据msg_a

2)删除t_uer_msg_index_A中的User_a,msg_a行记录

3)备注:如果A的msg_a被别人评论或者引用,那么在对方查看评论或者转发的时候会提示“原消息已被作者删除”

6.A删除转发消息msg_a

1)删除t_msg_info_A中的元数据msg_a

2)删除t_uer_msg_index_A中的User_a,msg_a行记录

3)在t_msg_msg_relation_A表中找到msg_a的源消息,即B的msg_b

4)删除t_msg_msg_relation_A中user_a,msg_a和user_b,msg_b的转发关系

5)更新t_msg_info_B中msg_b记录的Transfer_count,减1

7.A删除评论消息msg_a

1)删除t_msg_info_A中的元数据msg_a

2)删除t_uer_msg_index_A中的User_a,msg_a行记录

3)在t_msg_msg_relation_A表中找到msg_a的源消息,即B的msg_b

4)删除t_msg_msg_relation_A中user_a,msg_a和user_b,msg_b的评论关系

5)更新t_msg_info_B中msg_b记录的Commecnt_count,减1

8.A拉取全部消息

1)从t_uer_msg_index_A中拉取Author_id,Msg_id,Time_t索引,并以Time_t排序

2)通过页码和每页count控制返回结果数量,这样避免了server io 压力冲击

 

5月25日更新:

1)条件允许的话,所有的index表可以放到内存中,全部cache,而元数据直接ssd,这样读速度会提高很多,当然也要做好热备

2)t_user_relation表最好做合并存储

 

5月27日更新:

1)在第二步原创发消息要通知给粉丝,这时如果是明星,那么推送的数量可能数百万,新浪采取的做法是对这数百万粉丝进行区别对待,按照活跃度划分为几个层级,每个层级有一个推送时效限定,这样可以做到最想看到这个信息的人能够最及时的看到明星动态

2)用硬件来提升速度,将所有index表放在memory上,元数据放在ssd上,数据可以现在这两层上做处理,并定时持久化到mysql中

3)提供批量处理接口,比如拉取最新更新索引

4)在一定限度上容忍不一样,但要实现最终一致性

 

6月1日更新:

本文用的是push模式,关于微博的pull模式,请参见 http://blog.csdn.net/cleanfield/archive/2011/05/27/6450626.aspx

 

6月30日更新:

在新浪微博中,评论和转发都与原创消息是一样的独立记录,只不过多了一条消息关系记录,在展现的时候除了要展现自己添加的转发内容或评论内容之外,还需要将最原始的那条目标消息取出来。


12月8日更新:

消息与消息关系表(t_msg_msg_relation)的备注中,应该是以Referenced_id取模分裂

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
2月前
|
Windows
Windows无法连接到打印机,请检查打印机名并重试 - 配置Windows 共享打印机出错;
WIN7共享打印机无法被WIN11连接,出现错误代码0x0000011b或0x00000709,可能是系统版本不兼容所致。本文提供多个轻量级修复工具,无需安装,双击即用,专为解决此类小问题设计,操作简单,适合普通用户快速修复打印机连接异常。
493 0
|
JavaScript 前端开发
JavaScript实现手写签名,可触屏手写,支持移动端与PC端双端保存
JavaScript实现手写签名,可触屏手写,支持移动端与PC端双端保存
450 0
|
12月前
|
Ubuntu 开发工具 虚拟化
Jetson 学习笔记(十六):使用SDK Manager烧录Jetson Nano
这篇博客介绍了如何使用Nvidia SDK Manager烧录Jetson Nano。首先,需要在Ubuntu系统中安装VMware虚拟机和Nvidia SDK Manager。然后,通过连接Jetson Nano并进行一系列设置,包括FC_REC脚接GND,连接HDMI、鼠标键盘和电源线。在Ubuntu上通过lsusb确认设备连接后,使用SDK Manager进行烧录,选择Manual Setup-Jetson Nano,设置用户名和密码,然后点击flash完成安装。完成后,可以断开连接并启动Jetson Nano,进入Ubuntu安装界面。
1082 2
Jetson 学习笔记(十六):使用SDK Manager烧录Jetson Nano
|
算法 安全 Java
在Java中实现数据加密和解密
在Java中实现数据加密和解密
|
网络协议 网络虚拟化
配置通过VLANIF实现同VLAN不同网段通信示例
针对上述需求,如果在Switch的VLANIF接口上只配置一个IP地址,则只有一个网段的主机能够通过Switch访问Internet。为了使局域网内所有主机都能够通过Switch访问Internet,需要配置VLANIF接口的从IP地址。为了使两个网段中的主机能够互通,两个网段中的主机需要将此主从IP地址分别设置为网关。
264 0
|
存储 运维 Kubernetes
Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践下——原理篇
Kubernetes 本地持久化存储方案 OpenEBS LocalPV 落地实践下——原理篇
1154 0
|
移动开发 小程序 JavaScript
mPaas 问题之参数收不到如何解决
mPaaS小程序是阿里巴巴移动平台服务(mPaaS)推出的一种轻量级应用解决方案,旨在帮助开发者快速构建跨平台的小程序应用;本合集将聚焦mPaaS小程序的开发流程、技术架构和最佳实践,以及如何解决开发中遇到的问题,从而助力开发者高效打造和维护小程序应用。
112 0
|
Python
10分钟教你用python下载和拼接微信好友头像图片
10分钟教你用python下载和拼接微信好友头像图片
276 0
10分钟教你用python下载和拼接微信好友头像图片
|
Python
Python 技术篇-用os库实现本地文件重命名实例演示
Python 技术篇-用os库实现本地文件重命名实例演示
224 0
Python 技术篇-用os库实现本地文件重命名实例演示
|
Oracle 关系型数据库 Linux
10分钟!一键部署Oracle 11GR2单机
安装日志记录在/soft目录下:oracleAllSilent_*.log,在文末展示安装日志。
10分钟!一键部署Oracle 11GR2单机