作者 l 会点代码的大叔(CodeDaShu)

不知道开发的同学有没有遇到过类似这样的需求:

  • 相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口;

  • 业务复杂,一个需求需要关联几张表甚至几十张表才能得到想要的结果;

  • 系统做了分库分表,但是需要统计所有的数据。

那么此类需求要如何满足呢?我们选择了“通过 ETL 提前进行数据整合”的方案。

01

什么是 ETL

说到ETL,很多开发伙伴可能会有些陌生,更多的时候 ETL 是用在大数据、数据分析的相关岗位;我也是在近几年的工作过程中才接触到ETL的,现在的项目比较依赖 ETL,可以说是项目中重要的一部分。

ETL 是三个单词的缩写:

  • Extraction:抽取、提取;就是把数据从数据库里面取出来;

  • Transformation:转换;包括但不限于:数据筛选校验、数据关联、数据内容及结构的修改、运算、统计等等;

  • Loading:加载;将处理后的数据保存到目标数据库。

从这三个单词基本可以了解 ETL 的作用:将各个业务系统的数据,通过抽取、清洗、转换之后,将加工后的数据落地到数据库中(数据仓库);在这个过程中,ETL 可以将分散、零乱、标准不统一的数据整合到一起。

02

使用场景

我接触过的项目,使用ETL工具的场景有这个几种:

1. 报表、BI系统:

在公司建设的初期,业务比较少,系统也比较少,一台数据库就搞定了;随着公司业务的增加,业务系统被拆成很多系统;随着数据量的继续增加,单个系统的数据增加到一定程度的时候,也做了分库分表;

这时候领导、业务人员在用数据做分析的时候,数据来源可能是多个系统的多张表,这时候企图通过一个复杂的 SQL 跑出来结果就很困难了;通常公司会建立一个数据仓库,通过ETL工具把数据抽取到数据仓库中,再做数据的拟合和展示。

2. 跨系统的数据加工或查询:

我们现在所在公司,业务系统有几百个,由于业务流程比较复杂,前端系统在做业务操作的时候,在正式提交交易之前,有很多业务校验;

比如要查询客户在 X 系统的交易历史,在 Y 系统的交易历史,在 Z 系统的交易历史;那么就需要分别调用 X、Y、Z 系统的接口,这个对前端系统很不友好,那么通常的解决方案是什么?

  • A 方案:做一个中间服务,中间服务去调用 X、Y、Z 系统的接口,客户端直接调用这个中间服务;这种方案只是把前端要做的事情,转移到了中间服务;

  • B 方案:整合 X、Y、Z 三个系统,建服务中台;这种方法很好,但是极为难,对于很多公司来说,别说把 X、Y、Z 三个系统整合成一个中台系统,就是其中一个系统本身进行重构,都是非常困难的;

  • C 方案:把 X、Y、Z 三个系统中需要的数据,通过 ETL 抽取加工到一个数据仓库中,对外提供服务;这个系统最大的好处是在不改造 X、Y、Z 三个系统的前提下,又可以实现跨系统的查询。

我们在 C 方案的基础上又往前做了一步,就是将落地后的数据又做了一次加工,将需要跨表关联的数据,提前关联好存入 MongoDB 中,对外提供查询服务;这样可以将多表关联查询,变成了单表查询。

03

吐数据 VS 抽数据

接上文中第二个例子中的 C 方案,有些同学可能会有个疑问:数据抽取,需要抽取哪些数据呢?为什么不让这些系统把数据吐出来呢?

答案也简单,“有的时候,数据不一定能吐出来”。

MySQL 数据库往外吐数据有比较成熟的中间件,比如 Canal,它可以通过监听 Mysql 的 binlog 日志来获取数据,binlog 设置为 row 模式,能够获取到每一条新增、删除、修改的日志,同时还能获取到修改前后的数据;

其他商用数据库,比如 Oracle、DB2 等,我也查阅过相关的资料,也是有触发器机制,可以当数据发生变化的时候通知出来,比如调用一段程序,将数据发送到消息队列中,再由其他程序监听消息队列做后续处理。

不管什么类型的数据库,这种“吐数据”的方案,对于基础设施的要求都比较高,并且对原有系统有一定的侵入性;所以我们采用了对原有系统侵入性更小的方案:主动抽数据。

04

ETL 方案的优缺点

1. 优点

  • 侵入性较低,数据源系统只需要开通数据库的访问权限即可,为保证数据抽取对业务的影响,通常是访问源系统的备库,并且单独设置一个只读权限的数据库用户;

  • 支持不同类型数据源的数据抽取,比如源库有 Mysql、DB2、Oracle,通过 ETL 也可以轻松搞定;

  • 数据整合,将不同业务系统的相同数据整合在一起,比如有些系统 M/F 表示男女,有些系统 1/0 表示男女,ETL 在抽取加工后转换成统一的编码;

2. 缺点

  • 比较致命的一个缺点,就是数据抽取和加工有一定的延迟,需要根据业务场景进行评估,是否接受这个延迟;

  • 可能会受到源库表结构变化的影响;

  • 如果源库中的表没有时间戳,或者时间戳不准确,那么增量抽取就变得很困难;

  • 需要招聘 ETL 开发岗,从我目前的经验看,不是特别好招。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起相关推荐

  1. 关联数据库中多张表_关联数据

    关联数据库中多张表 在本系列的前两篇文章(" 使用RDF创建数据网 "和" 使用SPARQL查询RDF数据 ")中,您了解了资源描述框架(RDF)以及SPARQ ...

  2. 将一张表的主键作为外键关联到另一张表中

    将一张表的主键作为外键关联到另一张表中 1.外键的介绍 2.使用Navicat创建外键 3.外键的维护关系设定及其选择 1.外键的介绍 设置外键的作用很明显,就是讲两个表的数据产生关联,就比如个人信息 ...

  3. 查询数据插入别一张表中

    sql查询数据插入别一张表中 第一种方法: Btable 作为插入数据表,Atable是数据源表,Btable表在插入之前必须存在 insert into Btable select 列1,列2 fr ...

  4. JAVA两个表相关联_java实现两张表的关联查询(非数据库语言)

    已知我有两张表: 我现在查询时需要同时获取两张表对应的数据.比如我想要获取 stuid,honName,obreson三个对应字段.我在脑子里梳理了一下思路,以我目前的知识储备,只能在数据库写一下两个 ...

  5. mysql将查询结果写入另一张表_将一张表的查询结果插入到另一张表(转)

    将一张表的查询结果插入到另一张表 方法一: 代码 1 select into 和 insert into select 两种表复制语句 2 select * into destTbl from src ...

  6. mysql查询当天最新的一张表_mysql 查询当天、本周,本月,上一个月的数据

    本篇文章内容为网上收集内容 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE T ...

  7. 数据库两个表有一个字段互相关联,根据这个关联字段更新一张表

    表A: Id Name 1 xxx 2 yyy 表B: Id Name Age 1 aaa 10 3 bbb 18 update B set B.Name=A.Name from B Inner jo ...

  8. mysql两表左关联_mysql中一张表LEFT JOIN 左关联两张表语句

    先看实例 代码如下 复制代码 SELECT p.price, pd.name, m.manufacturers_name FROM (products p LEFT JOIN products_des ...

  9. mysql之多表联合查询并输入数据来自哪张表

    比如联合查询3个表,表名分别叫a,b,c select 'a' tbname,a.* from a union all select 'b' tbname,b.* from b union all s ...

最新文章

  1. 五:Angular 数据绑定 (Data Binding)
  2. android adb命令
  3. Linux内核源码树建立加载hello模块
  4. 云炬Android开发笔记 14 个人中心、图片裁剪、图片上传、收货地址、消息推送、权限管理等功能开发与一键式封装
  5. mysql服务器多线程模型_mysql-线程模型
  6. 如何让fragment刷新界面_快速实现android版抖音主界面的心得
  7. from rfc 2068 hypertext怎么解决_“倒数第二”英语怎么说?千万不要翻译成“last second”!...
  8. Servlet的学习之Request请求对象(3)
  9. MATLAB PDE工具箱电磁场仿真平行电容板及电偶极子详解
  10. 研究生数学建模经验分享
  11. 残差、方差、偏差、MSE均方误差、Bagging、Boosting、过拟合欠拟合和交叉验证
  12. QT使用AES加密解密
  13. 第二章-数据描述(初级统计)
  14. 各大AI 开放平台一览
  15. PARSEC benchmark 编译
  16. Pycharm2020.1安装中文语言插件教程,不需要汉化
  17. python练习 006 圆的周长与面积
  18. 论文阅读笔记:Unsupervised Feature Learning via Non-Parametric Instance Discrimination
  19. Shell脚本学习指南(七)——产生脚本
  20. shell分析nginx access log日志

热门文章

  1. POJ 2828-Buy Tickets(线段树上二分)
  2. 二分图专题系列各大知识点总结(匈牙利,染色法,最大独立集,最小点覆盖,最小路径覆盖)
  3. BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
  4. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
  5. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)
  6. python扫描器_7.python实现高效端口扫描器之nmap模块
  7. java写出文本文档乱码_对象流如何写出到文件以及为什么乱码
  8. 你真的懂switch吗?聊聊switch语句中的块级作用域
  9. 格灵深瞳CTO邓亚峰:AI学习的三种路线
  10. mybatis自动生成代码工具