多个异构数据库如何关联查询

 

DBlink 只适合同种数据库关联,难以关联异构库。其他方式不是改变部署架构,就是增加开发工作量,实施起来困难很多。

开发难度小的方式貌似是 ETL,把异构库变成同构库,就可以用熟悉的方式写关联 SQL。但这种方式需要改变原来的部署架构,硬加一个 ETL 层和一个数据集市层,一般还得加个管理员去维护定时调度,或者额外写代码判断“数据是否 ETL 完毕”。更大的问题是,这种方式需要把实时计算变成延迟计算,甲方爸爸知道了恐怕会拍桌子。

彻底的解决方案貌似是微服务,把高耦合的 ODBC/JDBC 接口变成低耦合的 http 接口,这样就可以用统一的 json 或 xml 去传输数据。但这种方式要针对每张表开发数据服务接口,要针对每种算法开发客户端接口,还要用陌生的框架和类库,要解决数据库外的权限安全……工作量顶天了。而且,具体的运算还得硬写。

较现实的方法还可以用高级语言比如 JAVA,先用 SQL 把异构数据取过来,再用 arraylist 转成 2 个类,接下来就可以进行 list 之间的 join 了。但这件事等于拿 JAVA 手工替代 SQL,简单的合并还凑合,关联查询就难写了,况且还有子查询、关联后分组汇总等实用算法。总之,JAVA 缺乏结构化类库,替代 SQL 的成本非常高。

如果使用集算器来实现异构库关联,则可以保持原部署架构,开发工作量也不大。首先,SPL 可用统一的数据结构访问任意的数据库表,这就解决异构的问题。其次,SPL 具有丰富的结构化类库,很容易实现关联查询以及后续的实用算法,经常比 SQL 还简单。最后,集算器提供了 JDBC\ODBC 接口,程序员只需引入驱动程序,就可以在原来的代码上实现异构库关联。

比如 java 通过集算器的 JDBC 驱动,访问 Oracle 的 orders 表,并关联 MySQL 的 customer 表,最后对关联结果分组汇总:

con=DriverManager.getConnection(“jdbc:esproc:local://”);

ResultSet rs = con.executeQuery(“orcl.query(/“select * from orders/”).join(cust,my.query(/“select * from customer/”):custid,city).groups(city;sum(amount))”);

关于多数据库关联,可参 分库后的统计查询

关于集算器 JDBC 嵌入 JAVA,可参 Java 如何调用 SPL 脚本

关于集算器安装使用、获得免费授权和相关技术资料,可以参 如何使用集算器?