文章目录
平常项目开发过程中,难免会使用级联查询的方式实现一些功能,分库分表之后亦是如此。但是当操作两个表的过程中,我们发现本身十条数据却出现了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类型,意思就是你正常项目开发过程中,不一定只有一个绑定表,肯定会存在多个,我们这里也仅仅是举了一个例子而已。
五、结果
六、总结
分库分表必须从一开始就应该设计好大部分的场景使用,不然后期维护确实不容易