我可能误解了你的问题,但是:
事实表可能有也可能没有自动递增的 PK,通常事实表中的 PK 是多个引用维度表的 FK 的组合。
维度表应该有一个自动递增的 PK。
新客户应该在事务事实到达 DW(或至少是事实表)之前“登陆”到客户维度表中。
维度表应该有一个唯一标识客户的 BusinessKey——例如电子邮件、全名 + 密码或类似信息。
传入的交易行也应该有 customer BusinessKey 字段——这就是我们识别客户的方式。
在将事务插入事实表之前,使用 BusinessKey 从客户维度表中查找客户 PrimaryKey。
编辑
如果您的新客户数据与交易捆绑在一起,请找到一种方法来提取客户数据并在交易之前将其路由到 DW。
更新:
首先加载 dimCustomer,决定 BusinessKey - 所以维度看起来像:
CustomerKey = 12345 (auto-incremented)
CustomerBusinessKey = john_smith_101 (must uniquely identify the John Smith)
CustomerFirstName = John
CustomerLastName = Smith
在维度加载过程中,您必须将传入行分隔为两个流,现有客户和新客户。“现有客户”流中的行更新暗表(类型 1 SCD),同时插入“新客户”流中的行。正在插入的行流中不应有重复项;您可以通过将它们插入临时表并在那里删除重复项来完成此操作,就在最终插入维度表之前。您还可以提取重复项并将它们路由回加载过程以更新客户记录;它们可能包含更新的数据——例如更新的电话号码或类似信息。
一旦客户进来,加载事实。
事实表应如下所示:
DateKey (PK)
CustomerKey
OrderNumber (PK)
Total
我使用了 DateKey 和 OrderNumber 的复合主键,允许不时重置订单号序列。
在加载过程中,将事实记录修改为如下所示:
DateKey CustomerBusinessKey OrderNumber Total
20100201 john_smith_101 111 500
20100301 john_smith_101 222 600
此时,我们需要使用查找将 CustomerBusinessKey 替换为维度表中的 CustomerKey。因此,在查找之后,流看起来像:
DateKey CustomerKey OrderNumber Total
20100201 12345 111 500
20100301 12345 222 600
现在可以将其插入事实表中。
我也作弊了一点——没有从 dimDate 中查找日期键,也没有在事实表中查找现有行。加载事实表时,您可以在加载之前查找现有的 (DateKey, OrderNumer) 组合,或者您可以将其留给主键以防止重复——您的选择。在任何情况下,请确保将相同数据重新加载到事实表中的尝试失败。