【问题标题】:Natural key when combining two source tables that use similar promary keys组合使用相似主键的两个源表时的自然键
【发布时间】:2019-02-21 09:40:42
【问题描述】:

我有两个源表,一个基本上是发票,另一个是迁移的发票。两者可能应该使用相同的对象,但我有这个。它们包含大部分相同的数据。

我曾想过将两者合并到一个维度表中,但是两者都将使用相同的自然键。我应该如何处理这个?

我想到的一个潜在解决方案是对迁移的表使用负数,但是自然键不会与源完全对齐。

我只是将它们组合在事实表中吗?然后,由于 NULL,我无法链接回维度表。

或者我是否要添加额外的列或信息来指明发票的类型?

编辑


以下当前表格的简单模型。 该维度目前只包含未迁移的数据,它有一个主键,但是 如果我将迁移的发票表合并到此,它将看起来好像正在更改 以原始发票制作,而不是第二套发票

维度

代理键| source_pk |总计 | scd_来自 | scd_to
             | | | |
 1 | 1 | 100 | 2019 年 1 月 1 日 | 2019 年 1 月 31 日
 2 | 1 | 150 | 2019 年 1 月 2 日 | 2019 年 12 月 31 日
 3 | 2 | 50 | 2019 年 1 月 1 日 | 9999 年 12 月 31 日

源发票表

pk |全部的
___________________
 1 | 150
 2 | 50

源迁移的发票表

PK |全部的 ___________________ 1 | 200 2 | 300

【问题讨论】:

  • 您是否考虑过使用自动递增的非业务相关号码(又名 IDENTITY)?您可以保留原始发票 ID,但新身份将是您的主键。
  • 更新信息,如有误解,请见谅。我已经在维度上有一个代理 PK,但这无助于复制自然键的问题
  • 您不能将来自不同系统的密钥保存在同一张表上而不会遇到麻烦。如果这 2 个代表完全不同的实体(碰巧共享相同的数据),那么您需要以某种方式进行区分,可能为 InvoiceSource 或 InvoiceOrigin 添加另一个维度,并通过 source_pk 和 InvoiceSourceID 强制唯一性(如果需要)。
  • 您能否添加一个“source_tbl”列并将 I 或 MI 放入其中作为自然键的附加部分?

标签: sql-server etl data-warehouse


【解决方案1】:

如果发票和迁移的发票具有相同的自然键,但某些字段的值不同(您的示例显示它们之间的总金额不同),那么您有一行基于 Dim 中的自然键,但有 2 个不同的列来表示2个来源。根据您的示例,您的 DIM 中需要 invoice_Total 和 migrated_invoice_Total 列。

【讨论】:

  • 问题是它们代表两个不同的对象,迁移发票的 pk 1 与未迁移发票的 pk 1 无关。以前我们会将它们迁移到带有标志的相同对象类型中,但这次开发团队采取了不同的方法。我想我只需要将它们视为两个不同的维度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多