数据仓库的数据模型(拉链表-能追踪历史信息的实现方案)实践杂谈
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:物理删除
*
*/
以上是关于数据仓库的数据模型(拉链表-能追踪历史信息的实现方案)实践杂谈的主要内容,如果未能解决你的问题,请参考以下文章