2

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

 2 years ago
source link: https://blog.51cto.com/cnkj/5095263
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

原创

Actruly 2022-03-11 13:30:18 博主文章分类:数据库、持久化 ©著作权

文章标签 分表 元数据 表视图 拉链表 文章分类 软件设计 软件研发 阅读数269

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

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:物理删除
	 * 
	 */

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK