如何在 RedShift 中实施参照完整性?
How to enforce referential integrity in RedShift?
RedShift 不支持强制执行任何约束。假设我有以下设置:
Movie(mID, title)
Rating(rID, mID, comment)
没有电影相关联的评级没有意义。但是 RedShift 不支持强制执行任何约束!
假设我有一个损坏的数据库系统,其中包含评级并且没有附加电影。应该如何处理?
例如:定期清理是否很常见?
Redshift 在设计上不支持约束。
在 Redshift 的典型用例中,即 BI / Analytics,数据将在对最终用户(分析师或仪表板应用程序)可见之前进行清理。 清理步骤是数据管道的重要组成部分。这种清理可以在数据加载到数据库之前进行,一种传统的 ETL 方法,或者在数据加载到数据库之后进行清理,一种更新的 ELT 方法[=33] =],或者清理可以在数据加载之前和之后发生 (我想你会称之为 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;
或者,创建清理后的 table 一次,然后逐步填充它。
-- 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;
RedShift 不支持强制执行任何约束。假设我有以下设置:
Movie(mID, title)
Rating(rID, mID, comment)
没有电影相关联的评级没有意义。但是 RedShift 不支持强制执行任何约束!
假设我有一个损坏的数据库系统,其中包含评级并且没有附加电影。应该如何处理?
例如:定期清理是否很常见?
Redshift 在设计上不支持约束。
在 Redshift 的典型用例中,即 BI / Analytics,数据将在对最终用户(分析师或仪表板应用程序)可见之前进行清理。 清理步骤是数据管道的重要组成部分。这种清理可以在数据加载到数据库之前进行,一种传统的 ETL 方法,或者在数据加载到数据库之后进行清理,一种更新的 ELT 方法[=33] =],或者清理可以在数据加载之前和之后发生 (我想你会称之为 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;
或者,创建清理后的 table 一次,然后逐步填充它。
-- 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;