报表功能几乎是所有数据库应用系统最基本、最重要的需求。因为用户往往需要用直观、综合的方式来获取数据库的信息,而不仅仅是查看单个的数据;其次,报表还是企业决策者关心的内容,报表传递也是数据信息在不同管理层次之间流动的一种通用方式。在MIS开发中,报表的编制占据了应用系统开发者大量工作量,烦琐而又更改频繁。多年来,软件工作者一直在致力于通用报表生成工具的开发,用以减轻MIS的开发工作量,提高工作效率。目前市场上可能有多种不同的报表生成工具,但存在以下问题:
- 行业针对性强,难以满足各种MIS的特殊要求;
- 可移植性差,这是因为国外DBMS占领着中国市场,每种DBMS都有自己专用的报表工具,但该工具只能在本DBMS环境下工作,无法移植到其他DBMS之上,并且格式单一、功能简单,难以满足中国国情的需要;
- 不支持多媒体类型及空间数据类型的查询与报表;
- 无法支持分布式环境下多数据源的查询与报表;
- 不支持数据的分析、归类及知识的挖掘,浪费了数据资源;
- 操作烦琐,计算机专业性强,难以满足一般用户的要求;
- 安全性及可靠性差。
----考虑到用户现有的数据库系统种类繁多、规模各异,特别是在一个企业中,由于系统的不断更新,致使存在不同的数据库管理系统。所以需要一种新的报表工具,它能方便地挂接到任何数据库系统中,并具有对多个分布的、异构的、独立自治的数据源进行分析、加工和综合处理的能力。
报表工具的异构性
----作为异构报表工具必须具备以下功能:
----(1) 能够查询任何数据源的数据
----异构报表工具必须能够允许用户对任何数据源中的表进行查询。达到这种目标有两种方式,一是系统采用全局模式,用户根本不用考虑多数据源的存在,唯一知道表的分布位置的是数据库系统管理员,由系统管理员对表进行全局映射,在这种方式下,用户可以直接使用各数据源中的表,甚至是在同一个查询语句中。但是这种方式势必造成工具的效率比较低下和难度增大,因为系统要进行复杂的语法分析,数据处理,还要进行进程调度,以对多个数据源的读取进行同步。另一种简化的方法就是所有的查询都只能涉及到一个数据源。因为报表定义多是由系统管理员完成的,至少应该对数据库比较了解,所以牺牲这种透明性是比较现实的。
----(2) 能够在数据源之间进行连接
----异构报表工具除了要达到对异构数据库的数据读取、连接外,还必须提供一种机制进行数据源之间的连接。允许在一个查询语句中定义抽象的参数,这个参数代表另外一个查询结果的某一列,被引用的查询必须定义在引用查询的前面。通过这种参数的传递,达到数据源之间相互连接的目的。
----(3) 能保证异构数据的安全性
----异构报表工具要达到对异构数据库的数据读取的安全,防止数据的越权操作,能保证对每个数据源的操作都是在该用户规定的权限内完成。
设计与实现
----体系结构
----异构综合报表工具的体系结构可以用下图来表示:
----整个报表工具分为两个部分,一部分是框架管理工具,一部分是报表解释器,这两者的接口正是报表框架(库),如图所示。框架管理工具的任务是生成和维护报表框架,而报表解释器的任务是根据报表框架的定义生成一张具体的报表。报表框架是用来描述某一类报表的专有语言的脚本。这种语言主要是SQL语言和表达式语言的综合。报表框架可以看做是多个数据源中的多个表的逻辑视图,但是它的定义语言比视图定义语言要丰富得多。
----从图中还可以看出工具对异构数据源的集成结构。报表框架中可以定义若干个不同数据源的数据来源,报表框架的存储和历史数据的管理都是以主数据库为基础的。换句话说,工具可以分析和加工若干个数据源的数据,然后存储在主数据库中,从这个角度来看,报表框架充当了工具的数据字典或成员数据的功能。
----多数据源的管理与连接缓冲
----工具涉及到多个数据源的管理,对于每一个数据源的管理至少必须包含用户名和口令。用户在定义一个查询语句时,应该只需要指定一个数据源名称即可。工具应该有一种在本地用户环境下的策略,相应的远程数据源有一个用户环境,而不用在每一次查询语句执行时都动态连接。这个问题的核心是用户名的问题,有两种解决办法,一种是远程数据源的管理源在其系统中设置一个远程服务代理用户,并且指定主数据源的若干用户可以映射上去,即这些用户是可信任的,一旦他们在主数据库中登录,则当他们用主数据库的用户名向远程请求时,自动转换成对应的代理名,不用再给出密码信息。这种策略首先要求远程数据库的配合,牺牲了自治性,其次也不太安全。另一种策略是给每一个用户在每一个数据库中指定一个用户名(即代理名),用户名和数据源名确定时,一定可以找到一个唯一的远程用户名。在这种策略下,如果允许本地的若干用户对应某一远程数据库的同一代理,则密码管理就会出现冲突,如果不允许,则用户映射会付出很大的开销。让系统管理员统一进行安全管理可能是一个较好的策略。
----多个远程数据库查询的另一个问题是连接管理问题。工具不能在每次SQL查询时都动态连接,必须采用缓冲技术来提高效率。我们认为采用连接池的技术是较好的。在远程数据库第一次执行时,则进行连接,某一查询结束后,并不断开连接,而是将其插入到连接队列的尾部,在每次执行查询时,首先搜索该队列,如果没有找到数据源名称则认为是第一次执行该数据源的操作。在插入到该队列时,如果队列长度超过某一系统定义的长度,则将队列的首元素摘除,将对应的连接断开。这种淘汰算法可以保证系统资源和性能的折衷。
|