1

所以,我想我明白在维度中放入什么,在事实表中放入什么,以及如何实现这一点。现在我遇到了问题,我有这个维度“产品”和一个维度“产品属性”。我不得不拆分它,否则我在“产品”中的自然键将不再是唯一的。我在 这个问题中问过这个。

所以我的“productProperties”维度表应该是这样的:颜色 | 材料 | 尺寸

1.)为了实现这一点,我必须创建“颜色”、“材料”、“尺寸”等值的所有可能排列,对吧?

这将远远超过 2 亿行,所以我决定将其拆分。我现在有一个维度“颜色”,它实际上由“颜色”、“颜色前”、“颜色后”列组成。

2.)我猜这很好,但是维度“大小”呢,它只包含“surrogate_key”和“value”列?

我已经阅读了“退化维度”(在我的另一个问题中给出的阅读建议中),这意味着在事实表中将“单列维度”设为一列。这对我来说似乎有点不切实际,因为我最终会在我的事实表中增加大约 5-6 列。

如果我应该这样做怎么办?

3.) 这些退化维度是事实表中主键的一部分吗?

最重要的问题:我的事实表中将包含产品条目,这些条目与我的维度中的每一列不匹配,或者根本不匹配所有维度。意思是,我可能有一个条目/产品,它具有“color”属性,但没有“colorFront”或“colorBack”属性。由于我创建了“color”、“colorFront”和“colorBack”的每一个排列,当尝试填充我的事实表时,我将获得多个代理键,如果产品只有属性“color”会导致我的重复事实表,对吧?

4.) 那么在查询我的事实表时,我是否必须过滤掉那些重复项?或者这是完全错误的?

我当然可以在三个维度上拆分维度“颜色”。但随后我将在某些列中获得具有 NULL 值的条目。完全不使用某些尺寸的条目/产品也是如此。

5.) 如何处理那些 NULL 值?

提前感谢您的帮助。

4

2 回答 2

3

每个维度都有:

  • 主键 ( DateKey, TimeKey, ProductKey, ...)
  • 业务密钥 ( FullDate, ProductFullName, ColorNaturalKey, ...)
  • 值为“未知”的行(Key= 0,BusinessKey= '未知',所有其他 = 'n/a')
  • 值为 'n/a' 的行(Key= -1,BusinessKey='n/a',所有其他 = 'n/a')

在表中,Colorcolumns和all 都有 'n/a' 和 'unknown' 的值——所以这些应该包含在排列中。这样,维度表中总有一行可以指向。ColorColorFrontColorBack

您可以选择通过将 移动SizeValue到事实表中并删除dimSize.

替代文字

于 2010-09-23T15:58:21.420 回答
3

1)谁告诉你:

所以我的“productProperties”维度表应该是这样的:颜色 | 材料 | 尺寸

要么是错误的,要么你误解了。

这个想法被称为“垃圾维度”。并且它不必一开始就包含笛卡尔积。它可以像任何其他维度一样加载。如果事实表中需要组合而不是维度中需要组合,则添加它。开始使用笛卡尔坐标很方便,但您最好知道,当添加新颜色时,您必须重新进行笛卡尔坐标。最好在需要时加载而不用担心它。

2)好的,所以现在我已经阅读了您的整个问题,并意识到您正在阅读有关维度建模的内容,但看起来您正在浏览它。

退化维度类似于采购订单号。这不是事实。你不能求和。但它也不是一个维度,因为关于 PO123210413 没有什么需要说的了。它不是任何地方的 FK。

于 2010-09-23T22:49:23.637 回答