Redshift 中如何保持参照完整性?

Posted

技术标签:

【中文标题】Redshift 中如何保持参照完整性?【英文标题】:How is referential integrity maintained in redshift? 【发布时间】:2016-03-06 23:21:39 【问题描述】:

RedShift 不支持任何约束。它们不支持强制约束,例如引用约束。它们只有信息限制。

如何在 RedShift 中维护参照完整性?我们是否必须手动放置一堆触发器?

【问题讨论】:

【参考方案1】:

您必须承担检查 ETL 中约束的负担,并权衡给定约束的重要性。

在“经典”数据仓库场景中,数据主要来自传统的基于行的数据库,其中强制执行数据完整性。在这种情况下,Redshift 被用于提供速度和/或规模,而约束检查不是优先事项。

在“现代”数据湖场景中,数据大多来自非关系来源,并且通常具有“至少一次”交付特征,例如,预计会有一定数量的重复。

在我的 Redshift 每小时加载 ETL 中,我执行以下操作(每天添加 1 亿行或更多行):

合并表:(几百万到几亿行) 执行合并 分析表(每个表需要 2-10 秒)ANALYZE merge_table; 验证PK:SELECT COUNT(*) - COUNT(DISTINCT pk_col) FROM merge_table; 每张桌子 2-10 秒的速度惊人地快。 仅附加表:(数十亿行) 执行追加 不分析(太慢,没必要) 仅在新数据范围内验证 PK:SELECT COUNT(*) - COUNT(DISTINCT pk_col) FROM merge_table WHERE timestamp_col >= new_data_start_timestamp; 请注意,您希望将 timestamp_col 定义为 SORTKEY。 只要使用排序键,应该只需要几秒钟。

【讨论】:

哇——很好的插图。如果我们正在消化大量数据,那么检查约束将是不可扩展的,这是有道理的【参考方案2】:

触发器是一个选项,但 Redshift 也不支持它们。假设您将 Redshift 用于数据仓库功能,您的 ETL 流程将有责任确保数据保持引用完整性。

【讨论】:

人们如何在现实世界中做到这一点?如果存在参照完整性问题怎么办?他们只是定期清理吗? (我相信这些被称为真空吸尘器) 在现实世界中?我不知道我还在评估产品。真空与外键无关。你可以有一个无效的外键,而真空不会在意。真空更多的是与性能有关,而不是数据完整性。所以我假设您打算将 Redshift 用于数据仓库,而数据进入的唯一方式是通过 ETL 流程?

以上是关于Redshift 中如何保持参照完整性?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Perl,如何在保持参照完整性的同时从单个表加载多个表?

是否可以同时拥有外键约束和保持参照完整性的触发器?

如何通过关系代数表达参照完整性约束?

如何在 Postgres 8.2 中禁用参照完整性?

数据库主外键

数据库主外键