如何在 RedShift 中强制执行参照完整性?

Posted

技术标签:

【中文标题】如何在 RedShift 中强制执行参照完整性?【英文标题】:How to enforce referential integrity in RedShift? 【发布时间】:2016-04-02 17:50:39 【问题描述】:

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

电影(mID,标题)

评分(rID、mID、评论)

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

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

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

【问题讨论】:

我想说,与其清理,不如检测并修复错误。 我同意,但这是假设情况 - 如果初级开发人员加入我们的团队可能会发生这种情况。这也很有可能发生。 这也极有可能。我很惊讶我在网上找不到快速答案 【参考方案1】:

Redshift 不支持设计约束。

在 Redshift 的典型用例(即 BI/分析)中,数据会在最终用户(分析师或仪表板应用)可见之前进行清理。 清理步骤是数据管道的重要组成部分。这种清理可以在数据加载到数据库之前进行,传统的 ETL 方法,或者在加载到数据库之后进行清理,更新的 ELT 方法,或者清理up 可以在加载数据之前和之后发生

清理通常在加载数据时完成,但是随着数据加载更频繁(例如,接近实时的点击流),清理和聚合查询通常是周期性的且频率低于数据加载,因此分析师和仪表板可以更新一些实时指标,而另一些则每小时刷新一次。

对于这种特殊情况

您可以告诉所有分析师使用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;

【讨论】:

嘿 Haleemur:这个答案太好了。谢谢你让我知道!对我来说很奇怪,我们必须定期进行清理 - 但我想我是该地区的新手。

以上是关于如何在 RedShift 中强制执行参照完整性?的主要内容,如果未能解决你的问题,请参考以下文章

如何克服 Netezza 缺乏唯一约束/参照完整性执行的问题?

访问 SQL 以创建一对多关系而不强制参照完整性

使用 Amazon Redshift 进行维度建模是不是可行

如何在我的数据库中强制执行数据完整性规则?

SQLite 是不是支持参照完整性?

需要 Where 子句中的属性 (Redshift)