当前位置: 首页 > 科技观察

学习sharding纵库分表之前的几篇文章

时间:2023-03-16 20:54:55 科技观察

,阿芬已经说过SpringBoot集成Sharding-JDBC实现横库分表,这也是我们日常业务中使用频率最高的,到横向划分数据,如按日期划分数据库,按校验用户ID横向划分数据库。今天阿芬就来说说如何使用Sharding-JDBC来垂直划分表和数据库。什么是垂直分片,什么是垂直分片?垂直分片是指按照业务对表进行分类,分布到不同的数据库中。每个库都可以放在不同的服务器上。它的核心概念是Dedicateddatabase,也就是说我们需要把不同的业务分到数据库中。比如我们可以为支付业务创建一个数据库,对于订单业务我们可以使用另外一个数据库保存数据。并没有想象中那么难。让我们看看如何去做。垂直分表垂直分表是对一个表进行细分,在同一个库中,可以正常操作。相对而言,根本不需要使用sharding-sphere。一部分数据存储在一个表中,数据存储在另一个表中,也就是说两个表存储的是不同的数据,比如商品服务。我们把商品的基本信息放在一张桌子上,商品的详细信息放在同一张桌子上,相当于一张竖着的桌子,但是看起来总是那么奇怪,奇怪就是奇怪,他还是这个样子。垂直子库不是这种情况。让我们看看如何去做。在垂直分库的第一步,我们仍然需要创建一个数据库,然后创建我们指定的表DROPTABLEIFEXISTSusers;CREATETABLEusers(idBIGINT(20)PRIMARYKEY,usernameVARCHAR(20),phoneVARCHAR(11),STATUSVARCHAR(11));第二步接下来我们和之前一样,开始配置我们的配置数据。spring:application:name:sharding-jdbc-simplehttp:encoding:enabled:truecharset:UTF-8force:truemain:allow-bean-definition-overriding:true#确定数据源shardingsphere:datasource:names:db1,db2,db3db1:type:com.alibaba.druid.pool.DruidDataSource驱动类名:com.mysql.jdbc.Driverurl:jdbc:mysql://localhost:3306/order?characterEncoding=UTF-8&useSSL=false用户名:root密码:123456db2:类型:com.alibaba.druid.pool.DruidDataSource驱动程序类名称:com.mysql.jdbc.Driverurl:jdbc:mysql://localhost:3306/ordersharding?characterEncoding=UTF-8&useSSL=falseusername:rootpassword:123456#配置用户的数据源db3:type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.jdbc.Driverurl:jdbc:mysql://localhost:3306/user?characterEncoding=UTF-8&useSSL=false使用rname:rootpassword:123456##shardingstrategy,以user_id为shardingkey,分片策略为user_id%2+1,user_id为偶数操作db1数据源,否则操作db2sharding:tables:#Configurethedb3用户的数据节点:actual-data-nodes:db$->{3}.userstable-strategy:inline:sharding-column:idalgorithm-expression:usersorderinfo:actual-data-nodes:db$->{1..2}.orderinfokey-generator:column:order_idtype:SNOWFLAKEdatabase-strategy:inline:sharding-column:user_id算法表达式:db$->{user_id%2+1}props:sql:show:trueserver:servlet:context-path:/sharding-jdbcmybatis:configuration:map-underscore-to-camel-case:true=接下来就是写一组insert语句,然后我们把数据插入到数据库中进行测试。@RunWith(SpringRunner.class)@SpringBootTest(classes=RunBoot.class)publicclassUsersDaoTest{@AutowiredUsersDaousersDao;@TestpublicvoidtestInsert(){for(inti=0;i<10;i++){Longid=i+100L;usersDao.insertUser(id,"Dao"+i,"17458236963","1");}}}/***添加新用户**/@Insert("insertintousers(id,username,phone,status)values(#{id},#{username},#{phone},#{status})")intinsertUser(@Param("id")Longid,@Param("username")Stringusername,@Param("phone")Stringphone,@Param("status")Stringstatus);看着截图,阿芬觉得没什么不妥,还是去数据库验证一下吧。也确认数据保存在里面,这就是数据库的垂直划分。我们什么时候垂直划分数据库?答案是根据业务逻辑来拆分。例如,我们可以将用户表和用户相关的表分配给用户数据库,将产品表和产品相关的数据分配给产品数据库。阿凡觉得这种垂直分库分表其实是通过不同的数据源来操作的,也可以通过为mybatis的mapper配置不同的数据源来实现,不过还是要看个人选择。使用Sharding-JDBC分库分表,你学会了吗?