在星型模式中,事实和维度之间的外键约束是不是必要?

Posted

技术标签:

【中文标题】在星型模式中,事实和维度之间的外键约束是不是必要?【英文标题】:In a star schema, are foreign key constraints between facts and dimensions neccessary?在星型模式中,事实和维度之间的外键约束是否必要? 【发布时间】:2010-05-12 13:54:43 【问题描述】:

我第一次接触数据仓库,我想知道事实和维度之间是否有必要使用外键约束。没有它们有什么主要的缺点吗?我目前正在使用关系星型模式。在传统应用程序中,我已经习惯了它们,但我开始怀疑在这种情况下是否需要它们。我目前在 SQL Server 2005 环境中工作。

更新:对于那些感兴趣的人,我遇到了poll 询问同样的问题。

【问题讨论】:

Is it good practice to have foreign keys in a datawarehouse (relationships)?的可能重复 【参考方案1】:

大多数数据仓库 (DW) 没有将外键实现为约束,因为:

通常,外键约束将触发:插入事实表、任何键更新以及从维度表中删除。

在加载过程中,索引和约束被删除以加速加载过程,数据完整性由 ETL 应用程序强制执行。

加载表后,DW 本质上是只读的——读取时不会触发约束。

加载后重新构建任何所需的索引。

在 DW 中删除是一个受控过程。在从维度中删除行之前,会查询事实表以获取要删除的行的键——仅当这些键在任何事实表中都不存在时才允许删除。

以防万一,定期运行查询以检测事实表中的孤立记录是很常见的。

【讨论】:

感谢 Damir 的精彩反馈。系统本质上是只读的这一事实让我开始质疑是否需要约束。 不确定我是否应该在此处添加或添加到类似的问题中,但是...如果完整性是一个问题,您始终可以对查找“孤立”事实的完整性函数或存储过程进行纠正。 (外键没有意义的行)。然后,您可以在数据库上的下一个加载周期之后/期间/之前清理它们。 "约束不会在读取时触发" 虽然在读取时不会发生约束失败的可能性,因为 FK RI 通常是使用索引实现/强制执行的,这可能会影响执行计划读取 - 像所有约束一样,优化器可能会使用任何约束来影响执行计划。 谢谢达米尔。您能否提供一个示例,说明 ETL 应用程序如何强制执行数据完整性?【参考方案2】:

我们使用它们,并且对此感到满意。

Is it good practice to have foreign keys in a datawarehouse (relationships)?

存在开销,但您始终可以在加载期间禁用约束,然后重新启用它。

设置约束可以发现 ETL 错误和建模缺陷。

【讨论】:

【参考方案3】:

我认为理论上,你需要它。但这取决于您如何将数据与数据库分开。如果它们都在同一个数据库中,外键可以帮助您,因为设置外键将帮助数据库根据索引更快地进行选择。如果您在多个数据库上共享表,则需要在应用程序级别进行检查

您可以让您的数据库为您检查它,但它可能会很慢。通常,在数据仓库中,我们不关心冗余或完整性。我们已经有很多数据了,一些完整性和冗余不会影响一般的聚合数据

【讨论】:

我基本同意。虽然我会说“拥有外键允许数据库选择正确的索引,因为它知道存在关系”。所以我认为你应该拥有它们,但我认为你不需要它们。 是的,正如我所说,我们应该拥有它们,因为它们具有更高的性能和完整性。但是如果我们必须摆脱它们,那就继续吧:) 我同意优化器可以利用约束(通常)来找到更好的解释计划。这就是你回答的结果。我不同意 FK 帮助优化器选择索引。您能否指出一个解释该机制如何工作的资源?或者描述一个优化器会在没有 FK 的情况下选择错误的索引但在 FK 就位的情况下选择正确的索引? explainextended.com/2009/10/15/…【参考方案4】:

我不知道是否有必要,但出于数据完整性的原因,我觉得它们很好。您要确保事实表始终指向维度表中的有效记录。即使您确定这会发生,为什么不让数据库为您验证需求?

【讨论】:

【参考方案5】:

在数据仓库中使用完整性约束的原因与在任何其他数据库中完全相同:保证数据的完整性。假设您和您的用户关心数据的准确性,那么您需要某种方法来确保数据保持不变并且正确应用业务规则。

【讨论】:

【参考方案6】:

据我所知,FK 可以加快查询速度。此外,许多 BI 解决方案在其集成层中利用它们。所以对我来说,它们是 DW 中的必备品。

【讨论】:

【参考方案7】:

希望这个话题仍然活跃。 我的想法是:对于具有许多维度和记录的大型事实表,外键会减慢插入和更新速度,从而使事实表变得太慢而无法加载,尤其是随着它的大小增加。索引用于在加载表后进行查询,因此可以在插入/更新期间禁用它们,然后重新构建。外键关系很重要,而不是外键本身:这实际上隐含在 ETL 过程中。我发现外键在现实世界的数据仓库中让事情变得太慢了。您需要使用 VIRTUAL 外键:关系是它们,但不是约束。如果您损坏了数据仓库中的外键关系,那么您就做错了。 如果您在插入期间禁用它们并且存在不匹配或孤儿,您将无法重新启用它们,那么重点是什么。 DW 的重点是快速访问和查询。外键使这成为不可能。 有趣的辩论:在网上很难找到这个问题 凯夫

【讨论】:

以上是关于在星型模式中,事实和维度之间的外键约束是不是必要?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 中的星型模式

关于数据仓库的基本问题

数据仓库星型模式事实表?你怎么知道里面有啥

维度建模(星型雪花星座)

[hive]维度模型分类:星型模型,雪花模型,星座模型|范式

维度表和星型模式是不是正确?