数仓随笔一:封装具有业务含义的字段并暴露
说明
本系列记录日常数仓中碰到的一些现象,用于个人总结。
现状
最近碰到了一个问题,属于典型的模型设计不合理,未考虑扩展性,有必有记录。
现状是这样的。
在公司业务上,当一套房子的付款达到20%,那么认为这套房子符合业绩考核。而是否符合业绩考核在公司的业务上是一个通用的逻辑。
于是在总部的数仓模型中,到处遍布着这样一个字段is_received_20_pct
是否付款达到20%。当为1的时候表示达到,为0的时候表示没达到。
问题
大部分场景下,这样是没有问题的,比如求业绩考核签约金额
1 | select sum(amt) from trd_sign where is_received_20_pct = 1 |
但是,个别项目的,回款10%就算业绩考核,于是,增加了is_received_10_pct
,sql就变成了
1 | select sum(amt) |
我们不妨想想,如果个别项目再增加逻辑呢,8%?16%?不断的暴露指标?
这样肯定是不合理的。
而且,如果后续某个项目判断逻辑发生变更(虽然这不太会),所有的业务逻辑都要修改,会涉及几十上百个模型表,这将会是个灾难。
更好的解决方案
有没有更好的解决方案?必然是有的。
更优雅的设计应该是暴露业务相关含义的逻辑,本例中业务方要的是是否符合考核,因此我们只需暴露is_kpi_received
即可,至于是否符合考核的逻辑,则由源头模型加工表实现,这样,后续逻辑变更,只需改加工表即可。即该的少,又保障了逻辑的一致性。
总结
- 在模型设计时,应考虑扩展性,尽可能暴露业务相关含义的逻辑。
- 在血缘链路开发中,传递数据而非逻辑。