如何为事实表创建一对多关系

Posted

技术标签:

【中文标题】如何为事实表创建一对多关系【英文标题】:How to create a one-to-many relationship for a fact table 【发布时间】:2020-11-19 05:29:29 【问题描述】:

如果我有各个 NFL 球队的事实表。其中一个关系是PlayerTeam 之间的关系。一个团队包含许多球员。如果事实表基于Season+Team,我如何将player 中的一对多键添加到fact 表中?以下是我目前拥有的:

【问题讨论】:

【参考方案1】:

简短的回答是您不会将播放器中的一对多键添加到事实表中。相反,您将在 Team Dim 和 Player Dim 之间添加一个桥接表。

更长的答案/背景...

当您设计事实表时,您需要定义其粒度,即哪些维度唯一标识事实中的每条记录。一旦你定义了这个粒度,你就不应该对设计进行任何会改变粒度的更改(除非你已经意识到最初的粒度是错误的并且你需要从头开始重新定义你的事实表。

您已将事实表粒度定义为 Season+Team,因此您无法将 Player 添加到事实表中,因为这会改变粒度。

如果您确实添加了桥接表,那么它将允许您按玩家报告您的事实,但它也会给您的报告带来风险,您需要注意这一点。例如,您可以显示每位玩家每年的胜场数,但您无法汇总这些结果,因为您的胜场数会被重复计算(同一团队中的每个玩家实际上都在获得相同的胜场数)

【讨论】:

我喜欢你的解释,尼克!我这边的注意事项:球队和球员之间的多对多桥接表可能会因为球员改变他们的球队等而显着增长。在多维数据集方面,使用多对多关系开始影响桥接表中超过 1M 行的性能。我还建议消除 [Season] 并改用 [Date] 维度。因为 [Season] 表中的所有信息都可以从 [fact] 中查询。球员也有可能在年中换队。所以 Teams_Players 成为 Teams 和 Players 和 Date 而不是 Season 之间的桥梁。 @AlexPeshik 如果是我设计的,那么我会从较低的层次开始:可能将玩家/游戏作为我的基本事实,并将玩家/团队作为层次结构。然后,您可以从团队和球员的角度建立单独的汇总事实表 - 而不是试图在赛季级别将两者结合在一个事实中 - 正如您所说的那样,这会因为 M:M 加入和性能影响而变得复杂,而且您开始在尺寸和桥梁上都需要 SCD2,这会变得很有趣!

以上是关于如何为事实表创建一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何为一对多关系配置 Solr

如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?

核心数据:在一对多关系中匹配多个项目的组合

Zend 2 - 教义如何为三个实体插入一对多?

如何为多标签分类器/一对休息分类器腌制 sklearn 管道?

数据立方建立-如何实现一对多,多对多