我有一个DIM (DIM . receipttype) 2列:ReceiptID和ReceiptTypeReceiptType有2个值:1或0,因此ReceiptID在一列中至少重复2次。相同的列存在于一个FACT表中,具有相同的#的值。
在SSIS或SSAS中是否有一种优雅的方式将ReceiptType从DIM连接到ReceiptType ?我一直在考虑这个解决方案:如果两个表有相同的列和#的值,也许我将分配一个ROW_NUMBER作为连接键。这是一个好的解决方案吗?如果是这样,请协助如何正确地做。
我认为我们在这里面临一个设计问题。基本上有两种方法可以处理这种情况:
1。数据仓库中的所有维度都应该有"代理"(人工)键,这样您就可以避免这种情况,即当您获得具有不同属性集的自然键(那些带有事实的键)的副本时。
代理键通常是这样工作的:在接收到事实数据后,隔离维度属性的各种组合(在本例中是ReceiptID
和ReceiptType
对),并将它们放入具有IDENTITY
列的表中。完成后,执行Lookup或JOIN
(取决于您是通过ETL层还是直接在SQL中工作)以将事实中的值与您刚刚添加的特定维度成员相匹配。
这里的一位数据仓库专家对此进行了更深入的解释。如果你不是Kimball的粉丝,你可以在互联网上的任何地方看到"代理密钥"的概念。
2。(并在上面的基础上进行扩展)可能是您试图移动到专用维度的值的粒度与事实的粒度相似,即您通常会有一个与事实行完全匹配的ReceiptID。在这种情况下,创建专用维度没有多大好处,您可能希望只分离ReceiptType,将ReceiptID作为退化维度留在事实表中,或者将它与其他不相关的属性一起移出事实表,作为垃圾维度。此外,SSAS具有对退化维度的本机支持,因此您可以选择避免对ETL逻辑进行重大更改。