数据仓库的数据模型(拉链表-能追踪历史信息的实现方案)实践杂谈

Posted Actruly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据仓库的数据模型(拉链表-能追踪历史信息的实现方案)实践杂谈相关的知识,希望对你有一定的参考价值。

为了记录信息的变更情况,不仅保留最新状态,也要求历史信息可用时,适合使用拉链表。

基本构成

1、拉链表 ZipData(zip_data,mtlStore)
【分区分表存储:总表视图mtlStoreTtl、运行表mtlStore、历史表(失效时间非空)mtlStore2022、mtlStore2023……】

//target见【形态表】
String targetId;//mtlId;//目标ID【10G02100023A】
String targetUnicode;//mtlUnicode;//目标唯一码【如:资产编号】
String targetName;//mtlName;//目标名【X-RAY检测仪】
String targetCode;//mtlCode;//目标码【10G02100023】

Integer storeNum;//数量

Date zipStart;//生效时间
Date zipEnd;//失效时间
Date zipDate;//非持久化,查询用,代表时间点

2、操作详情 ZipAction(zip_action,mtlIom)【凭证:mtlIomOrder】
【分区分表存储:总表视图mtlIom、操作时间分表 mtlIom2022、mtlIom2023……】

String iomOrderId;//凭证ID
String iomCode;//凭证号
Integer iomSort;//凭证序号

Date actionDate;//操作时间 iomDate
Date actionType;//操作类型 iomType【】
String targetId;//目标ID mtlId
Integer actionNum;//操作数量

Integer inNum;//操作i数量【需带上 元数据 】
Integer outNum;//操作o数量
Integer actiontNum;//操作t数量(理论数)
Integer actioncNum;//操作c数量(盘点数)
Integer actiondNum;//操作d数量(差异数)

String inWhlId;//入位 u:userId(人员位)
String inWhlName;//入位名 u:userName(人员名)
String outWhlId;//出位
String outWhlIdName;//出位
String checkWhlId;//盘点位ID
String checkWhlName;//盘点位名

3、冻结记录(期初期末)ZipFreeze:(zip_freeze,mtlFreeze)
【分区分表存储:总表视图mtlFreeze、归集时间分表 mtlFreeze2022、mtlFreeze2023……】
Date freezeDate;//归集时间
String targetId;//目标ID
String targetName;//目标名
Integer storeNum;//数量

String freezeId;//冻结ID
String freezeName;//冻结名

String whlId;//位ID u:userId(人员位)
String whlName;//位名 u:userName(人员名)

4、期间操作表(阶段时间操作统计)ZipCount:(zip_count,mtlCount)
【分区分表存储:总表视图mtlCount、结束时间分表 mtlCount2022、mtlCount2023……】

Date startDate;//起始时间
Date endDate;//结束时间
Integer startNum;//期初数量
Integer endNum;//期末数量

Integer inum;//入数
Integer onum;//出数
Integer dnum;//差异数

Integer inumBuy;//购
Integer inumRec;//回收
Integer inumMove;//移入
Integer inumAdjustz;//调整增

Integer onumSale;//售
Integer onumSc;//生产
Integer onumMove;//移出
Integer onumShip;//出货
Integer onumAdjustj;//调整减

5、元数据信息.ZipMeta【zip_meta,mtlPrice】

Float priceTax;
String taxType;
Float taxRate;
Float price;
Float tax;

6、元数据追踪表【最初引入的数据(如价格)的追踪】ZipTrack:(zip_track,mtlConsume)【与形态表息息相关】

String mtlUnicode;//
String mtlId;//
String mtlName;//
String whlId;//u:userId
String whlName;//u:userName

String inCode;//入码
String inName;//入名
String inPrice;//入价

String outCode;//

metaId;//元数据ID
metaName;//元数据
price;//

7、统计分析(略) 利用拉链表、元数据追踪进行统计 // 元数据原理

String leftNum;
/** 逻辑演示 MrpConsumeDetailServiceUtils 
id  idid    inNum   outNum  storeNum    calculateDate   remarks
1   YSM1    100 0   100     2020-05-31  待消耗

1   YSM1    80  80  0       2020-06-01  已消耗
2   YSM1    20  0   20      2020-06-01  待消耗

1   YSM1    80  80  0       2020-06-01  已消耗
2   YSM1    20  20  0       2020-06-02  已消耗
*/   

更新数据方法

    /**   AcSettleDao_Utils 
     * TODO 恢复方案一(√):(利用 财务结算标记 acSettleFlag:Y已结算,N未结算)(finishFlag未生效-U、已生效-N、已完成-Y、已作废-F)
     * 
     * 【UpdateDate > lastAcSettleDate】
     * 
     * MrpInDetail(结算)
     * 关闭:finishFlag == Y(已完成)F、(已作废)
     * 其余不关闭。finishFlag-U(未生效)、N(已生效未完成)【outedNumber、leftNumber、outDesc等信息有用】
     * 
     * MrpInDetail(恢复)(仅对N的进行恢复:His有的则从His恢复,新创建的归0)
     * createDate <= lastAcSettleDate:outedNumber等信息归0
     * createDate > lastAcSettleDate:从His里恢复(其实也是归0)。
     * 
     * 
     * MrpMoveDetail(结算)
     * 关闭:finishFlag == Y(已完成)F、(已作废)
     * 其余不关闭。finishFlag-U(未生效)、N(已生效未完成)【outedNumber、leftNumber、outDesc\\inDetailDone、inDesc等信息有用】
     * 
     * MrpMoveDetail(恢复)(仅对N的进行恢复:His有的则从His恢复,新创建的归0)
     * createDate <= lastAcSettleDate:outedNumber\\inDetailDone、inDesc等信息归0
     * createDate > lastAcSettleDate:从His里恢复(其实也是归0)。
     * 
     * 
     * MrpOutDetail(结算)
     * 关闭:finishFlag == Y(已完成)F、(已作废)
     * 其余不关闭。finishFlag-U(未生效)、N(已生效未完成)【inDetailDone、inDesc等信息有用,其实是归0】
     * 
     * MrpOutDetail(恢复)(仅对N的进行恢复:His有的则从His恢复,新创建的归0)
     * createDate <= lastAcSettleDate:inDetailDone、inDesc等信息归0
     * createDate > lastAcSettleDate:从His里恢复(其实也是归0)。
     * 
     * 
     * MrpStore(结算)
     * 关闭:zipEnd存在
     * 其余不关闭。zipEnd==null
     * 
     * MrpStore(恢复)(仅对N的进行恢复:His有的则从His恢复,新创建物理删除)
     * createDate <= lastAcSettleDate:inDetailDone、inDesc等信息归0
     * createDate > lastAcSettleDate:物理删除。
     * 
     * 
     * MrpConsumeDetail(结算)
     * 关闭:storeNum == 0、inNum==outNum、remarks=="已消耗"
     * 其余不关闭。storeNum == inNum、outNum=0、remarks=="待消耗"
     * 
     * MrpConsumeDetail(恢复)(仅对N的进行恢复:His有的则从His恢复,新创建物理删除)
     * createDate <= lastAcSettleDate:inDetailDone、inDesc等信息归0
     * createDate > lastAcSettleDate:物理删除。
     * 
     * 
     * 结算具体操作:【UpdateDate > lastAcSettleDate】
     * 1、ALL(如:MrpInDetail):对原来为N(或更新时间在上次结算时间之后的)  (更新状态 acSettleFlag:Y,N)。
     * 2、HIS(如:MrpInDetailHis):删掉原来所有N。acSettleFlag:N。(理由:原有的Y不会再变更、N可能会变更)
     * 3、HIS(如:MrpInDetailHis):追加新更新为Y和N。acSettleFlag:Y或N(理由:相当于完全镜像拷贝当前状态)
     * 
     * 
     * 恢复具体操作:【UpdateDate > lastAcSettleDate】
     * 1、MrpInDetail、MrpOutDetail、MrpMoveDetail(仅对N的进行恢复:His有的则从His恢复,新创建的归0)
     * createDate > lastAcSettleDate:inDetailDone、inDesc等信息归0
     * createDate <= lastAcSettleDate:从His里恢复(【outedNumber、leftNumber、outDesc\\inDetailDone、inDesc等信息归0】)。
     *  
     * 2、MrpStore、MrpConsumeDetail(仅对N的进行恢复:His有的则从His恢复,新创建物理删除)
     * createDate <= lastAcSettleDate:inDetailDone、inDesc等信息归0
     * createDate > lastAcSettleDate:物理删除
     * 
     */

以上是关于数据仓库的数据模型(拉链表-能追踪历史信息的实现方案)实践杂谈的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库之拉链表设计

数仓设计--维度(全量、拉链表)

如何在Impala中实现拉链表

SCD缓慢变化维拉链表

拉链表断链交叉链判断及处理方式

Hive数据模型之历史拉链表