新浪&腾讯微博:MySQL数据库主表设计猜想
来源:互联网 发布:高性能网络编程 二 编辑:程序博客网 时间:2024/06/06 03:37
用户信息表(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
4
uint32
引用消息编号(联合主键)
Referenced_id
4
uint32
消息发布者编号
Referenced
4
uint32
被引用消息编号
Type
1
Uint8
操作类型(1,评论;2,转发)
Time_t
4
Uint32
发布时间
Page_index
4
Uint32
转发或者评论页码
备注:以Reference_id取模分表。
腾讯微博比新浪微博好的一点是一个消息的所有评论和转发都是被固定页码,这样在点击看评论的时候搜索效率更高,因为多了一个wherePage_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 压力冲击
t_user_relation表最好做合并存储
在第二步原创发消息要通知给粉丝,这时如果是明星,那么推送的数量可能数百万,新浪采取的做法是对这数百万粉丝进行区别对待,按照活跃度划分为几个层级,每个层级有一个推送时效限定,这样可以做到最想看到这个信息的人能够最及时的看到明星动态
用硬件来提升速度,将所有index表放在memory上,元数据放在ssd上,数据可以现在这两层上做处理,并定时持久化到mysql中
提供批量处理接口,比如拉取最新更新索引
在一定限度上容忍不一样,但要实现最终一致性
- 新浪&腾讯微博:MySQL数据库主表设计猜想
- 新浪&腾讯微博:MySQL数据库主表设计猜想
- 新浪&腾讯微博:MySQL数据库主表设计猜想
- 新浪微博,腾讯微博mysql数据库主表猜想
- 新浪微博,腾讯微博mysql数据库主表猜想-pull
- 新浪微博,腾讯微博mysql数据库主表猜想
- 新浪微博,腾讯微博mysql数据库主表猜想
- 新浪微博,腾讯微博mysql数据库主表猜想
- 新浪微博,腾讯微博mysql数据库主表猜想
- 新浪微博,腾讯微博mysql数据库主表猜想
- 新浪和腾讯微博教程(二)
- 腾讯微博为何拼不过新浪?
- 腾讯微博为何干不过新浪?
- 新浪腾讯微博转发 js代码
- 分享帖子到腾讯、新浪微博
- 新浪微博,腾讯微博,腾讯QQ登录
- 腾讯空间、新浪微博、腾讯微博登录接口
- 腾讯空间、新浪微博、腾讯微博分享接口
- Linked List Cycle II
- lua程序设计 28.2 Metatables userdata程序范例
- InfoPath的未来
- Visual C# 字体对话框 & 颜色对话框
- Linked List Cycle
- 新浪&腾讯微博:MySQL数据库主表设计猜想
- spring学习笔记(6)--自动装配autowire
- 逆波兰表达式运算
- socket 非阻塞模式下的connect封装实现
- CSDN编程挑战之彩色石子(使用暴力破解法)
- Java排序算法优化--插入排序【温故而知新】
- 线程安全之Collections.synchronizedList
- android开发笔记之也谈android开发入门
- Myeclipse10下java.lang.OutOfMemoryError: Java heap space的解决办法