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

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

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

【问题讨论】:

    标签: sql amazon-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 流程?
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2013-06-17
    • 2010-12-29
    • 2011-09-17
    相关资源
    最近更新 更多