我有一个客户表和多个客户地址。客户可以有多个地址:家、工作、度假等。
在Kimball数据仓库中,我会使用桥接表来连接客户和客户地址信息吗?
(a) So DimCustomer to DimCustomerAddressBridge to DimAddress Table?这是正确的技术吗?
(b)还是我只会有一个事实表,如CustomerTransactionPayment表,连接二维DimCustomer和DimAddress?
因此,一种策略是使用桥接连接的二聚体,另一种是通过事实事务表连接的断开连接的二聚体?
发布于 2018-10-16 12:57:57
正确的架构取决于您打算如何使用此数据。让我们谈谈你的选择:
我不会使用这种方法,因为桥表用于表示N:N关系。如果你去做这件事,那就不可能准确地说出你的交易的正确地址;所以它将是无用的。
按照Kimball组->,“桥表是used...where,在事实表本身中不能解决多到多的关系.”https://www.kimballgroup.com/2008/09/design-tip-105-snowflakes-outriggers-and-bridges/
( b)创建另一个维度DimAddress (DimGeography?)
这看起来是一种很好的方法,特别是如果这些地址信息可能与其他事实表相关的话。也许你可以把它扩展成一个DimGeography,或者类似的东西。在这种情况下,DimGeography和DimCustomer不会直接相关。
( c)您还可以将客户维度的粒度更改为地址级别;因此,每个地址将有一行,“主客户数据”对于该维度中的同一客户是相同的。如果大多数数据与地址级别相关,->就会这样做。
( d)另一种方法是将模式雪花化。然后创建一个可用于此事实的DimCustomerAddress;其中事实表指向DimCustomerAddress,DimCustomerAddress指向DimCustomer。这样,您既不更改客户表,也不更改其他事实表,并且可以创建客户->地址层次结构。
( e)如果您必须跟踪历史地址更改(基于注释)
此解决方案类似于d),但DimCustomerAddress将是SCD类型2,这将使您的新DimCustomerAddress的粒度成为“地址历史”。例如:我假设这个维度的业务密钥是Customer、AddressID和Address类型,所以每次您得到地址更改时都应该添加一个新行;跟踪地址有效的开始日期和结束日期。您的事实表应该通过代理键"CustomerAddressKey“与CustomerAddressKey关联,DimCustomerAddress应该使用"CustomerKey”与DimCustomer关联。可以在ETL时间内使用开始日期和结束日期来填充事实表,以确定正确的"CustomerAddressKey“。

https://dba.stackexchange.com/questions/220190
复制相似问题