多值维度设计

在数仓建设过程中可能会遇到事实表中的一行对应维度表中多行的情况,产生多值维度,例如一个订单由多名销售人员共同完成。就此问题说一下我的设计思路

思路1:在事实表中增加多个字段来标记同一个订单的同种维度值

866791f20e09c0f0763ccefc5b1d99c1d3d.jpg

适用场景

适用于固定销售人员数量的场景

优点:

好维护,结构清晰,易理解

缺点:

只适合固定数目的场景,如果是不固定数目的销售人员,在事实表中就不知道要建立多少个销售人员的字段,且及时设置了最多的销售人员个数,就可能会造成很多字段的稀疏;

使用不方便,若希望得到某个销售人员的订单数,得遍历所有此类字段;

思路2:建立桥接表

方法1

3ff94ac66f0b2fee93ea1367d10a53ca134.jpg

方法2

40adf9e005bc3a838b79942caca744749b1.jpg

group桥接表中存放每个订单的销售人员,每个订单对应一个销售组;percent是分配因子,用于分配每个销售人员的贡献度(可以避免多重计算);方法1中primary_saleman_id放在group中,在事实表与桥接表不使用分配因子进行连接的情况下回引起多重计算,因此需要先对group表进行预处理,而在方法2中,primary_saleman_id放在order中,可以直接将order和saleman做关联,不会引起多重计算。

优点:

灵活简化了生成报表的难度

借分配因子避免了多重计算;

缺点:

桥接表的维护比较复杂,当出现一个新组合时,得先判断桥接表中是否已存在;

缓慢变化维的影响

对思路1的处理办法按照常规方式处理即可,对思路2进行处理时,一旦saleman变化的属性需要插入新记录时,该销售人员若有新的订单,就需要在group中新增一条记录。

 

 

 

 

转载于:https://my.oschina.net/u/4010291/blog/3056255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值