SCD2 与事实 TABLE 实施

SCD2 WITH FACT TABLE IMPLEMENTATION

我被要求建立一个客户维度和一个床维度。

并在clientID-SK的意义上把它们放在一起,bedID_SK,Bed_begin_date,bed_end-date.Both tables包含SCD1,和SC2 fields.How 如果客户上床、下床和下床的日期与定义为客户或床(类型)的内容无关,我是否实施此操作。

我已经能够将它们结合起来,但我的挑战是当我将它们加载到事实中时 table table 只有 begin_date 。我将如何更新事实 table end_date 假设为下一个床位分配的 begin_date。

例如 clientID,bedID,Start_Date,End_Date 10 ,ROO1, ,01-19-2020, 3000-01-01 00:00:00.000

维度 10 ,ROO1, ,01-19-2020, 10-19-2020 10 ,ROO2, ,10-19-2020, 3000-01-01 00:00:00.000

我们有一个名为 current bed 的 table 来跟踪我们当前的客户,我能够根据 table.

构建一个缓慢变化的维度

但我们担心遵循标准做法,我们必须有一个星型模式。

任何建议

所以你至少有以下 tables:

  1. 持有所有客户属性的客户维度
  2. 包含所有 Bed 属性的 Bed Dimension
  3. 日期维度
  4. 一个床位占用事实,包括客户 Dim 的 FK、Bed Dim 和 2 个 Date Dim 的 FK(一个床被占用,一个床空出)

当一张床第一次被客户占用时,您创建一个新的事实记录并填充客户、床位和占用日期 FK。您使用 0(或您在 Date Dim 中用于指示 'unknown' 记录的任何键值)填充 Bed Vacated。

当下一次床位被占用时,您为新客户创建一个新的事实记录,并使用相关日期键更新先前记录上的床位空出 FK。

需要考虑的几点:

  1. 您是只在日期粒度级别还是在时间级别工作,即您是否对一天中的什么时间(或 morning/afternoon 等)床 occupied/vacated 感兴趣?
  2. 我会确保前一个占用的腾空日期和当前占用的日期不是相同的值,否则您可能会重复计算该重叠日期,除非您开始实施逻辑来防止它。例如,如果一张床在 9 月 25 日被占用,则将上一个记录的腾空日期设置为 9 月 24 日
  3. 有没有床位的月经吗?如果可以,那么我会以与占用床位完全相同的方式为此创建一个事实记录,但将客户端 ID FK 设置为 0(或您在客户端 Dim 中使用的任何值以指示“不适用”客户)

希望这有帮助吗?

响应后更新 1

如果您需要包含时间,那么您需要一个时间维度和事实中的 2 个附加键,用于占用时间和空闲时间。

我不确定我是否理解你关于如何更新事实的问题 table。您拥有识别事实记录所需的信息(床位 ID 和腾出日期键 = 0)以及更新事实记录所需的值。我错过了什么?

更新 2

我认为您需要退后一步,清楚地思考您要实现的目标 - 然后您的问题的答案应该会变得更加明显。

您需要问的第一个问题是您要衡量的是什么:一旦您明确定义了这一点,那么事实 table 的粒度就确定了,并且您需要对哪些属性进行更改会变得更加清楚处理。例如:

  1. 如果你只想知道每次入住者变化时床的状态,并且只想知道入住者第一次使用床(或最后一次使用床)时的状态,那么你只需要添加一个当床位占用发生变化时记录事实,并且在该患者占用期间无需记录任何更新
  2. 如果您想知道床在任何时间点的状态,那么首先您需要定义“任何时间点”的含义:每天、每小时、每分钟等?然后,如果该时间段内有多个更改,即小时开始或小时结束时的位置,则需要决定要记录的内容。根据这些决定,您需要计算在该时间段内是否有任何变化,如果有,insert/update 相关记录
  3. 如果您想将每位患者的床位占用情况视为一个事实,那么您的事实记录显然有开始日期和结束日期,但您还需要决定要为任何属性记录哪个状态这可能会在那段时间发生变化——您可以在入住开始或结束时记录患者的状态,但不能在整个入住期间记录,因为这会影响事实的本质 table

所以尝试回答您的问题...

如果维度属性发生变化并影响您的事实 table 那么您需要处理这个问题,例如通过插入或更新事实记录:

  • 如果您只对占用开始或结束时患者的状态感兴趣,则可以忽略占用期间对患者属性的任何更改
  • 如果您对患者在入住期间任何时候的状态感兴趣,那么只要患者的某个属性发生变化,您就需要对事实进行更改table

您的事实记录 table 不应相互重叠 - 因此在任何时间点,每张病床和每位患者只有一个活动事实记录。每次插入新的事实记录时,都会使先前适用的事实记录失效。

因此,当您询问 “当客户端移动到新床时对 end_date 的更新将在所有 3 个添加的代理键行上?”,答案是否定的 - 你会在创建 nex 时在前 2 条记录上设置结束日期每次记录即创建记录2时设置记录1的结束日期,创建记录3时设置记录2的结束日期等;所以您只会在客户端移动时更新最后一条记录。

仅当需要更新事实 table 时,才需要向事实 table 添加 PK - 就像这里的情况一样。您是否这样做是一个选择 - 但我会看看复合键有多复杂,即您需要使用多少 SK 来识别要更新的正确事实记录。在您的情况下,您只需要 Bed SK 和 end_date = null(或 31/12/3000 或您选择设置它),因此定义单个 PK 字段可能没有任何好处 table。如果您需要超过 5 个 SK 来识别事实记录,那么可能需要使用单个 PK 字段。

更新 3 - 于 2020 年 11 月 17 日添加以下评论

Mini-dimensions:似乎更多,不必要的并发症,但我不能真正发表评论,除非你能清楚地阐明你认为 mini-dimensions 会解决的问题是什么以及你为什么认为 mini-dimensions 是问题的解决方案

日期

您似乎对 SDC2 维度上的生效日期和引用日期维度的事实 table 上的外键感到困惑 - 因为它们是非常不同的东西。

事实的日期 FK 是您选择为该事实记录的属性。在您的示例中,对于每个床位占用事实(即 您的事实 table 中的单个记录 ),您可能有“占用日期”和引用日期维度的“Date Vacated”attributes/FKs。创建事实记录时,您将使用适当的日期填充“占用日期”字段,使用“0”填充“腾出日期”字段(或指向日期维度中“未知”记录的任何值)。当床空置时,您更新事实记录并将“腾出日期”字段设置为适当的日期。

因为需要记录2个不同的日期,所以需要有两个引用Date维度的FK;您无法使用对日期维度的单一引用来记录占用日期和腾出日期。

当您想对引用 SCD2 维度的事实 table 建立 FK 时,同样的思维方式适用;您需要确定该引用的 point-in-time 上下文是什么,然后 link 到 SCD2 维度中记录的正确版本。因此,如果您想记录患者在床位时的状态,那么您可以在 Dim.EffStartDate 和 Dim.EffEndDate 之间的 Fact.DateOccupied 维度中选择他们的记录。如果您想 记录患者在不同(但特定)时间的日期,例如床被腾空的时间,那么您需要为事实添加一个单独的 FK table 保存对 Patient Dim 的附加引用。

填写事实后 table,如果您想了解患者在特定时间点的状态,则不需要对事实做任何事情 table;相反,您需要将 Patient Dim 加入自身。例如

  1. 事实 table 持有引用 Patient Dim 中记录的 FK
  2. 从这个 Patient Dim 记录中您可以得到患者的 BK
  3. 从这个 BK 返回到 Patient Dim 并过滤您想要获取患者详细信息的日期

Pseudo-code SQL 因为这看起来像(假设您想知道患者在“2020-11-17”的状态):

SELECT
    P2.*
FROM
    FACT_TABLE F
    INNER JOIN PATIENT_DIM P1
        ON F.PATIENT_SK = P1.PATIENT_SK
    INNER JOIN PATIENT_DIM P2
        ON  P1.PATIENT_BK         = P2.PATIENT_BK
            AND P2.EFFSTART_DATE <= '2020-11-17'
            AND P2.EFF_END_DATE  >= '2020-11-17'

希望这有帮助吗?