如何在星型模式中处理一对多?

How to handle one to many in a star-schema?

我需要一种方法将一个或多个部分所有者与以下星型模式中的飞机相关联(见下图)。

下图和示例是否是在数据仓库中为该关系建模的正确方法?

我最常见的需求可能是需要按部分所有者的总数报告飞机。是否有更多 "correct" 的建模方法?

加入 2 个事实 tables 是个坏主意。许多 BI 工具甚至不允许您这样做(只允许 1:M 关系)。

您所拥有的是在星型模式中对多对多属性进行建模的经典案例。最常见的解决方案是创建一个桥梁 table 将(在您的情况下)飞机和所有者(也可能随时间变化)关联起来。 "Owner" 将成为一个维度,通过桥梁连接到事实 table。

桥 tables 的问题是它们使模型严重复杂化,并且更难使用。只要有可能,我都会尽量避开它们。我经常使用的两种常用设计技巧:

  1. 计算数据仓库中每架飞机的部分所有者数量,并将其作为事实添加到事实 table。这种方法的优点 - 它是最简单和最健壮的设计。缺点 - 如果您需要查看所有者的姓名,您将无法查看(尽管您可以通过将多个所有者连接成一个字符串并将其添加为属性来部分解决该问题)。

  2. 或者,您可以重新整理您的事实 table。目前,事实上 table 谷物是飞机。您可以将其更改为 "aircraft ownership"(即飞机 + 所有者)。然后可以将所有者添加为维度并连接到事实 table。优点:该模型仍然很简单(没有桥),也很健壮,但您将完全了解所有者及其属性。缺点:新谷物对分析师来说可能不太直观;事实 table 的规模增加(即,如果您每架飞机平均有 3 位所有者,您的事实 table 将增加三倍)。此外,如果您有任何附加事实,例如成本等,则必须将它们分配给每个所有者(即,平均分配,或者如果您有数据,则按所有权百分比分配),以避免重复计算。