ShardingSphere-JDBC<绑定表>避免JOIN 笛卡尔积


平常项目开发过程中,难免会使用级联查询的方式实现一些功能,分库分表之后亦是如此。但是当操作两个表的过程中,我们发现本身十条数据却出现了20条,也就是笛卡尔积现象。那么如何避免这种情况呢?
第一篇我们整理了一些核心概念其中绑定表则就可以避免这种情况。

一、何为笛卡尔积?

简单的说就是两个集合相乘的结果。在数据库层面,当出现笛卡尔现象,其实并非是程序所要的结果。所以在开发的过程中,要看清需求是什么,避免不必要的结果返回。

二、demo场景实现

我们有两张表,一个course,一个user,user表有status,course表也有status,根据status相同将course的value值赋值给user的status字段然后将结果查询出来,进而判定成绩是否合格。
提示:course和user实体此次不展现

1)关键代码如下:

/**
 * @Auther: huoyajing
 * @Date: 2021/12/4 05:55
 * @Description:courseMapper,采用mybatis-plus直接封装好了CRUD
 */
@Repository
public interface CourseMapper extends BaseMapper<Course> {

}
@Repository
public interface UserMapper extends BaseMapper<User> {

	/**
	 * 查询用户status
	 * @return
	 */
	@Select("select u.id,u.name,u.type,c.value as status from user u left join course c on u.status=c.status")
	List<User> queryUserStatus();
}
@Test
	public void addCourse1() {
		//课程插入
		Course course1=new Course();
		course1.setName("huohuo0");
		course1.setType(0L);
		course1.setStatus(0);
		course1.setValue("不及格");
		courseMapper.insert(course1);

		Course course2=new Course();
		course2.setName("huohuo1");
		course2.setType(1L);
		course2.setStatus(1);
		course2.setValue("及格");
		courseMapper.insert(course2);

		//学生信息插入
		for (int i=0;i<10;i++){
			User user=new User();
			user.setName("user No:"+i);
			user.setStatus(""+i%2);
			user.setType(i);
			userMapper.insert(user);
		}

	}

2)查询结果

本身测试结果就十个用户,计划出现的结果也是十条才对。但是却出现了20条,笛卡尔积现象出现了
在这里插入图片描述

3)笛卡尔积出现分析

在这里插入图片描述
通过分析发现了查询结果是A1B1,A1B2,A2B1,A2B2。但是这并不满足我们想要的结果,该如何解决呢?

三、何为绑定表?

分片规则一致的主表和子表

四、绑定表配置

spring.shardingsphere.sharding.binding-tables[0]=user,course

1)绑定表解决了什么?

将table-strategy.inline.algorithm-expression的value计算的相同的值绑定在一起查询,就比如咱们的course,user两个status相等查询,若user表的status=0在user_1,那么course 的status=0也就只会在course_1.那么其他的交集查询就无意义了。

2)为何是binding-tables[0]?

在这里插入图片描述
我们发现binding-tables是Collection类型,意思就是你正常项目开发过程中,不一定只有一个绑定表,肯定会存在多个,我们这里也仅仅是举了一个例子而已。

五、结果

在这里插入图片描述
在这里插入图片描述

六、总结

分库分表必须从一开始就应该设计好大部分的场景使用,不然后期维护确实不容易

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值