单时间戳的流水业务数据
例子:工资发放情况
人员 | 开始执行 | 工资额度 |
---|---|---|
A | 2020-1-1 | 100 |
A | 2020-2-1 | 200 |
A | 2020-6-1 | 500 |
… | … | … |
B | … | … |
财务人员A从2020-1-1开始执行执行100的工资,2月涨工资到200,然后一直执行到5月份,6月份开始执行500的工资额度,如此往复。。很多人员。。很多条业务记录
需求:将所有人的工资额度的进行按年汇总?
解决方案:对每个人的后一条工资记录的工资记录开始时间作为本条的结束时间,算出月份数
人员 | 开始执行 | 结束时间 | 月份 | 工资额度 |
---|---|---|---|---|
A | 2020-1-1 | 2020-2-1 | 1 | 100 |
A | 2020-2-1 | 2020-6-1 | 5 | 20 |
A | 2020-6-1 | 无(2020-12-31) | 6 | 500 |
… | … | … |
然后进行工资额度汇总为:100乘1+200乘5+500乘6
分析:计算效率
每条业务数据都需要取下一条的开始时间作为结束时间,如果业务数据非常大,百万乃至千万,效率非常低下,难以计算。而且对所有人员进行进行汇总的时候,海量的分组求和数据也是效率低下的一个重要原因。
双时间戳的流水业务数据
例子:工资发放情况
人员 | 开始执行 | 结束时间 | 工资额度 |
---|---|---|---|
A | 2020-1-1 | 2020-1-31 | 100 |
A | 2020-2-1 | 2020-5-31 | 20 |
A | 2020-6-1 | 2020-12-31 | 500 |
… | … | … |
财务人员A从2020-1-1到2月执行执行100的工资,2月到5月执行200,6月份到12月开始执行500的工资额度,如此往复。。很多人员。。很多条业务记录
需求:将所有人的工资额度的进行按年汇总?
直接用累计工资额度*(结束时间-开始时间)算工资额度
分析:业务分析
维护双时间戳容易在业务上面维护相对困难,例如3月份A表现优秀,在3月份单独加100的工资,此条工资记录的添加,比如会导致前后两条工资记录的开始和结束时间,需要进行维护,单时间戳方案就不存在此问题
总结
实际业务记录中,要根据特定的业务进行不同的数据库设计,一个好的数据结构设计,可以优化算法的设计。