Teradata 如何处理外键?

How well does Teradata deal with Foreign Keys?

我正在开始一个新项目,其中一项要求是使用 Teradata。我精通许多不同的数据库系统,但 Teradata 对我来说还很陌生。

在客户端,他们根据 "a consultant" 的建议从他们的数据库中删除了所有外键。

我的每一部分都在畏缩。

我正在使用一个新的数据库实例,所以我不受他们在其他数据库上所做的事情的限制。我没有被明确告知不要使用外键,而且我与客户的关系是这样的,他们至少会听我说完。但是,我的决定和案例应该是见多识广的。

基于 Teradata 的设计、性能、副作用等,我不应该在 Teradata 中使用 FK 来维护参照完整性是否有任何内在的技术原因...

请注意,我正在使用 .Net Data Provider v16 访问 Teradata,它最多只支持 EF5。

假设新项目正在实施数据仓库,原因很简单(这适用于任何 DWH,不仅是 Teradata):DWH 与 OLTP 系统不同。

当然,您在逻辑数据模型中仍然有主键和外键,但可能没有在物理模型中实现(尽管 Teradata 支持它们)。有几个原因:

  • 数据通常分批加载到 DWH 中,并且 PK 和 FK 都必须在 Insert/Update/Delete 之前由加载过程验证。否则,您加载 1,000,000 行,并且有一行不符合约束条件。现在你得到了一个回滚和一条错误消息,并尝试找到坏数据,祝你好运。但是,当所有验证都已在加载期间完成时,没有理由在数据库中第二次执行相同的检查。
  • DWH 中的一些 tables 将缓慢改变尺寸,并且无法在该 usibg 标准 SQL 语法上定义 PK/FK,您需要类似 TableA.column 在 TableB.ValidFrom 和 TableB.ValidTo 之间引用了 TableB.column 和 TableA.Timestamp(创建 Temporal Table 时是可能的)
  • 有时 table 会从头开始重新创建或重新加载,如果有 FK 引用它则很难做到。
  • 一些 PK 从未用于任何 access/join,所以为什么要物理地实现它们,这只是 CPU/IO/storage 中的巨大开销。

关于PK/FK的知识对于优化器来说很重要,所以就有了所谓的Soft Foreign KeyREFERENCES WITH NO CHECK OPTION),这是一种dummy:在优化期间应用,但实际上从未被 DBMS 检查(这就像告诉优化器 相信我,它是正确的)。