在报表开发项目中,报表的源数据可以放置在数据库中,也可以放在文件里。比如,一个互联网公司的网站运营报表系统,公司注册用户的基本信息来自于网站系统,使用的是Oracle数据库;用户操作数据来自于网站系统的日志文件,是文本文件。一般的做法是将用户操作数据从文本文件中导入到Oracle中,再用SQL语句去提取和计算数据。
那么,将报表的数据全部放到数据库中是否是最佳做法?可不可以把报表的数据全部或者部分放到文件系统中呢?这两种做法各有什么优缺点呢?
这里我们比较一下,报表工具结合Java程序访问数据文件(简称:文件报表),和报表工具直接访问关系数据库(简称:数据库报表)在几个方面的不同支持。其中,Java程序用来进行报表的源数据计算。
一、数据读取速度
报表应用是一个读数据、进行计算、页面展现的过程。从数据读取角度,文件是直接从操作系统来读,速度取决于硬盘的io速度。数据库则需要通过jdbc来读取,因为需要做数据流的对象转换,当前业界主流数据库的jdbc都比较慢。这是一个始终没有解决的问题。
这方面,文件报表可以得5分,数据库报表得3分。
二、数据计算性能
从计算角度来看,简单sql语句执行的速度较快,复杂sql不容易优化。如果是存储过程中用for循环来fetch计算的话有可能要比java慢。
这方面,两者都得3分。
三、数据一致性
关系型数据库有元数据(描述数据结构的数据字典),还有事务管理,数据随机写入的一致性可以保证的很好,当然这样做也牺牲了一部分性能。但是,在报表应用当中,数据的读操作较多,写操作一般也是顺序写入,所以对数据一致性要求并不高。
这方面,文件报表得3分,数据库报表得5分。
四、易管理
文件可以按照业务种类、模块关系、时间顺序进行多级目录管理,可管理性较高。而数据库是扁平结构,不能以多级目录的形式来管理数据,只适合管理数量较少的表。数据库中很容易形成大量意义混淆的表名,可管理性较差。
这方面,文件报表得5分,数据库报表得3分。
五、易开发
简单sql比较容易写,但是复杂Sql和存储过程与java都很难写。Sql的问题在于:不支持分步计算、集合化不彻底、缺乏有序集合、不支持对象引用。这就造成复杂sql和存储过程不符合自然思维习惯,编程比较困难。Java则不提供关系运算的基本类库,类似group这样的运算都要程序员自己编写,编程更不容易。
这方面,文件报表只能得1分,数据库报表可以得3分。
六、低成本
数据放在文件中的综合成本要远远低于数据库。这方面,报表文件得5分,数据库得1分。
七、扩展性
在数据存储上,数据文件更容易扩展。特别是有了hdfs之后,文件系统非常容易横向扩展。数据库集群横向扩展的技术较为复杂,配置、维护困难,成本也高。
这方面,文件报表得5分,数据库报表得2分。
八、安全性
数据库具有私有的数据存储方式,即使有了操作系统权限,外部系统也只能通过数据库提供的安全通道来存取数据。数据文件则暴露在操作系统用户下,必须要严格管理操作系统用户权限才能保证安全。
这方面,文件报表得3分,数据库报表得5分。
总体来看,文件报表和数据库报表的各方面比较如下图:
从上面的图可见,对于报表应用,总体上说,使用文件来组织数据比数据库略有优势。文件报表之所以也有些短板,并不是文件系统本身的问题,而是开发语言Java的问题。其中最明显的短板是Java针对报表数据源计算的开发困难,计算能力较差。
如果采用润乾公司开发的新产品集算报表,配合文件存储数据的方案,与其它报表工具加数据库存储的方案相比较,优势就非常明显了。
集算报表内置了数据计算引擎集算器(esProc),可以非常方便的访问文件数据。下面我们比较一下集算报表+文件存储方案(简称集算报表方案)与其他报表工具+数据库报表(简称其他报表方案)的各方面情况。
数据读取速度
集算报表调用集算器读取数据文件,经过计算之后,通过集算器Jdbc接口提供给集算报表,因为集算器也是基于Java的,所以集算器的Jdbc不需要再做数据流的对象转换,要比传统数据库快很多。
这方面集算器报表方案可以得5分。
数据计算性能
集算报表和集算器都是基于Java开发的,集算器单进程运行的时候没有传统数据库计算速度快。如果使用集算报表调用集算器的单机多线程机制或者多机并行机制来实现分布式计算的话,速度要超过传统数据库。详细的测试数据参见集算器有关的测试报告。
这方面集算报表方案可以得5分。
数据一致性
集算报表对文件的访问可以全部通过集算器来实现,通过集算器的代码将数据文件封装起来,可以在一定程度上保证数据的一致性。因为报表的计算都是读取和分析数据,所以集算器并不提供事务管理功能,好处是在读取和顺序写入数据的场合更有性能优势,缺点是数据一致性比数据库稍差。
这方面集算报表方案可以得3分。
易管理
在集算报表的文件数据源中,数据文件是天然支持多级目录的,所以复制、转移、拆分都比数据库简单高效得多,这就允许用户按照业务模块、时间顺序等规则分类管理数据,应用程序下线时,也可以按照目录删除该应用对应的数据。数据管理因此变得简单清晰,工作量显著降低。
这方面集算报表方案可以得5分。
易开发
集算报表内置的集算器是结构化半结构化数据计算的专业开发语言,具有:分步计算、完全的集合运算、有序集合运算和对象引用机制,更接近自然思维,编程更简单,代码量更少。集算器提供丰富的内置对象和库函数,可以实现复杂的业务逻辑,与sql相比,能降低从业务逻辑到程序代码的转换门槛。
这方面集算报表方案可以得5分。
低成本
集算报表售价比数据库要低很多。同时,集算报表对软硬件环境的要求也比数据库低很多,一般的报表项目都不必购买专用的数据存储设备和相应的授权就能使用,它支持Windows/Linux/Unix,既支持中高端服务器也支持廉价PC。因此集算报表综合成本远远低于数据库。
这方面集算报表方案可以得3分。
扩展性
在数据存储上,数据文件更容易扩展。
在计算方面,集算报表可以通过集算器的高级版本实现强大的分布计算管理功能:分布式计算引擎、可控任务分配、节点选择与容错、节点内数据共享、节点间数据交换,可以根据任务特点平衡容错与性能。
这方面,集算器报表方案得5分。
安全性
集算报表可以调用集算器的高级版本,提供独立的服务器,如果将集算服务器和集算报表安装在不同的物理服务器上,集算服务器对外只开放特定端口号,那么数据安全性可以得到有效的保障。
集算器要自行编程实现登录和权限管理,相对数据库有一定工作量,但是也更灵活。
这方面集算报表方案可以得4分。
集算报表方案和其他报表方案之间各项比较如下图:
从上图可见,在报表项目当中,集算报表+文件的方案的优势比较明显,在相当多的场合可以替代其他报表工具+数据库的传统方案,特别是以历史数据为主要来源的报表项目,数据量大需要更强的扩展性和计算性能,但对数据一致性和安全性要求要低得多。
事实上,集算报表并非只能支持文件数据源,它对数据库数据源仍然有相当好的支持,这样我们也可以考虑将数据库和文件系统结合起来为集算报表提供数据源,从而达到最佳的效果。其中,数据库存放变动较大的最新数据,文件系统存放变动较小的历史数据。如下图:
最新的数据量不大,但是变动比较频繁,对数据一致性要求比较高,放在数据库中既可以保证数据一致性,又不会对数据库负载增加过大的压力。历史数据量较大,变动较少,可以充分发挥文件系统的优势。这种解决方案,可以获得文件数据源和数据库数据源的双重好处,在上述的各方面都能达到5分。