在星型模式中处理多个粒度

Posted

技术标签:

【中文标题】在星型模式中处理多个粒度【英文标题】:Handling multiple grains within a star schema 【发布时间】:2019-04-09 09:56:49 【问题描述】:

我正在尝试对本质上在多个粒度上进行测量的业务流程进行建模。通常,这需要每个粒度一个事实表。因为这是一个单一的业务流程并且只有一个维度处于混合粒度(对于某些记录),所以我不确定单独的事实表是否最有意义。

该过程本身基于衡量研究应用程序。每个应用程序都可以有申请人、资助者、合作者等。此外,每个应用程序都可以由组织管理。对于 M:N 关系,我使用桥接表和加权因子。问题在于组织维度,它将略微参差不齐的层次结构建模为固定深度属性。

dim_organisation
id, organisation, faculty, school, division, unit

除此维度外,每个事实记录都具有相同的维度。有时,应用程序由教师(层次结构中的第 2 级)管理,有时由学校(层次结构中的第 3 级)管理。此外,事实记录本身将仅包含其中一个级别的业务密钥,例如school_code 或faculty_code。

以下是我认为可以并且应该解决问题的方法,但我希望对这种方法进行一些验证和/或在必要时提出一些更好的建议:

初始的 dim_organisation 表是通过外部主数据源填充的。数据始终是平衡的,即数据中没有缺失级别,但它参差不齐,因此有些条目在学校结束,而另一些则直接下降到单元级别:

id, organisation, faculty, school, division, unit
1, org A, faculty A, school A, NULL, NULL
2. org A, faculty B, school B, division B, unit B
3. org A, faculty C, NULL, NULL, NULL

因为这些记录的粒度不同,所以我复制了最后一个非 NULL 级别以完成层次结构:

id, organisation, faculty, school, division, unit
1, org A, faculty A, school A, school A, school A
2. org A, faculty B, school B, division B, unit B
3. org A, faculty C, faculty C, faculty C, faculty C

这可确保 org_dimension 中的每条记录都具有相同的粒度,并且是处理略微参差不齐的层次结构的标准方法。此外,每个级别都有自己的代码,例如L456 用于 4 级部门或 L521 用于 5 级单位。这些是从源系统获取的业务密钥。

因此,我只能通过相应地组合所有级别代码来引用维度中的单个记录。目前,我正在这些级别代码上创建一个哈希键,并将值存储在维度的查找列中。

假设这种方法是正确的,那么我的事实记录如下:

application_id, organisation_id, applicant_id, ...
1, L456, 99
2, L321, 50
3, L549, 20

如您所见,应用程序事实在不同的粒度上与我的组织维度相关联,例如4 级、3 级、5 级等等。由于我对维度所做的更改,我认为我现在需要执行以下操作:

1. Lookup the level code from dim_organisation.
2. Return the parent levels.
3. Copy down the level value associated with the fact to level 5.
4. Hash the keys and lookup the corresponding dimensional record.

例如:

1. Lookup L456 to return Division e.g. "Research and Engineering".
2. Return parents: "UoM" -> "Faculty of R&D" -> "School of Engineering".
3. Copy levels: L1 -> L2 -> L3 -> "Research and Engineering" (L4) -> "Research Engineering" (L5).
4. Now we have all the levels (parents + cascaded) to give us a unique record to look up in dim_organisation. 

我想知道这种方法是否有意义,或者是否有更好、更直观的方法来做到这一点?由于我正在处理的源数据,这有点混乱,但这是我必须处理的数据现实。

【问题讨论】:

【参考方案1】:

通过将参差不齐的层次结构向下推到最低粒度,您的维度做得很好。现在让您的事实记录引用维度的唯一行指示器。

1, org A, faculty A, school A, school A, school A
2. org A, faculty B, school B, division B, unit B
3. org A, faculty C, faculty C, faculty C, faculty C

如果事实事件与学校 A 相关,则事实将存储第 1 行。

对这种方法的唯一警告是,实际的暗淡程度应该可以通过内容来识别。换句话说,如果 A 学校是 West Side High School 而教员 C 是 Mr West,你不会希望他们都被描述为“WEST”。如果每个级别的内容都是完全描述性的,那么这个模型就可以正常工作。

我已使用这种完全相同的方法对包含多达 10 个报告级别的组织层次结构进行建模。

【讨论】:

以上是关于在星型模式中处理多个粒度的主要内容,如果未能解决你的问题,请参考以下文章

星型模式 - 贷款逾期日期建模

星型模式

数据仓库与数据挖掘

为星型模式中的分辨率设置时间维度

识别数据模型粒度

蒙德里安非星型模式,多个事实表