(三)集算器带来什么

结构化数据计算,目前绝大多数情况是由关系数据库(或数据仓库)完成的,其它技术都不是很方便,比如用Java写个简单的求和都需要很多行代码,更不要说分组、过滤这些运算了;那些NoSQL数据库在获取可横扩能力的同时,实际上严重牺牲了数据计算能力,比关系数据库差得很远。

但是,数据库的计算能力是封闭的!也就是说,我们不能用SQL去计算数据库以外的数据,必须把数据先搬进数据库内才可以利用SQL实施计算。

数据库的封闭性有它的道理,因为它有完整的数据模式和相应的约束性检查,如果不封闭就会把数据搞乱了。


然而,计算是无处不在的。并不是所有计算都适合数据库来实施,现代应用中有许多数据库外的计算需求。

很多年前这个问题并不严重,那个时候的许多应用系统,从交易到分析都是一个中央数据库全部搞定。而现在则有很大不同,出现了许多数据库外的数据,比如从互联网爬下来的网页信息、下级机构上载上来的Excel文件、机器产生的文本日志、云服务提供的XML或json数据、…;这些数据都需要一起参与计算。另外,即使是在数据库中的数据,也可能因为所属的应用系统不同而存储于不同的数据库中,而且经常是不同厂商的异构数据库,需要混合计算时,就会涉及到跨库的问题。虽然许多数据库提供了跨库能力,但性能和方便度都很差,等同于没有。

这两种情况下,数据库的计算能力都无法直接使用了。一般的做法是把库外或其它库的数据先导入到一个大数据库中,这样一方面需要部署更多或更大容量的数据库,需要更大的成本和资源;另一方面,导入数据一般不可能每时每刻都做,这会影响下一步计算的实时性。而且,导入数据本身也是一种计算(过程中常常涉及转换数据结构、编码调整等任务),而这个计算也无法利用数据库的计算能力,只能在外部硬编码。

我们经常会把一些经过一定计算汇总后的中间数据保存在数据库以便实现高性能呈现(报表),为什么要把这些并不原始关键的数据保存在数据库中占用昂贵的空间呢?其实仅仅是为了获得在呈现环节中还需要的计算能力,数据库的模式和约束功能在这里并没有任何意义。这不仅消耗计算资源,而且会导致数据库中数据过于众多混乱,影响后期的维护。


集算器带来不依赖于数据库的计算能力,它提供了开放的计算能力!

作为计算引擎,集算器并不关心数据放在什么类型的数据源中,它都取来可以计算,而且是实时计算;多个数据库也仅仅是多个数据源而已,跨库混合计算是很自然的事情;即使仍然要把外部数据导入到数据库,这个实质上的计算过程也可以由集算器来实施;而中间数据则完全不需要占用数据库空间和计算资源,直接存放在文件系统中由集算器提供更方便高效的计算,管理上也更为简单。

换句话说,集算器可以让数据库专心致志去做它最擅长以及最应当做的事情(比如存储、一致性、模式及约束),而不要仅仅为了获得计算能力就去部署和扩容更多的数据库,这些计算能力可以由更便宜、更轻量级而且性能也更好的集算器来提供。

上帝的归上帝,凯撒的归凯撒。