文章
· 六月 9, 2022 阅读大约需 3 分钟

InterSystems 最佳实践系列之 - 在DeepSee中设计有效的层级

当使用DeepSee工具来设计层级的时候,一个子级必须有且仅有一个父级。当出现一个子级对应两个父级的情况时,数据结果就有可能会不可靠。另一种情况是当两个相似的级别存在,它们的主键必须要做相应的变更以确保唯一性。我们接下来将通过两个案例来解释这两种情况是如何发生的以及如何避免。


案例1

在多个州里都会有一个城市叫做Boston。在我的样本数据里,我已经记录的与Boston对应的州有MA和Boston.NY。我的维度定义如下:

 

城市和州在这里都是简单的字符串格式。当构建到我的Cube中时,我会需要两个州级别成员:“MA”和“NY”,以及两个城市级别成员:“Boston”和“Boston”。为什么我需要两个Boston的城市级别成员而不是一个呢?因为一个级别成员不能有两个父级。所以我们需要创建两个分别的子级成员来对应各自的父级。遗憾的是,我们现在处于“糟糕的层级”场景,因为我们只有一个键值来对应两个不同的级别成员。

为了解决这个问题,我们需要使这个键值唯一。为了替代直接使用“城市”这个属性来作为这个级别的来源属性,我们可以使用来源表达式来将这个级别成员转化成唯一的。

 

这样就解决了唯一性的问题,但是会产程其他我们不想要的副作用。通过添加这样的表达式,我们可以在透视表中看到下面的结果:

 

这样的结果有可能是或者不是我们能够接受的显示方式。到这里,我们的键值和级别成员名称都是一样的,当然我们可以多做一点来让结果展示只显示“Boston”,并且背后只对应一个唯一键值。请阅读文档来获取更多信息。

总结一下,不同的级别成员需要唯一的键值。当子级成员拥有一个特殊键值对应了不同的父级成员,同时另一个已有的子级成员已经使用了同样的键值,那么这个键值将会被新的成员重新引用。这样等同于创建了无效层级。

案例2

Date Hierarchies are common places to see invalid hierarchies. Naturally people tend to create the following hierarchy:

日期层级经常会出现无效层级的情况。通常人们会倾向于创建下面这样的层级:

***我这里讨论的是在DeepSee中的“年,月/年,周/年,和日/月/年”的提取功能。

众所周知,一周可以存在于两个不同的月份,或者甚至不同的年份。这里所有其他的级别(年,月,和日)都可以适用在它们的父级并且不会被拆分成两部分。当需要创建一个周次的级别成员也使用同样的模式的话,你将会看到意外的结果,归因于DeepSee引擎会横切数据树(从2020年1月3日开始追溯到到2019年第52周,即2019年12月。2020年1月3日不属于2019年12月的子数据,因此引擎会将这些数据移除)。

常见的解决方法是创建一个新的层级,只有周次级别在里面。这将保持原始层级的完整性,但是也同样支持按照周次来查询数据 。

DeepSeeButtons on Open Exchange 中生成的报告中有一个部分将会检查类似的状态,会在层级无效的时候通知你。

***在InterSystems IRIS 2020.3和更新的版本中,DeepSeeButtons将会被包含。更多的信息可以再这里找到。***

讨论 (0)1
登录或注册以继续