实体:订单、商品、客户或事件
时间:发生、快照或累计窗口
键:唯一标识与组合键
例外:取消、退款、重开与补录
结论:先声明一行代表什么
订单表可能是一行一个订单,也可能是一行一个订单商品;库存表可能是流水,也可能是每日快照。名称相似但粒度不同,直接聚合或 Join 会重复计算。
每个模型都应有可读的粒度句,例如“每个门店、每个商品、每天一行的日终库存快照”。
粒度由实体、时间和键共同决定
只写主键不够。事件表的同一业务对象可能多次发生,快照表的同一对象在不同日期重复出现,累计表还包含窗口范围。
记录业务键、技术键、时间字段、去重规则,以及取消、退款、重开和补录如何表示。
Join 前先比较两侧基数
一对多连接后对“一”侧金额求和会放大结果;多对多连接更需要桥接表或预聚合。AI 生成查询时若看不到基数和允许路径,很容易选择技术上可执行但业务上错误的 Join。
为每条关系标注一对一、一对多或多对多、连接键、过滤条件和有效时间。
把粒度写进测试和语义
测试主键唯一、非空、重复比例、每日行数与 Join 前后行数。指标定义要写明计算粒度和可切分维度,避免在错误层级聚合。
BuildTable 的 AI 友好建模方向可以承载这些元数据;具体契约、测试和发布能力仍应在项目中确认。
用反例验收模型
准备一个订单多商品、部分退款、跨日状态变化和同客户多门店的样本,分别计算订单数、商品销量和收入。要求模型与人工结果一致。
验收不仅看 SQL 是否运行,还要看生成查询是否选择正确粒度、关系和去重方式,并能解释选择依据。
