自定义查询统计的实现思路与技术难点[备忘]
时间:2010-07-23 来源:emsdog
在上家公司做了一个自定义查询统计的东东,说实话,该项目做的算比较成功,但由于时间紧且缺少较好的设计理念(做该项目的时候采用的是数据库驱动设计),造成项目改造成产品的代价太高,基本上需要重新来过,所以在公司时没有产品化。这里简单描述一下该查询统计项目的产生背景、设计思路与技术难点。
自定义查询统计往往是针对没有计算机基础的用户,但常见的灵活查询往往需要用户有一定的计算机基础(比如,理解and or的区别,动态勾稽表间关联关系等),或者就是统计报表生产过程太过繁琐,这样不仅增加了软件公司的培训成本,也增加了软件的推广难度。
我们需要的是一种简单易用,但不失灵活的查询统计系统,对用户屏蔽使用的复杂性,同时“查询”、“统计”都可以自定义并保存(用户以“所见即所得”方式定义查询或统计),统计结果可以生成基于时间的“快照”。
设计思路:
1、屏蔽复杂性-----采用单数据集(物理表或视图),单表查询相对于连接查询在大数据量时更有优势。
2、常见group by分组统计 + case when方式实现自定义统计口径
3、统计指标务必支持多种分组函数
4、枚举应当支持自定义,以满足用户自定义枚举查询的需求
5,快照实现:统计的关键数据以xml方式保存,需要查看时生成数据视图即可。
6,用户可同时选择多个统计口径、多个统计指标,口径之间的关系可以并列、可以嵌套
并列、嵌套的区别将在技术难点中讲述。
以下是详细的类图
技术难点: 以表(视图)my_student_view来说明统计实现过程吧,表内容如下: 表的创建语句如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[my_student_view]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) |
select sex,address,degree,count(id) from my_student_view where 1=1 group by sex,address,degree ----枚举在查询条件的展现中出现的机会较多,在统计处较少出现
|
好了,到此统计数据已经有了,但是如何产生前台的统计视图呢?明显我们需要一个视图工厂来完成这个工作,视图工厂的主要任务就是根据统计数据生成指定样式的(查询)统计视图。这里需要注意,工厂根据数据产生视图的过程必须让数据与视图实现解耦,否则一旦视图变化,工厂实现就必须变化了。
使用前初始化:(软件开发人员完成或者用户管理员完成)
初始化数据集---初始化字段---初始化口径---初始化枚举---发布。
够简单吧!
用户使用过程:
选择数据集--选择横向口径---选择纵向口径---选择统计指标--(可选)选择统计条件
OK,统计报表自动生成了!
如果对系统初始化的口径(枚举)不满意,用户还能自定义口径(枚举),完成更符合用户需求的查询或统计。
更高的目标:
将此功能设计成无侵入性组件,任意集成到第三方工程中。