NovaRetail 业务模型与指标
七个域怎样连起来
| 域 | 典型对象(建议) | 关联 | 最容易答错的问题 |
|---|---|---|---|
| Sales | 订单、明细、付款、退款 | 商品、客户、门店、活动 | 按订单还是明细计数,退款如何扣减 |
| Product | SKU、品牌、品类、商品 | 销售、库存、营销 | 苹果是品牌还是水果,历史品类归属 |
| Customer | 客户、会员等级历史、标签桥表 | 订单、活动 | 新客按注册还是首次支付,多标签重复 |
| Store | 门店、城市、区域 | 销售、库存 | 当前门店归属还是交易时归属 |
| Inventory | 仓库、流水、日快照 | SKU、门店 | 期末库存与时间累加的区别 |
| Finance | 收入、成本、费用 | 销售、商品 | 毛利率、税、结算与销售时间 |
| Marketing | 活动、渠道、优惠券、关联表 | 订单、客户 | 一个订单多个活动的归因重复 |
表名是教学建议;完整 50~80 张表和每列定义由 V0-S02 交付。不要把这张概要表当作完整数据字典。
一行代表什么,比表名更重要
fact_order 一行一张订单;fact_order_item 一行一个订单中的一项 SKU;fact_refund_item 一行一次退款中的一项明细。一个订单可以有两条商品明细和三次退款事件。
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”决定;敏感样例值也不能先送给模型再试图隐藏最终结果。
继续阅读 贯穿案例,看这些定义如何进入问数链路。