废话
ShardingJDBC分表后,分表规则不同的表之间是不可以关联查询的。其实,我们在平时的业务开发当中,大部分情况下,不需要分表的都是数据量相对较少的表,或者说是一些基础配置表,这些表我们在需要与大表关联的时候,基本可以使用代码加缓存替代(当然也有其他例外,不同分表规则的大表之间有着关联)。
正文
背景
在项目中的同一个数据库中存在这样的表,product_order_0商品表,product_order_item_0商品明细表,product_order_1商品表, product_order_item_1商品明细表,其中product_order_0中记录的明细都放在product_order_item_0中,product_order_1中记录的明细都放在product_order_item_1中。这样在做商品表left join商品明细表的关联查询的时候不需要全部遍历,避免发出无效的 sql,这种关系就是绑定表。
绑定表其作用是在关联查询的时候。
准备工作:
在数据库中建立好product_order_0商品表,product_order_1商品表,product_order_item_0商品明细表,product_order_item_1商品明细表
1、在application.properties中新增配置
绑定表的配置会将分片规则结果相同的表绑定在一起。
比如:product_order表的分片规则是id % 2 , product_order_item表的分片规则是product_order_id % 2 ,因此product_order_0会对应上product_order_item_0, product_order_1会对应上product_order_item_1
#配置【默认分库策略】,根据user_id进行分库,因为之前的分库策略都具体到了某张表上
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2 }
#指定product_order表的真实节点
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds$->{0..1}.product_order_$->{0..1}
# 指定product_order表的分片策略,分片策略包括【分片键和分片算法】
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{id % 2}
#指定product_order_item逻辑表的真实节点
spring.shardingsphere.sharding.tables.product_order_item.actual-data-nodes=ds$->{0..1}.product_order_item_$->{0..1}
# 指定product_order_item表的分表策略,分片策略包括【分片键和分片算法】
spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.sharding-column=product_order_id
spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.algorithm-expression=product_order_item_$->{product_order_id % 2}
#配置绑定表,可以配置多个,会将分片规则一致的表绑定在一起
spring.shardingsphere.sharding.binding‐tables[0] = product_order,product_order_item
关联查询的sql语句
public interface ProductOrderMapper extends BaseMapper<ProductOrderDO> {
@Select("select * from product_order o left join product_order_item i on o.id=i.product_order_id")
List<Object> listProductOrderDetail();
}