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

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。这篇文章主要讲述数据仓库的数据模型(拉链表-能追踪历史信息的实现方案)实践杂谈相关的知识,希望能为你提供帮助。
为了记录信息的变更情况,不仅保留最新状态,也要求历史信息可用时,适合使用拉链表。
基本构成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:userNameString inCode; //入码 String inName; //入名 String inPrice; //入价String outCode; //metaId; //元数据ID metaName; //元数据 price; //

7、统计分析(略) 利用拉链表、元数据追踪进行统计 // 元数据原理
String leftNum; /** 逻辑演示 MrpConsumeDetailServiceUtils idididinNumoutNumstoreNumcalculateDateremarks 1YSM1100 01002020-05-31待消耗1YSM1808002020-06-01已消耗 2YSM1200202020-06-01待消耗1YSM1808002020-06-01已消耗 2YSM1202002020-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:物理删除 * */


    推荐阅读