基础表与汇总表

阅读(637) 标签: 基础表, 汇总表,

很多业务系统的数据量巨大,直接从基础业务表进行查询汇总会非常慢,因此数据库里往往存在一些已经造好的历史汇总表。

 

对于用户来说,当他进行查询时需要知道有哪些历史汇总表存在的难度比较大,尤其是当存在多级汇总表的时候,要能够恰当选择其中一个汇总表难度更大了。

 

因此如果某张表是历史汇总表,那么可以在这张表上定义基础表属性,定义其从哪一张基础表汇总而来。当用户的DQL基于基础表进行分组汇总时,DQL元数据层会智能寻找汇总表,看哪个汇总表和DQL的汇总级别最接近,然后智能地把DQL解析成从这个汇总表查出。汇总表和基础表是相对的概念,表A是表B的基础表,则表B是表A的汇总表;在定义了基础表属性后,这个历史汇总表会自动加入其基础表的汇总表中

举例来说,有一个基于日期的基础表,数据库中存在按月汇总、按年汇总的两张汇总表。当用户的查询DQL是聚合到季这一层时,系统会自动从月汇总表里查出;当聚合到年时,会自动从年汇总表里查出。

汇总表和基础表之间是多对多的关系。

举例:

现有支付单,支付月汇总两张表。支付月汇总表数据是从“支付单”表汇总而来,那么可以定义如下:

上图中的字段名是“支付月汇总”表的字段名,广义外键或表达式是指基于基础表的计算表达式,可以把上述定义理解为这样的DQL

-  SELECT

-   支付单.SUM(支付金额) 支付总额

-   ON 年月

-  FROM

-  支付单

-  BY 支付日期#年月

此时,如果需要基于支付单,进行年汇总,即下面的DQL

-  SELECT

-    支付单.SUM(支付金额) 支付总额

-    ON

-  FROM

-    支付单

-  BY 支付日期#

DQL元数据层会自动从已有的支付月汇总的数据中进一步汇总,即执行以下SQLSELECT INT(T1_1_1.年月/100) ,SUM(T1_1_1.支付总额) 支付总额 FROM 支付供应商月汇总 T1_1_1 GROUP BY INT(T1_1_1.年月/100),通过对基础表的设定,可以充分利用事先汇总完成的数据,以提高效率。

 

知识点:

1) 定义基础表功能,可以简化业务视图,降低用户对业务系统的学习难度,用户只需要记住基础表即可,不需要记忆汇总表。

2) 在定义基础表功能时,其中的字段名,必须包括主表的所有关键字段,如上图中的年月为支付月汇总主键,必须定义广义外键或表达式。计算字段可以全写,或只写一个。

3) 在上述定义中,我们定义年月的广义外键或表达式为支付日期#年月,如果层函数或者假表中出现错误或异常,也会导致系统不能自动找到汇总表。

4) 当基础表中有多个汇总表可用时,会通过对表中记录数的设置选择记录数少的使用,记录数相同或都为空时取第一个符合条件的汇总表。