【发布时间】:2022-01-18 05:24:41
【问题描述】:
目标
我们正在尝试制作便于任何人使用的事实和维度表。许多现代 BI 系统促进探索和实验,我们希望所有技能水平的人都能取得成功。
问题
我们的数据有大量 NULLable 外键 ID。这会导致几乎每个数据库中出现意外行为。在Snowflake(我们的数据仓库)中,JOINing on NULL 会导致CROSS JOIN,这非常非常糟糕。
可能的方法
每个JOIN都需要格外小心
这可以通过两种方式完成,但它们都很容易搞砸或错过......
- 在
JOINs 中使用COALESCE(nullable, '--SOMETHING_INVALID--') - 在
JOINs 的ON子句中检查NULL
将NULL id 替换为默认值
如果我们默认使用有效的东西,这将以未知的方式扭曲报告。如果我们默认某些无效的东西,我们将以第二种且难以追踪的方式破坏参照完整性。
SELECT
customer_id,
-- Some default "id" that wont cause a collision
COALESCE(location_id, '9999999999') AS location_id,
...
FROM
crm.customers
将所有 NULL 值添加到每个表中
这有点笨拙,但是...JOINs 将始终有效。
问题
所有这些都有缺点。
- 有没有更好/更清洁的东西?
- dbt 是否有工具或实用程序可以提供帮助?
【问题讨论】:
-
维度表中是否也有空 id?
-
是的,维度中可能有六个可以为空的 ID。例如,客户可能有一个空 location_id 和一个空 customer_category_id
-
如果感兴趣的键都是整数,出于可追溯性的原因,我会将空值保留在事实表中,但会将维度表中的空值归入负整数(-999 或其他值)。如果这更容易实现,反之亦然。您必须通过一些在流程上游应用的逻辑来确保事实表中的 id 只能是正整数。
标签: sql snowflake-cloud-data-platform data-modeling dbt data-integration