我有一个带有2列的DIM(dim.ReceiptType): ReceiptID和ReceiptType ReceiptType有2个值:1或0,因此ReceiptID在列中重复至少2次。 FACT表中存在相同的列,其值相同。
在SSIS或SSAS中,是否有一种优雅的方式将ReceiptType从DIM连接到FACT中的ReceiptType? 我一直在考虑这个解决方案:如果2个表具有相同的列和值,可能我会将ROW_NUMBER指定为连接KEY。 这是一个好的解决方案吗?是的,请协助如何正确地做到这一点。
答案 0 :(得分:0)
我认为我们在这里遇到了设计问题。基本上有两种方法可以解决这种情况:
1。 数据仓库中的所有维度都应具有“代理”(人工)密钥,以便您可以避免这种情况,即当您获得具有不同属性集的自然密钥(带有事实的密钥)的重复时。
代理键通常如下所示:在接收事实数据后,您可以隔离各种维度属性组合(在本例中为ReceiptID
和ReceiptType
对),并将这些组合放入一个{{1}的表中列。完成此操作后,您执行Lookup或IDENTITY
(取决于您是通过 ETL 层工作还是直接在 SQL 中工作)将事实中的值与刚刚添加的特定维度成员进行匹配。
data warehousing gurus here之一更深入地解释了这一点。如果你不是金球迷,你可以在互联网的任何地方看到“代理键”的概念。
2。 (并在上面进行了一些扩展) 可能是您尝试移动到专用维度的值具有与事实类似的粒度,即您通常只有一个ReceiptID与一个事实行匹配。在这种情况下,创建专用维度没有多大好处,您可能只想将ReceiptType分开,将事实表中的ReceiptID保留为degenerate dimension,或将其移出事实表,其他不相关的属性为{{} 3}}。此外, SSAS 对于退化维度有junk dimension,因此您可以选择避免对ETL逻辑进行重大更改。