我应该将所有外键从主事实表复制到其他相关表吗?

Posted

技术标签:

【中文标题】我应该将所有外键从主事实表复制到其他相关表吗?【英文标题】:Should i copy all the foreign keys from the main fact table to other related table? 【发布时间】:2012-04-10 17:33:23 【问题描述】:

我有一个主事实表,其中包含大约 10 个外键。现在我有其他 4 个事实表,它们有 N:1 关系连接到主事实表。 问题是,我应该将所有外键复制到这 4 个事实表,还是应该在 SSAS 多维数据集处理期间将运行时联接到主事实表?

优缺点是什么?

【问题讨论】:

你能举个例子吗?分析起来会更容易 当然。主要事实表是 FactTable(PKey, FKey1,FKey2,FKey3,FKey4, Value) 相关的事实表如 FactTable1(PKey, FactTable.PKey, ErrorCounter) FactTable2(PKey, FactTable.PKey, EventCounter) 问题是,我应该将 FactTable1 或 FactTable2 更改为如下结构: FactTable1(PKey, FactTable.PKey,FactTable.FKey1,FactTable.FKey2,FactTable.FKey3,FactTable.FKey4, ErrorCounter) 你怎么能有 4 个与另一个事实有多对一关系的事实表?根据定义,事实表通过公共维度相关联。除非在非常有限的情况下,否则您不会将事实键放在另一个事实表上。 其实,当你尝试实现多对多的场景时,这是很常见的。假设主 FactTable 是 FactConversation,你可能有 FactActivity(和对应的暗表 DimActivity)。在一个会话中,你可以有多个活动。现在您想知道每个活动的对话计数,或对话平均持续时间。您必须在 DimActivity 和 FactConversation 之间实现多对多 【参考方案1】:

似乎我无法在评论中添加换行符。所以我把 cmets 留在这里。 当然。主要事实表是 FactTable(PKey, FKey1,FKey2,FKey3,FKey4, Value) 相关的事实表如 FactTable1(PKey, FactTable.PKey, ErrorCounter) FactTable2(PKey, FactTable.PKey, EventCounter)

问题是,我是否应该将 FactTable1 或 FactTable2 更改为如下结构: FactTable1(PKey, FactTable.PKey,FactTable.FKey1,FactTable.FKey2,FactTable.FKey3,FactTable.FKey4, ErrorCounter)

【讨论】:

【参考方案2】:

出于什么原因,您希望将其全部放在一个事实表中?它们在 SSAS 中如何作为度量/组关联。

您现在是否遇到性能问题?如果在单独的表中处理多维数据集需要 5 秒以上,并且需要 5 分钟的 ETL 将其全部加载到一个表中,那么保持原样会更明智。如果是另一种方式,也许将它们全部放在一个事实表中会很好。

在 SSAS 中如何使用 Dim 和 Fact 之间的关系对多维数据集进行建模不一定必须与关系数据库中的表相互关联的方式相同。

【讨论】:

在我的立方体模型中,所有的事实都会与所有的暗淡有规律的关系。所以在我当前的关系数据库模式中,我为每个相关的事实表创建一个视图,并加入主表以获取这些外键。我直接在我的 SSAS DSV 中绑定这些视图。我关心的是性能,包括多维数据集进程和 ETL。在 ETL 期间将所有这些键放入所有相关表中是否明智。我做了一些简单的测试,结果显示差别不大。【参考方案3】:

如果性能是您的目标并且空间不是问题,并且您将在不参考父表的情况下从子事实表进行报告,那么当然,将 FK 添加到其他 FACT 表中,不会丢失任何内容,并且可能会获得一些速度。

但是,如果您在查询相关表时始终包含父事实表,那么没有意义(因为您总是在进行连接并产生这样做的成本)

【讨论】:

以上是关于我应该将所有外键从主事实表复制到其他相关表吗?的主要内容,如果未能解决你的问题,请参考以下文章

事实表中的外键

我可以有一个描述性属性很少的事实表吗

我需要定义事实表或维度表吗?

PHP Laravel 根据投票表的外键从问题表中获取所有问题

OLAP:为啥事实表和维度表之间的所有外键都应该是代理键?

我应该将类似的业务流程合并到一个事实表中吗?