一、为什么会有冗余表
创建表的时候,为了方便查询,通常在分表的时候会对一些字段做冗余,即同一个字段会存在于多个表中,这样在查询的时候避免同时关联2个或两个以上的表。
比如有一种情况淘宝上的交易,买家需要看到自己的订单情况,商家需要查看到商品的销售情况,规范情况的设计
Order(order_id,good_detail)
Table(buyer_id, seller_id, oid)
如果用buyer_id来分库,seller_id的查询就需要扫描多库。
如果用seller_id来分库,buyer_id的查询就需要扫描多库。
这时候的设计可以改成这样
Order(order_id,good_detail)
Buyer(buyer_id, seller_id, oid)
Seller(seller_id, buyer_id, oid)
同一个数据,冗余两份,一份以buyer_id来分库,满足买家的查询需求;
一份以seller_id来分库,满足商家家的查询需求。
二、冗余表的实现方案
【方法一:服务同步写】
顾名思义,由服务层同步写冗余数据,如上图流程:
(1)业务方调用服务,新增数据
(2)服务先插入T1数据
(3)服务再插入T2数据
(4)服务返回业务方新增数据成功
优点:
(1)实现简单,服务层由单次写,变两次写
(2)数据一致性相对较高(因为双写成功才返回)
缺点:
(1)请求的处理时间增加(要插入多次,消耗时间)
(2)数据仍可能不一致,例如第二步写入T1完成后服务出现异常,则数据不会写入T2
如果系统对处理时间比较敏感,引出常用的第二种方案
【方法二:服务异步写】
数据的双写并不再由服务来完成,服务层异步发出一个消息,通过消息总线发送给一个专门的数据复制服务来写入冗余数据,如上图流程:
(1)业务方调用服务,新增数据
(2)服务先插入T1数据
(3)服务向消息总线发送一个异步消息(发出即可,不用等返回,通常很快就能完成)
(4)服务返回业务方新增数据成功
(5)消息总线将消息投递给数据同步中心
(6)数据同步中心插入T2数据
优点:
(1)请求处理时间短(只插入1次)
缺点: