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

Gar*_*ett 7 sql-server database-design data-warehouse

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

更新:对于那些感兴趣的人,我遇到了一个民意调查问同样的问题.

Dam*_*vic 14

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

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

  • 在加载期间,删除索引和约束以加速加载过程,ETL应用程序强制执行数据完整性.

  • 加载表后,DW基本上是只读的 - 约束不会在读取时触发.

  • 加载后重新构建所有必需的索引.

  • 在DW中删除是一个受控制的过程.在从维度中删除行之前,会查询事实表以查找要删除的行的键 - 只有在任何事实表中不存在这些键时才允许删除.

为了以防万一,通常会定期运行查询以检测事实表中的孤立记录.

  • 不确定我是否应该添加到这里或类似的问题但是...如果完整性是一个问题,你总是可以正确的完整性函数或存储过程来寻找"孤立的"事实.(外键没有意义的行).然后,您可以在数据库的下一个加载循环之后/期间/之前清理它们. (2认同)

Cad*_*oux 8

我们使用它们,我们对此感到满意.

在数据仓库(关系)中使用外键是一种好习惯吗?

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

拥有约束可以捕获ETL错误和建模缺陷.