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

Lie*_*oen 12 database data-warehouse

我认为问题很清楚.我的datawarehouse表中的某些列可能与主键有关系.但这是好的做法吗?它是非规范化的,所以永远不要再删除它(datawarehouse中的数据).希望问题有点清楚.

Dam*_*vic 10

我假设您在事实表中引用FK.在DW加载期间,将删除索引和任何外键以加速加载 - ETL过程负责处理密钥.

外键约束在插入和更新期间"激活"(这是在需要检查父表中是否存在键值时)以及在删除父表中的主键期间.它在读取过程中不起作用.删除DW中的记录(应该)是一个受控进程,它在从维度表中删除之前扫描任何现有关系.

因此,大多数DW没有将外键实现为约束.


Cad*_*oux 9

FK约束在SQL Server上的Kimball维模型中运行良好.

通常,您的ETL需要查找维度表(通常在业务键上以处理缓慢变化的维度)以确定维度代理ID,而维度代理ID通常是标识,维度上的PK通常是维度代理id,已经是一个索引(可能是聚集的).

此时使用RI并不是写入的大量开销,因为它还可以帮助在开发期间捕获ETL缺陷.此外,将事实表的PK作为所有FK的组合也可以帮助捕获潜在的数据建模问题和双重加载.

如果您想制作星型模型的通用平面视图或表值函数,它实际上可以减少选择的开销.因为维度的额外内部连接保证只生成一行,所以优化器可以非常有效地使用这些约束来消除查找表的需要.如果没有FK约束,可能必须执行这些查找以消除维度不存在的事实.


pet*_*hen 6

问题很清楚,但"良好做法"似乎是错误的问题.

" 可以有FK"吗?

外键是在数据库修改期间保留完整性约束的机制.

如果您的DW是只读的(累积数据源而不回写),则不需要FK.

如果您的DW支持写入,则ETL通常需要在参与的数据源之间协调完整性保护(而不是它的Store等效项).此过程可能依赖于也可能不依赖于数据库中的FK.

所以正确的问题是:你需要它们吗?

(我能想到的另一个原因是关系文档 - 但是,这也可以在纸上/单独的文档中完成.)

  • 某些数据库在星型或雪花结构数据仓库的位置具有特定的优化.在这些情况下,即使在只读情况下,外键也可用于警告仓库星形结构 - 告诉它哪些是事实和尺寸.即使在规范化的数据库中,外键也会影响优化器.我现在正在努力确定这个问题的时间和程度,但它肯定会产生一些影响. (2认同)
  • 是的,只读意味着“强制”约束是不必要的——如果您的仓库是强制约束数据库的快照。但约束允许 DBMS 优化查询。所以“不需要”是错误的。像往常一样,这是一个权衡。 (2认同)

Bil*_*ton 5

在DW中使用FK约束就像戴着自行车头盔。如果ETL设计正确,从技术上讲您就不需要它们。就是说,如果我每次看到无错误的ETL时都拥有一百万美元,那么我将获得零美元。

直到您遇到FK约束导致性能问题的时候,我才说“离开”。清理引用完整性问题可能比从一开始就添加它们困难得多;-)


Dav*_*her 4

我不知道。但没有人回答,所以我用谷歌搜索并找到了一篇最佳实践论文,其中似乎说非常有帮助的“这取决于”:-)

虽然外键约束有助于数据完整性,但它们对所有插入、更新和删除语句都有相关成本。当您希望确保数据完整性和验证时,请特别注意仓库或 ODS 中约束的使用