如何在RedShift中强制引用完整性?

时间:2016-04-02 17:50:39

标签: sql amazon-redshift

RedShift不支持强制执行任何约束。假设我有以下设置:

  

电影(mID,标题)

     

评级(rID,mID,评论)

评分没有与评级相关联的电影是没有意义的。但RedShift并不支持强制执行任何约束!

假设我的数据库系统已经损坏,并且没有附加电影。应该如何处理?

例如:定期清理是否常见?

1 个答案:

答案 0 :(得分:2)

Redshift不支持设计约束。

在Redshift的典型用例中,即BI / Analytics,数据将在最终用户(分析师或仪表板应用程序)可见之前进行清理。 清理步骤是数据管道的重要组成部分。这种清理可以在数据加载到数据库之前发生,传统的ETL方法,或者在加载到数据库后清理,更新的ELT方法,或清理起来可以发生在&加载数据后(我猜你称之为ETLT,虽然那是“满口”)

清理通常在数据加载时完成,但是如果数据加载频繁(例如近实时点击流),则清理和清除数据。聚合查询通常是定期的&比数据加载频率低,因此分析师和仪表板可以更新一些实时指标,而其他人每小时刷新一次。

对于这个特殊情况

您可以告诉所有分析师在每个查询中使用INNER JOIN或添加Rating.mID IS NOT NULL。这是最快的方法。

或者您可以定期运行此脚本以仅将已清理的数据公开给最终用户。

DROP TABLE IF EXISTS RatingCleaned;
CREATE TABLE RatingCleanded AS 
SELECT * 
FROM Rating 
WHERE mID IS NOT NULL;

或者,创建一次清理过的表,然后逐步填充它。

-- create once
CREATE TABLE RatingCleanded AS 
SELECT * 
FROM Rating 
WHERE mID IS NOT NULL;

-- populate incrementally
INSERT INTO RatingCleaned
SELECT Rating.*
FROM Rating
LEFT JOIN RatingCleaned ON Rating.rID = RatingCleaned.rID
WHERE RatingCleaned.rID IS NULL
  AND Rating.mID IS NOT NULL;