第 15 部分. Gold 层:业务实体与 grain(粒度)
Gold 层是数据产品层。在这里,下游消费者看到的是稳定的指标集市(mart),而不是中间计算。因此,gold 的起点是 grain(粒度)和契约,而不是随手写的 select。
使 Gold 模型就绪的条件
Gold 模型在以下情况下视为就绪:
- 它有明确命名的消费者;
- grain(粒度)已记录并经过验证;
- 必填字段与契约绑定;
- PII 策略已应用;
- 校验事实覆盖了关键风险;
- 评审者报告将事实与假设区分开。
对于 mart_customer_360,消费者是客户与组合分析;对于 mart_payment_risk_signals,消费者是风险信号监控;对于 mart_open_api_consents,消费者是同意状态管控。这些消费者不应偶然拿到相同的 grain。
作为防御手段的 Grain(粒度)
Grain 回答的是「一行代表什么」这个问题。一旦答案发生变化,这就不再是表面问题,而是数据 API 的变更。
示例:
- 每个
customer_id一行; - 每个
transaction_id一行; - 每个
scope一行; - 每天每个渠道一行。
如果 mart 名为 customer_360,但每个客户包含多行,那么这个名称就在欺骗消费者。
Gold 层验收事实
- grain 的主键通过
not_null校验; - 如果 grain 假设每个键对应一行,则 grain 的主键需通过
unique校验; - 必填指标通过
not_null校验; - 不包含直接的 PII;
- 契约字段齐全;
- lineage(血缘)可通过 dbt 图或评审者备注读取。
Qwen 查询
阅读 specs/models 和 models/marts。
针对每个 mart,明确 grain、主要校验事实、PII 策略以及对契约的影响。
找出那些 grain 未被测试或评审者手工事实证明的 mart。
不要修改文件。
最低产出
请编制 gold 层的清单:
# Gold 层清单
## mart_customer_360
消费者:
粒度:
必填字段:
PII 策略:
校验事实:
为读者解析
Gold 层是工程工作转变为公开承诺的时刻。在那之前,可以讨论中间实体、规范化和准备工作。到了 gold 层,消费者登场:分析师、风险团队、报表、同意状态监控。因此,这里任何含糊的代价都会更高。如果 grain 没有记录,消费者会自行脑补。如果 PII 策略未经校验,多余的列可能流入报表。如果必填指标未被测试覆盖,指标集市只是看起来准备好了。
Gold 模型应当是窄的。这听起来奇怪,因为我们总想让指标集市更「丰富」:增加产品、渠道、分群、最近一次操作、风险标志、信用阶段。但每一次扩展都会改变这张表回答的问题。Customer 360 可能是客户维度切片,也可能不知不觉地变成客户×产品维度集市。名称不变,含义已变。
正因如此,把公开承诺写成一行是很有用的。如果这句话没法在不使用顿号和例外的情况下表达出来,说明这个 gold 模型太宽。「每个客户一行,用于组合分析且不含直接 PII」是一个好的框定。「包含账户、支付、风险以及一切可能需要的字段的客户集市」则是在邀请漂移。
Gold 层的评审应当比 staging 评审更严格。staging 评审可以讨论技术层面的规范化;而 gold 评审则必须追问消费者、契约、SLA、PII、grain 与证据。如果评审者无法理解这张 mart 是向谁承诺的、将被如何使用,那么即便它放在 models/marts/ 下,也还不算 gold。
实践
请针对 README 中的每个 mart,用一行写出其公开承诺。如果承诺中没有消费者与 grain,则该 mart 仍不能视为 gold 数据产品。
常见错误
把 models/marts/ 中的任何一张表都叫作 gold 层。Gold 不是一个目录,而是通过对消费者做出的、由规范、契约和校验支撑的承诺。
检验问题
- 为什么 grain 是公开契约的一部分?
- 对于客户维度的 mart 需要哪些测试?
- nullable 字段何时仍可能构成破坏性变更?