数据仓库图解交互式教材
数据建模Grain:一行究竟代表什么?
学习进度0 / 64
EN
首页课程学习Grain:一行究竟代表什么?
2-2数据建模12 分钟

Grain:一行究竟代表什么?

同一份贷款合同可以拆出借据和还款记录;先说清一行代表什么,金额才有正确的落点。

Grain粒度Join
核心概念

Grain(粒度)

Grain 是对“一行究竟代表什么”的明确声明。它决定一行的 identity、金额字段能否直接计算,以及这张表可以或不能回答哪些问题。

一份合同,为什么会长出多行?

合同 C001 的约定金额是 100 万,但合同下可以有多笔实际放款。下面这个最小例子里,C001 对应借据 N001(30 万)和 N002(20 万);N001 又发生了 R001(5 万)和 R002(3 万),N002 发生了 R003(2 万)。

这些记录都属于同一条贷款链,却分别描述合同、实际放款和实际还款。把它们放进同一张表并不等于它们拥有同一个 Grain。

  • 合同 C001:1 份,合同约定金额 100 万。
  • 借据 N001、N002:2 笔,实际放款本金合计 50 万。
  • 还款 R001、R002、R003:3 笔,实际还款合计 10 万。
Grain 实验 · 一行的身份

切换 Grain,重新读一遍这张表

选择合同、借据或还款 Grain,查看当前一行、identity / 主键、行数、匹配金额,以及它能否回答某个问题。

正在加载交互实验…

Grain 错了,Join 会把指标放大

如果把合同 C001 的 100 万 Join 到 N001 和 N002,再直接 SUM(contract_amount),一份合同就被算了两次。问题不在 SUM 函数,而在合同金额被带到了借据 Grain。

看到 Join 结果后,要先问“当前一行是什么”,再决定金额是否可以在这里计算。需要合同金额时,先回到 contract_id 唯一的合同 Grain,或明确只保留一次。