我应该将维度属性移动到它自己的维度吗?

Posted

技术标签:

【中文标题】我应该将维度属性移动到它自己的维度吗?【英文标题】:Should I move a dimension attribute to it's own dimension? 【发布时间】:2015-09-11 06:49:35 【问题描述】:

我下面的问题是假设性的,我正在使用 SSAS:

假设我有一个维度 (dim_Product) 代表我在商店中销售的产品,我有另一个维度 (dim_Employee) 代表公司的员工,我有一个事实表 (fact_EmployeeSalesPerMonth) 显示每个员工为此销售了多少产品月。

现在,假设每个产品都有一个类别,我有一个客户要求在从仓库中提取数据的报告中显示此类别数据。假设我的客户试图回答的问题是“哪些员工最擅长销售哪些类别的产品?”。

源系统中的产品类别是使用预定义值的下拉列表设置的。假设预定义的值是电子设备和硬件。此类别文本作为文本列存储在 dim_Product 维度上。

现在假设我们在源系统中添加了第三类产品(儿童玩具),目前该系统不包含任何产品。我的客户希望报告显示此类别。很明显,我没有提供此类别数据,因为没有与之关联的产品。

我的问题是,如果这是要求。我将如何将这些数据存储在仓库中?我会把它存放在哪里?

我考虑过将类别数据移动到它自己的维度,然后在事实表上设置一个指向类别维度的类别键,但我不确定这是否正确。这意味着我将来创建的任何与 dim_Product 链接的事实表都需要链接到产品维度和产品类别维度,并且具有指向两者的键。

【问题讨论】:

【参考方案1】:

你在你的问题中解决了几个问题,所以让我们一步一步来吧

产品类别维度

产品类别是维度层次结构的一个示例。我建议的第一件事是将产品类别作为附加属性存储在产品维度表中,可能与其他属性一起存储,例如子类别、超类别。您可以这样定义具有多个级别的产品层次结构。 这种设计的明显后果是,如果您想引入一个新类别,您至少需要一个(例如虚拟)产品。 事实表仅包含产品 ID。

产品类别报告

如果您报告产品级别,即维度月份、产品、类别,您将需要“不存在”产品来填写报告,因此维度表中的“虚拟”产品条目是合理的。 要在报告中获取未使用的维度条目,您可以将其集成到报告查询中或进行附加查询——“什么未使用?”。哪个更好取决于您的里程,如果您考虑事实表中未在维度表中定义的产品 ID,您将以完全外部连接结束(这可能会影响性能),因此您可以找到后者选项(带有额外的查询 - 事实表中不存在的维度表中的产品)更灵活。

如果您经常只报告类别级别(没有产品),您可能会发现定义类别表很有用。特别是如果类别有其他属性,例如描述,将其放在专用表中更方便,以便使用 DISTINCT 查询从产品维度中恢复它。

在事实表中存储类别 ID

此决定的驱动因素在于您的产品层次结构的动态。如果随着时间的推移产品类别发生变化,这种方法会提供属性的开箱即用历史记录。在重新分配产品类别后,您可以报告销售产品的“正确”类别。 (但您也可以使用新类别报告所有销售,只需忽略事实表中的条目并从产品维度中获取类别)。这里的重点是 IMO 不在决定是否存在类别维度,而是是否需要维护归属产品的历史记录(此处为类别)。

因此,如果您阅读了我的回答并总结了我的建议,则可以找到主题

额外类别维度表

在事实表中存储类别键

外连接或额外查询以查找未使用的维度

答案是视情况而定——你明白了!

【讨论】:

感谢您抽出宝贵时间回答这个问题!欣赏它!竖起大拇指:)【参考方案2】:

只有在没有产品列表的情况下经常使用产品类别时,我才会将其作为一个独立的维度。如果它不经常使用,或者它主要与产品列表一起使用,那么将它作为一个属性来代替它是有意义的。

独立维度通常更快(我看到使用此类属性时查询时间减少了 50%)但也花费更多空间/加载时间。 我看到我们在每个这样的新维度上拥有的一个非常大的立方体的尺寸增加了大约 7%。 如果它们不经常使用,我会避免使用它们。这是关于找到正确的平衡。就我而言,我在一个维度中有 50 多个这样的属性,这会使立方体变得更大,而且它已经是一个大立方体了。

顺便说一句,通过使其成为产品维度的一部分,可以通过使用自动存在而不是事实检索来解决将产品对应于类别的查询。

【讨论】:

以上是关于我应该将维度属性移动到它自己的维度吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该跟踪关系/事务数据库中缓慢变化的维度吗? [关闭]

比特币现价如何?还能买入吗?

将层次结构放在其自己的单独维度中还是将其设置为相关维度的一部分?

如何处理SCD 2类维和重复维记录?

如何从自定义属性中读取维度值?

代理键作为维度的属性