题目重点:建立订单、菜品、菜单和司机事实关系,保留成交时价格与季节菜单。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 订单一行主记录,order_item一行购买条目;餐厅可多menu,menu随季节与日期有效。营收分析用成交快照,不拿当前菜单价改历史。
解题路线
- dim_user/restaurant/item、fct_order和fct_order_item,order→items一对多。item维度的身份与menu里的价格/可售状态分开,menu_item桥关联menuVersion、item及effectiveFrom/To。
- order_item保存成交quantity/unitPrice/discount/netAmount,引用成交menuVersion。总单额与逐item金额需有配送费/税/整单优惠分摊口径,不可让SUM(items)直接等于未定义order total。
- 多季节菜单用有效时间版本,订单引用版本不因菜品下架丢失。相同item跨menu可复用商品身份,不能用itemName做主键。
- driver traffic为独立driver/time/location事件,不直接join所有order_item。若估配送或分析服务效率,通过delivery/order桥确定归属,避免一司机多单一单多菜造成笛卡尔写放大。
- market share需要外部市场分母定义与可获得数据,仅本站订单不能证明全行业份额;内部平台占比可明确命名。
手动走一遍
冬季menu v1汤价10,夏季v2价12,旧order_item仍记录10及v1;同订单两菜和一次配送费,items join后order.total重复两次不能SUM。
规模与取舍
明细规模约orders×平均条目数,菜单SCD规模按变更数。查询先按正确粒度聚合再join,可减少放大与扫描;司机高频位置事件需单独分区保留政策。
易错点与追问
容易失分的边界
- 当前菜单价回填历史会改变已发生收入。
- order总额在明细join后重复聚合。
继续深挖
- 整单优惠如何分摊到item并保证分项和与总额一致?
- 季节日期重叠两个有效menu时,优先级与成交快照应怎样定?
