Skip to content

NovaRetail 业务模型与指标

七个域怎样连起来

典型对象(建议)关联最容易答错的问题
Sales订单、明细、付款、退款商品、客户、门店、活动按订单还是明细计数,退款如何扣减
ProductSKU、品牌、品类、商品销售、库存、营销苹果是品牌还是水果,历史品类归属
Customer客户、会员等级历史、标签桥表订单、活动新客按注册还是首次支付,多标签重复
Store门店、城市、区域销售、库存当前门店归属还是交易时归属
Inventory仓库、流水、日快照SKU、门店期末库存与时间累加的区别
Finance收入、成本、费用销售、商品毛利率、税、结算与销售时间
Marketing活动、渠道、优惠券、关联表订单、客户一个订单多个活动的归因重复

表名是教学建议;完整 50~80 张表和每列定义由 V0-S02 交付。不要把这张概要表当作完整数据字典。

一行代表什么,比表名更重要

fact_order 一行一张订单;fact_order_item 一行一个订单中的一项 SKU;fact_refund_item 一行一次退款中的一项明细。一个订单可以有两条商品明细和三次退款事件。

text
dim_region ← dim_city ← dim_store ← fact_order ← fact_order_item

                                                   dim_product

fact_order_item ← fact_refund_item(一个明细可有多次退款)

箭头表示事实向维度或父实体的关联方向示意,具体基数以 V0 关系字典为准。

若订单有两条明细总额 300 元,又有三条支付记录,直接把订单、明细、支付连接后求 SUM(item_amount),明细可能出现三次,得到 900 元。键都正确,SQL 也能运行,结果仍然错。

正确方式需按业务目的选择:只检查是否支付时用存在性条件;需要支付金额时先按订单聚合支付,再与订单级汇总连接。不能用 SUM(DISTINCT amount) 修补,因为两条真实明细可能恰好同价。

指标定义需要的字段

指标必须澄清反例
销售额 / net_sales支付或下单时间、税费、优惠、退款归属、测试单同名“营收”在财务与销售含义不同
订单量有效状态、取消订单、去重键用明细行数代替订单数
客单价销售额口径与分母订单范围一致用总收入除包含取消单的订单数
毛利率收入与成本期间一致、零收入策略平均每行毛利率
复购率首购窗口、观察窗口、客户去重将一单两件商品当复购
库存时点、地点、SKU 粒度把每日期末库存跨天相加

总纲给出的净销售额示例是 SUM(fact_order_item.net_amount),并要求 status='PAID'is_test=false。它没有完整定义退款生命周期或时间归属。因此本书不自行把它宣布为最终财务口径;V0 先评审,V3 发布成版本化规则。

时间与历史必须显式

一次查询至少记录业务时区、now、数据截至时间、日期角色、开闭区间和比较窗口。半年同比可用 [2026-01-01, 2026-07-01)[2025-01-01, 2025-07-01);“今年”若在 9 月提问,通常需要澄清或显示年初至截止日,不能默认比较全年与未完年度。

遇到闰日、财年、门店跨区域和会员等级变更,必须先选择业务规则,再生成 SQL。历史维度是否使用 SCD2、事实保存哪个代理键,列入 V0 设计决策。

权限也是业务模型

华东经理可见哪些店,财务可见哪些成本列,必须映射到可信身份属性、行约束和列授权。权限不应由用户在问题里声称“我是 CEO”决定;敏感样例值也不能先送给模型再试图隐藏最终结果。

继续阅读 贯穿案例,看这些定义如何进入问数链路。

需求 → 代码 → 验证 → 复盘