所以,我认为我理解了维度中的内容,事实表中的内容以及如何实现这一目标。 现在我遇到了问题,我有这个尺寸'产品'和尺寸'productProperties'。我不得不拆分它,否则我的'产品'中的自然键不再是独一无二的了。我问过这个问题 this question
所以我的'productProperties'维度表应该如下所示: 颜色|材料|大小
1.)为实现这一目标,我必须创建“颜色”,“材料”,“尺寸”等值的所有可能的排列,对吧?
这将超过2亿行,所以我决定将其拆分。 我现在有一个'Color'维度,实际上包括列'color','colorFront','colorBack'。
2。)我觉得这很好,但尺寸“尺寸”怎么样呢,它只包括列'surrogate_key'和'value'?
我读过“退化维度”(在我的另一个问题中给出的阅读建议中),这意味着,在事实表中将“单列维度”设为一列。这对我来说似乎有点不切实际,因为我最终会在我的事实表中增加5-6个额外的列。
如果我应该这样做怎么办?
3。)这些退化维度是事实表中主键的一部分吗?
最重要的问题: 我将在我的事实表中包含产品的条目,这些条目不符合我的维度中的每一列或根本不匹配所有维度。意思是,我可能有一个条目/产品,它具有属性'color',但不是'colorFront'或'colorBack'。 由于我创建了'color','colorFront'和'colorBack'的每个排列,当我尝试填充我的事实表时,我会得到多个代理键,如果产品只有属性'color',导致我的重复类型事实表,对吗?
4.。)在查询我的事实表时,我是否必须过滤掉那些重复项?或者这是错误的吗?
我当然可以在三个维度上分割尺寸'颜色'。但是后来我会在某些列中获得带有NULL值的条目。对于完全没有使用某些尺寸的条目/产品也是如此。
5.。)如何处理这些NULL值?
提前感谢您的帮助。
答案 0 :(得分:3)
每个维度都有:
DateKey
,TimeKey
,ProductKey
,...)FullDate
,ProductFullName
,ColorNaturalKey
,...)Key
= 0,BusinessKey
='未知',所有其他='n / a')Key
= -1,BusinessKey
='n / a',所有其他='n / a')在Color
表格中,Color
,ColorFront
和ColorBack
列都包含'n / a'和'unknown'的值 - 因此应包含这些值在排列中。这样,维度表中始终有一行指向。
您可以选择通过将SizeValue
移动到事实表中并删除dimSize
来使尺寸变为退化维度。
答案 1 :(得分:3)
1) 无论谁告诉你:
所以我的'productProperties'维度表应该是这样的:Color |材料|大小
要么错了,要么你误解了。
这个想法被称为“垃圾维度”。并且它不必包含笛卡尔积。它可以像任何其他维度一样加载。如果事实表中需要组合而不是维度中的组合,则添加它。直接嘲讽它是一种便利,但是你最好知道当添加一种新颜色时你必须重新笛卡尔。最好在需要时加载而不用担心。
2) 好的,现在我已经阅读了你的整个问题并意识到你正在阅读有关维度建模的内容,但看起来你正在浏览它。
退化维度就像采购订单编号。这不是事实。你不能SUM它。但它不是维度,因为关于PO123210413只需要说些什么。它对任何地方都不是FK。