1.党建拆库
这一篇说到指挥平台上基本都是统计,我们通过etl工具将数据统计到中间表,再归档到mongo中,因为业务很多,所以统计中间表也很多,并且指挥平台上查询统计数字可以切换年份,为此我们的归档数据也按年份划分
每天定时任务默认跑当前年份的
考虑到这个情况,我们后来把中间统计表按年份分库,etl生成的时候进入对应年库
分库逻辑大概是这样:
生成时指定年月
根据年月分库,表名格式如下
插入数据库(由我们架构同事实现)
2.说完了统计如何实现,再说说查看详情的问题,我们查看详情,如果是地市,有三级页面,分别是地市-地市下的县区市-县区市下的街道/乡镇,,最后是列表。
一开始我们各业务各做各的,后面也是发现,跟统计一样,一二级详情基本也差不多,于是我们设计了一二级通用查询
首先定义一个配置文件,定义各业务的统计信息
查询时查询这个通用配置文件,根据指定的表名、入参统一查询
如果组件id在通用配置中,就走通用的查询
如果组件id不在通用配置中,就走自定义查询逻辑,实现查询接口
CustomDetailStatisticsCenter集中了所有自定义查询的实现
查询接口
listData中最后通过union all的方式联合查询多张中间统计表获得数据。因为我们中间统计表结构基本一致,所以可以这样做。
由于我们做了分库,所以查询时也要查询 对应 统计库,我们通过一个DB注解完成
设置mybatis拦截器
根据统一的表名前缀看是否需要分库
如果需要分库,调用下面的方法
方法中找到表名"_年月"的后缀,去到对应按年划分的统计库。
示例:select * from schema.gen_tablename_2021_01,变成 select * from schema_2021.schema.gen_tablename_2021_01
要求:查询默认从不分库的库开始,就要保证不分库的库有访问分库的权限。
思考和讨论:
1.为什么统计要分库
正如上面所说,因为指挥平台上统计有很多,一个业务又有多种统计,一种统计又可能是不同的数字,需要多个中间统计表才能完成
所以一年的表就有几千的量
这在数据库设计层面上来说不太好 ,一般一个库不要超过4096张表
如果不分库,2年的表就过万了,势必给查询造成影响,也不利于DBA的管理,采用分库虽然程序上要做特别处理,但保证了年表的准备入库,为良好的开发奠定了基础。所以遇到这种表很多而且跟年份挂钩的时候,可以考虑按年分库。
2.什么情况可以用mybatis plus拦截器?
这个可以查询mybatis plus官方文档看如何使用,一般在自定义一些场景下可能需要使用,比如自定义分页,分库,拦截语句做处理之类的。
3.既有通用实现,又要保留自定义实现,为了统筹,在一个文件中要把两种配置全部拿到。
4.面向接口编程,如何获取所有的接口实现类,或者说为什么需要获取所有的接口实现类?
获取所有的接口实现类可以通过get bean的方式获取,前提是这些实现必须是bean
getBeansOfType是ListableBeanFactory的方法,ListableBeanFactory是BeanFactory的默认实现。
获取所有接口的实现在第3点中说到因为要统筹通用实现和自定义实现
希望在后面的工作中也保持思考,加油。