时间维与数据快照版本的宽表设计
在计划表里主要按区域,项目、计划组团、考核节点名称, 节点类型,铺排了全年的 考核计划完成时间,考核完成时间 。

现有以下三个统计指标:
1、年度计划考核节点数: 每月统计按当年(全年12个月) 当前态各区域考核节点计划完数,
2、月度计划考核节点数:每月统计至当月的计划完成数数,
3、月度计划考核节点数累计: 每月统计当年按月累计数。
同时因为计划表是会每个月根据项目节点实际情况,调整考核计划的完成情况。所以有要求:已过去的月份保留当时月度最后一天统计的快照态,不能更新为最状态。
在这种情况下我们应该如何设计我们统计的宽表呢?
第一印像看这个三个需求统计原子指标都是考核节点数,可以通过考核计划完成时间是否落在期间内统计。除了时间维度有差异外其它统计维度是一样的。时间维度有年度,年-月, 年度月累计。
在前端展现不支持不支持OLAP计算的前提条件下,能不能把这三个统计需求合并一个宽表实现呢?
我们先虑第二个指标:月度计划完成数。 这个时间维是与我们日常生活经验相同的,只是年月。稍加整理即可以得到 以下这样一个表。

我们来验证一下,按年、月这个层级来上卷统计 这个月度计划完数,如下表所示,可以看到,年度与月度可以通过简单地上卷进行计算出来。

接着来看第一个指标:年度计划考核节点完成数,相对于第一个指没有月度层级。

根据事实表的合并原则: 所有维度均相同的多个事实表就可以同并为一个事实表。
从这个角度来看:两个表直接就可以合并为一个,并且指标也可以合并为一个:月度指标按时间维年度统计就可以了,如下表所示:

如上年,年度指标就是按月的汇总数。
但是我们还有一个要求: 已过去的月度数据是是统计月度的最后天快照态。假设当月度是12月,考虑版本记录,那么我们的两个事实表均要带上数据版本号。


年度计划完成数不是月度计划完成数的汇总计算。 那么我们考虑作为两个不同的指标进行合并,可以得到下表:

我们来测试看看,使用不同的时间维进行汇总是否能得出正确的效果:
按年统计,年度计划完成数,结果正确:

我们再年月统计时是以下效果, 只有时间维-月 为NULL 的记录才是正确的,然后年度数也是正确的。 虽然这结果是正确的,但是这个维度的组合却是要求我们在使用这个宽表时在统计不同指标时需要按特定的维度是筛选,这大大增加了宽表的使用难度,这就违背了宽表设计的初衷: 简化前端的使用。 对于一于不知背景情况的人来看说,看到下表的结果太令人困惑了。:

再来看第三个指标: 月度计划考核节点数累计:假设前时间是2020-12-24 那么可以得到下的表:

测试按,年、月的时间维来查看数据,明显的月度累计计划完成数是错误的,因为是每次均是年度拆分为12个月度区间数据,实际上是没有月度这个层级的维度。

测试按年、统计期间进行求各,结果也是错误的:

实际只有按年度加上期间,进行汇总计算才是正确的汇总值 ,同时这指标不是一个累加性指标,而是一个半累计性指标【不可以按时间简单汇总,而是取后一期的值】, 但是我们的宽表里并不能按时间进行半累加计算,所以只能把一年12个月的区间记录都保存一份,同时快照也要求宽表里保存多份版本记录。最终我们按以下加上年度统计期或按照快照的版本统计的记录集才对,所以说这个宽表只有 统计期间维及快照版本维。


终上所述,这三个指标看似是时间层级的不同统计,实际上不但时间层级不同,而且有数据版本的要求, 不应合并一个宽表实现。

浙公网安备 33010602011771号