|
新一代报表工具–报表设计的革命
二、多源分片 先看一个并不复杂的例子:
实际的业务数据,是分别保存在汽车、房产、土地和其他四个表中的。(在业务数据本身的处理过程中,很可能基于汽车、房产等都还有大量的信息,字段各不相同,因此不可能将这些数据都放在一个表中) 在传统工具中,实现这个报表的办法,就是先写复杂的SQL语句,形成一个视图: select 客户表.客户编码,sum(汽车.抵押金额), sum(房产.抵押金额), sum(土地.抵押金额),sum(其他.低价金额 ) from 汽车,房产,土地,其他 group by汽车.客户编码,房产客户编码.土地.客户编码,其他.客户编码 where (客户表.客户编码 in (select 汽车.客户编码 from 汽车) or客户表.客户编码 in (select f房产.客户编码 from 房产) or客户表.客户编码 in (select 土地.客户编码 from 土地) or客户表.客户编码 in (select 其他.客户编码 from 其他)) and汽车.客户编码=客户表.客户编码 and 房屋.客户编码=客户表.客户编码 and 土地.客户编码=客户表.客户编码 and 其他.客户编码=客户表.客户编码。 这就是一种单源、不分片的方法,对于这样一个简单的例子,用单源、不分片的传统方法尚可以实现,但是会有很多变化、很多需求(下文会提到),实现起来就更困难甚至不可能了。但就是这张表,做这个复杂的SQL,也是要花点功夫的。更不用说运行时的效率了。 而在支持多源分片的新一代报表工具-润乾报表中,只需要直接使用几个类似于“select sum(汽车.抵押金额) from 汽车 group by 汽车.客户编码”这样的简单SQL作为数据库,就可以轻松实现:
也就是,在报表中直接使用四个数据源,将报表分成了四片,由于新一代报表工具支持各片之间的动态关联,所以使复杂的问题大大简化了。 以这个例子为基础,我们可以对多源分片有了一个初步的认识。下面深入讨论一下: 多源是指一个报表的数据来源来自多个物理数据表(或类似数据体,如视图或其他虚拟表)。这里的“多个”甚至不只是两个三个,而可能是七八个乃至十几个。很多传统报表工具在设计时都可以从多个表中取数据,但实际上还是将这些表通过关联等方式形成了一个单一的数据源,即一个视图。这并不是我们所说的多源,因为在你取字段时,总是来自于这一个视图,即在报表设计前将多源转化成单源处理。而某些传统工具所说的多源,则实际上指的就是多数据库支持,只是把数据库桥功能集成进入报表工具中,但真正到报表设计时仍然是单源的。象上述的多表、多库都不是真正能简化报表设计的多源,只有在进行报表设计时,多个数据源可以独立使用,才是我们所说的多源。 分片是指报表的纵向或横向(或双向)同时被分成了多个区域,每个区域重复规则不同,而又可能相互运算。许多传统报表工具都提供子报表。子报表可以说是某一种分片的方法,但是子报表与主报表并非一个整体,不能互相运算。而我们所说的分片,是各片处于一个统一的报表当中,可以互相运算。 多源与分片是紧密相关的,往往分片后不同片需要使用不同的数据源。 在出现多源分片这一新技术前,传统工具对于这种表中不同部分的数据来自不同数据源的分片问题的解决方案是: - 对于报表的水平方向上的几片,可以做成一个统一的视图,或者写存储过程、或者写程序准备数据。 - 对于纵向上格式与内容的变化,可以用子报表。(因为格式不一样,光用UNION准备数据是不行) 然而,问题在哪里呢? 做统一的视图(单源),会产生两大问题: 1. SQL的复杂程度:横向分片,需要JOIN;如果纵向也有分片,则需要JOIN+UNION。那么,如果数据来自于五六个数据源呢?这个SQL怎么写,既需要水平,也需要时间。 2.运行效率:就算你写出了SQL,能够做出来这张表,但实际运行时的效率会怎么样呢。如果是三张表做JOIN,复杂度就是O(Nk)。 当然,还可以写存储过程(带来移植方面的问题)、写代码,通过分步计算来避免复杂的SQL,通过预先准备数据来解决运行效率问题……,但是,相应会带来对开发效率的巨大影响。 子报表,应该说也能解决一部分问题(主要是纵向的。横向上子报表基本没有用),因为从理论上毕竟子报表可以使用与母报表独立的数据源。但是,子报表也存在着若干问题: 1.各个子表各自为政,主表或某个子表的格式进行了调整,所有其它子表都需要改动,这是极其繁琐的工作。 2.在数据上,主子表之间和子表相互之间都无法沟通数据,只能将主表的数据作为参数传递给子表,子表无法带回信息,也无法向其它子表提供信息。这时,整表的混合运算将非常困难,必须单独计算,无法采用某些子表的中间运算结果,不仅书写复杂,运算效率也降低。 这是一个标准的主子报表(主从报表),其中下面的产品明细行部分是用子报表实现的:
但是要注意,在主表中出现了金额这一项。这个数据实际是来自于子报表中的数据合计。但是,由于子报表无法将数据传递给主报表,所以解决起来就只能用另外的方式在主报表中把这个数计算出来。如果有多个这种数据项(比如数量的合计之类的),实现起来就更复杂了。这还只是一个标准的主子报表的情况,实际会有更多更复杂的格式与数据关联的情况,是拿子报表很难实现的。 对于传统工具的这些困难,采用多源与分片的技术,则可以迎刃而解。做起来非常复杂的表,可以应用多源分片技术轻松完成。 不仅对于那些用传统工具非常复杂,但是还是“能做”的表,可以应用多源分片大大提高开发与运行效率,并且对于许多传统工具“不能做”的表,更是可以通过新的模型来轻松解决。 下面我们就看一个来自于实际业务中的真实报表:
这个表是个典型的纵向分片报表,数据区从上至下分成了几片,先是一片按客户汇总的两级分组区域,然后是两个固定计算行,接下来又是一片按年度汇总的一级分组区域,最后又是一个固定的合计行。各片分组层数不同,而且变动与固定固定结合,而且各片之间还有数据沟通(某些计算行的值是由其它行计算出来的)。这种上下格式都不一致的报表,其数据源是不可能组织成单源的(各片列数不同),也就不可能被传统工具实现 而采用新一代报表工具的多源分组模型,实现起来则是很轻松的:
|
|