您现在的位置是:主页 > news > 天津做网站选择津坤科技b/兰州seo关键词优化
天津做网站选择津坤科技b/兰州seo关键词优化
admin2025/4/20 3:54:44【news】
简介天津做网站选择津坤科技b,兰州seo关键词优化,网站建设需要做些什么,网站上怎么做企业推广前言 最近几周, 在处理这样的一个历史数据的需求 最开始 我们的思路是, 把历史报表数据导入到我们系统 单独形成 n 张表, 然后 不同的历史数据查询模块, 查询这对应的 n 张已经生成好的结果表, 然后 相当于是吧历史报表数据单独提出来一个菜单, 和现有的报表数据分开读取 …
前言
最近几周, 在处理这样的一个历史数据的需求
最开始 我们的思路是, 把历史报表数据导入到我们系统 单独形成 n 张表, 然后 不同的历史数据查询模块, 查询这对应的 n 张已经生成好的结果表, 然后 相当于是吧历史报表数据单独提出来一个菜单, 和现有的报表数据分开读取
然后 这个思路 大家都一致没有什么问题, 然后 到后面 讨论到现有的报表的数据的时候, 我们这边需求同事 觉得现有的报表数据的计算方式存在问题, 可能不能达到预期的效果, 我们现有的数据 计算是通过我们系统清洗之后的数据生成的, 但是 需求同事这边 需要的是源业务库这边有什么调整, 也需要知晓
然后 这个就有点蛋疼了, 我们 系统并感知不到业务系统这边的数据的变化, 即是业务数据按照最新的状态推送过来了, 那么也需要重新清洗数据, 这个 开销可不小, 而且 对系统存在 较大的改动
上下文 : 我们系统是一个离线处理系统, 业务系统这边将相关的数据流水推送到我们系统, 然后 我们系统进行数据清洗, 入库, 后续处理 等等
然后 后来我们同事 wan兄, cao兄, 思考了一个解决思路, 就是 由业务系统这边定时吧一些 "基础数据" 推送过来, 然后 我这边再来根据实际业务情况进行计算[统计给定的实体的每天的汇总信息 等此类的处理], 入库, 展示 等等
这个基础数据, 是根据一些 业务维度 分组的汇总的记录
然后 这样处理的话, 新老报表数据 可以使用同一个报表模板, 同一套处理方式, 同一个菜单了
然后 基于这套思路, 我们也是花了大概是两周左右来处理这个事情, 需求 li小妹 配合 BI zhou小妹 推送数据啊, 然后 我这边调整啊 等等
本以为 一切都 ok 的时候, 出现了一个情况, 一些报表 他的计算规则 是会变动的, 然后 肯能大致几个月会变化一次
然后 我们现有的这套规则, 都是实时 查询当前的规则, 然后 来进行计算
然后 就会出现这部分历史报表, 根据当前的规则 计算出来的结果 和 原有的历史报表不匹配的情况
问题的思考
1. 持久化需要显示的数据
最开始 想的是, 加一些字段, 吧报表需要展示的数据 计算出来, 存起来 然后 之后查询直接显示就行, 但是 转念一想, 对于有些场景, 这样处理 是不行的, 因为 有些数据是需要 实时根据规则来计算的, 就好比 一些 数量1 是需要统计了给定的区间的数量 然后再 减去一个基数, 然后 还有些数据的计算 是依赖于前面的这个 数量1
这个 思路, 感觉还是 不太适合这个场景
2. 持久化历史规则
如果是按照月份调整规则, 我可以每一个月创建一个规则快照, 然后 是哪一个月 就是用这个月的规则来计算嘛, 但是 问了一下我们需求同事, 说是 规则的调整 可能最小粒度是天, 我就想啊, 我不能每天都为这个 实体创建一个规则快照瑟 ?
但是 后面根据这个思路优化了一下, 每天一个任务跑一次, 检查前一天的规则又没得更新, 如果更新了, 则说明 这个规则是昨天调整的, 并且昨天生效的, 然后 创建一个 前一天的当前最新的规则的规则快照
然后 使用的时候, 查询给定的实体 给定的日期 apply 的规则, 查询给定的日期往前走的最近的规则, 然后 apply 这个规则快照, 来计算 给定的报表
然后 对于历史数据的 基数, 比率, 什么的, 可以通过 历史报表 使用sql来计算, 然后 统计出来之后, 使用脚本 生成对应的 规则快照, 然后 就行
这个思路的实现来说, 还存在一些缺点, 比如需要 改动了某一个字段, 某一些字段, 需要完整的拷贝改规则的所有的字段, 对于空间的浪费, 但是 时间 和 空间的权衡 需要根据实际的情况进行具体情况具体分析嘛, 如果 需要节约空间, 就意味着需要额外的计算 来支撑
附上一些 基础代码
1. ISnapshotRuleXXBaseService
public interface ISnapshotRuleXXBaseService {/*** 新增一个 快照实体** @param params params* @return* @author Jerry.X.He* @date 2019/3/20 18:30*/Long add(SnapshotRuleXX params);/*** 获取给定的实体, 给定的日期 应该生效的对应的规则 快照** @param params params* @return* @author Jerry.X.He* @date 2019/3/20 18:32*/SnapshotRuleXX getLatest(EntityCodeDayReqDto params);}
2. 定时任务处理
@BizLogger(req = false, resp = false)public void makeSnapshotIfRuleXXUpdated() {String yesterday = DateUtil.dateFormat(DateUtil.dateAddDays(new Date(), -1), DateUtil.SIMPLE_STAND_DATE);MgentitySelectReqDto queryParams = new MgentitySelectReqDto();queryParams.setType("xx");List<entity> allXXEntity = entityBaseService.allByType(queryParams);for (entity entity : allXXEntity) {RuleXXDto oldRule = ruleXXService.getByentityNo(entity.getCode());SnapshotRuleXX latestSnapshot = snapshotRuleXXBaseService.getLatest(new EntityCodeClearingDayReqDto(entity.getCode(), yesterday));if (doesXXRuleUpdated(oldRule, latestSnapshot, yesterday)) {SnapshotRuleXX snapshotFromRule = createSnapshotByXXRule(oldRule, yesterday);snapshotFromRule.setClearingDay(yesterday);snapshotRuleXXBaseService.add(snapshotFromRule);LOGGER.info("[makeSnapshotIfRuleXXUpdated] 添加给定的xx规则的快照, entityCode : " + snapshotFromRule.getEntityCode() + ", clearingDay : " + snapshotFromRule.getClearingDay());}}}// ---------------------------------- 辅助方法 --------------------------------/*** 判断给定的 已有的规则 和 最近的快照对比, 是否有更新** @param oldRule oldRule* @param latestSnapshot latestSnapshot* @return boolean* @author Jerry.X.He* @date 2019/3/20 19:06*/private boolean doesXXRuleUpdated(RuleXXDto oldRule, SnapshotRuleXX latestSnapshot, String yesterday) {if (oldRule == null || (localRuleXXService.isDummy(oldRule))) {return false;}if (latestSnapshot == null) {return true;}SnapshotRuleXX snapshotFromRule = createSnapshotByXXRule(oldRule, yesterday);String digestFromOldRule = makeDigestForSnapshotRuleXX(snapshotFromRule);String digestFromLatestRule = makeDigestForSnapshotRuleXX(latestSnapshot);boolean updated = (!digestFromOldRule.equals(digestFromLatestRule));return updated;}/*** 根据 给定的 汽车票规则, 创建一个 汽车票规则 快照** @param rule rule* @return com.bst.acc.base.dao.model.rule.SnapshotRuleXX* @author Jerry.X.He* @date 2019/3/20 19:08*/private SnapshotRuleXX createSnapshotByXXRule(RuleXXDto rule, String clearingDay) {SnapshotRuleXX result = new SnapshotRuleXX();BeanUtils.copyProperties(rule, result);result.setEntityCode(rule.getentityNo());result.setClearingDay(clearingDay);return result;}/*** 创建给定的 规则快照的指纹, 用于对比** @param rule rule* @return java.lang.String* @author Jerry.X.He* @date 2019/3/20 19:12*/private String makeDigestForSnapshotRuleXX(SnapshotRuleXX rule) {JSONObject ruleObject = (JSONObject) JSON.toJSON(rule);ruleObject.remove("id");ruleObject.remove("clearingDay");ruleObject.remove("createTime");ruleObject.remove("updateTime");ruleObject.remove("updateUser");return ruleObject.toString();}
完