维度建模:销售订单粒度事实表主键重复问题及方案咨询
方案合理性分析与建议
你的方案是合理的,但需要先明确这张新表的定位——它不是维度表,而是用来关联销售订单和发票编号的关联桥接表,专门解决一个订单对应多张发票的一对多关联问题,完全符合数据仓库的设计逻辑。
为什么不能直接在原事实表加发票编号
原事实表是销售订单粒度,每个订单对应唯一一行记录,包含订单金额、下单时间等订单级度量值。如果直接把发票编号加进去,一个订单会被拆成多行(对应多张发票),不仅会导致订单主键重复,更严重的是会让订单金额这类度量值被重复统计,完全破坏了原事实表的粒度和数据准确性,所以拆分是正确的选择。
关于“维度表行数多于事实表”的担忧
首先你的新表不是维度表,维度表是用来描述实体属性的(比如发票维度表会包含发票日期、开票金额、开票方等属性)。退一步说,就算是维度表行数多于事实表也不是问题:比如发票维度表的行数本来就应该比订单事实表多(因为一个订单对应多张发票),只要维度表的主键是唯一的(比如用发票编号作为主键),关联逻辑清晰,就不会有任何问题。维度表的行数多少不影响数据仓库的正常运行,核心是主键唯一、属性描述准确。
优化建议
- 如果业务还需要展示发票的其他属性(比如开票日期、发票金额),建议单独建一张发票维度表,以发票编号作为主键,存储发票的各类属性;
- 原订单事实表保持订单粒度不变,查询时通过销售订单ID关联到你创建的订单-发票关联表,再关联到发票维度表,就能完整获取所有发票信息,同时保证订单级度量值的统计准确性。
内容的提问来源于stack exchange,提问作者M R
相关产品推荐
相关产品推荐

