第 14 部分。Silver 层:客户、账户、卡片、支付
Silver 层创建稳定的中间实体。这不是面向消费者的最终数据集市,但也不再是原始数据源。Silver 必须是可复用的:Customer 360、风险数据集市和信用数据集市可以读取相同的中间模型,而无需复制逻辑。
Silver 层包含什么
在教学示例中,Silver 由 intermediate 模型表示:
int_customer_balances;int_customer_card_activity。
它们将账户和卡片交易聚合到客户级别的信号,然后由 mart_customer_360 使用。
Silver 层规则
- 不在超出必要范围之外暴露直接 PII;
- 保持清晰的粒度;
- 不混合不相关的领域;
- 如果模型是可复用的,则不做产品决策;
- 使用
ref(),以便在 dbt 中读取血缘关系。
如果 int_customer_card_activity 计算 risk_event_count_7d,规范必须解释什么是 7 天以及风险标志从何而来。如果没有这一点,模型看起来像 SQL,但不是一个稳定的数据资产。
验收事实
对于 Silver 层:
- 输入模型只能通过
ref()读取;
- 客户级别的模型每个
customer_id有一行; - 金额不会无故变为 null;
- 风险计数器有清晰的窗口;
- PII 不会在没有策略的情况下泄漏到可复用层。
Qwen 查询
Сравни intermediate-модели со спецификациями и требованиями mart.
Покажи grain каждой intermediate-модели, входные `ref()`, переиспользуемые поля
и разрывы проверки.
Файлы не меняй.
最小输出
构建一个表格:
| 模型 | 粒度 | 输入 | 使用于 | 验证差距 |
|---|---|---|---|---|
| int_customer_balances | customer_id | stg_accounts | mart_customer_360 | |
| int_customer_card_activity | customer_id | stg_card_transactions | mart_customer_360 |
空的验证差距表示模型有足够的描述和可验证性。
读者解析
Silver 层往往成为项目要么成熟、要么陷入随机变换的地方。在这里,源数据已被转换为清晰的类型,但尚未成为产品。因此,会出现「略微改进」数据的诱惑:将客户与账户连接起来,删除奇怪的行,重命名风险,计算方便的指标。如果这些决策没有被记录下来,
silver 就变成了一个隐藏的业务层。
一个好的 Silver 层构建稳定的实体:客户、账户、交易、信贷、同意书。它消除了技术上的混乱,但并不赋予自己改变产品承诺的权利。例如,可以将 customer_id 统一为一个名称,并为进一步的聚合准备余额。在没有规范的情况下,不能决定客户仅在余额为正时才被视为活跃,因为这会影响消费者。
Silver 还作为一层复用层非常有用。如果每个 gold 数据集市都自己清理客户和账户,分歧将不可避免地出现。一个数据集市会以不同方式处理 null,另一个会不同地过滤已关闭的账户,第三个会不同地计算逾期。共享的 Silver 层使这些决策可见并减少重复,但前提是它本身保持清晰和可验证。
读者不应以模型数量来衡量 Silver。有时一个精心设计的 intermediate 模型比三个名字漂亮但混乱的层更好。标准很简单:该层是否有助于表达可重复的实体并证明其质量?如果答案是否定的,那么该模型很可能是为了架构对称性而创建的,而不是为了读者或数据消费者。
实践
为示例中的两个 intermediate 模型构建粒度/输入/使用于的表格。 如果模型有多个用途,请在更改 SQL 之前用文字描述区分用途。
常见错误
将 Silver 变成「方便 CTE 的垃圾场」。如果模型无法用一个粒度和一个用途来描述,那么它就太宽泛了。
自检问题
- 为什么 Silver 不应该绑定到单一产品?
- 哪些 staging 的字段在没有任何策略的情况下不能向下传递?
ref()如何帮助审查者?