一、为什么会有冗余表 创建表的时候,为了方便查询,通常在分表的时候会对一些字段做冗余,即同一个字段会存在于多个表中,这样在查询的时候避免同时关联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次) 缺点: