ESAP达摩院 思想有多远,我们就能走多远

ESAP第十弹 交叉表探秘


概述

交叉表是ES中的一种数据表结构,在制作大型报表,动态图表等方面有着非常重要的作用。但是交叉表的设计和维护较繁琐,能否用好交叉表很大程度上反映了设计者对ES系统的整体掌控力。

使用交叉表

  • 下图是一张排班表,左侧是姓名等基本信息,上方是日期,中部是排班数据。显然,若把这张表简单定义为向下扩展意味着每个日期值都成为字段名。为避免这种情况发生,我们应该把它定义为交叉表

  • 定义为交叉表后,日期值被存放于同一个字段内,在其他模板中能很方便的调用。

交叉表实例

  • 最简单的帐是流水账。例如,有一个GC俱乐部,每次开展活动后就记录一次收支。

  • 由于活动日期、类型、次数、人数等不确定,所以制作概况报表时,我们就可以使用交叉表来完成。上方行标签分别是日期、活动主题、类型,侧方是会员信息,中间是收支详情。

  • 报表的数据都来自活动记录,所以活动(会员)增多时,报表也能自动向右(向下)扩展。

交叉表的维护

  • 交叉表比较难以维护,因为有些维护技巧即使从官方也很难获取。

  • 交叉表一般用于生成报表或查询,尽量不要用于保存数据,因为保存一个m行n列的交叉表意味着ES数据库中要存放m*n条数据,例如100个员工30天的排班就会生成记录3000条!

  • 定义交叉表前需要对模块整体功能有一个清晰的把握,特别是行(列)标字段,一旦定义后,再要增加会比较麻烦(扩展时仍选交叉表,再选添加到本表。),且易引起数据排列混乱。

应用拓展

  • 因为行列标题都是变量,所以交叉表的提数公式很灵活,可以筛选表头。例如:前面实例中的报表,我们要单独提数填充“回到公元前”和“回到未来”两个项目的金额,就有很多方法。

–表间公式–

  • 有时候,我们不得不保存交叉表,我们会发现很多没填的空格子也会被记录在数据库中。

  • 事实上,有些空记录不是必须的,我们可以在数据库中设定一个简单的触发器进行自动清理。

  • 设定触发器后,每次保存表单时,数据库会自动清理掉多余的空记录而不影响表单数据。

小结

  1. 交叉表的优点是直观,灵活;缺点是这种直观灵活是以牺牲存储为代价的。

  2. 使用交叉表做报表(纯查询)可以避开交叉表的缺点。

  3. 使用筛选条件或条件取值公式可以在表间公式中灵活填充交叉表数据。

  4. 使用数据库触发器可以减轻数据库存储压力(提高访问效率)。

  5. 交叉表跟日期是天生的好搭档,在表格中出现日期序列(1~31),月序列(1~12),年序列(2010~2018)等等时,你就应该考虑采用交叉表了。


近似文章