一共有三张表。
说明如下:
1. 实时数量表(每5分钟插入一次),接口JSON如下所示。,但此表每天会清空。
{
"reportTime": 1625640402000,
"navclickCount": 5,
"opinfoclickCount": 7,
"transclickCount": 11,
"perinfoclickCount": 7
}
2. 每日统计表
这个表会把实时数量表中插入的数据全部累加起来,这就意味着每日统计表在实时数量表清空后所有数据都会变成0,以便为第二天做准备。
3. 历史统计表
和每日统计表类似,只是数据要一直保留并累加。
需求和疑问:
第二,三张表的数据都要求实时更新。现在我做到了第二步,每日统计表可以实时更新了,但历史统计表遇到问题;因为实时数量表会清零,所以无法简单地把实时数量表全加起来,否则第二天也会清零。现在我的思路是每天在实时数量表清空前,将每日统计表和历史统计表累加一次,但这样的话只能一次性统计全天的,就不是实时更新了。想知道有没有更好的思路,谢谢!
1、实时数量表不能保留一天吗?每日统计也是一样的问题
2、如果有一天实时统计出问题了,按照目前的思路,你怎么去修复历史数据?比如昨天的数据有问题,需要要修复,你咋修复?
按我说一张表就能做完,弄成逻辑删除就好
加个is_delete字段,0=未删除,1=已删除
1.实时5分钟插入一条
2.每日统计未删除的数据
3.历史统计已删除的数据
ps:存在性能问题分表就好了
个人认为问题的关键点在于统计的需求的复杂性?
规划一下每天的数据量,没必要分成三张表了,多少有些冗余
实时数据沉积下来就是当日的,如果是数据量达到一定程度,按时间纬度进行分表吧。历史数据这种按理说应该不会变了吧,把历史的统计和数据通过定时任务放到统计表,变的只是小范围的增量数据,不然数据量大了后,很多查询就锁死了
这个实现时可以每5分钟3个表同时更新,
1.5分钟表插入数据成功后
2.开始把5分钟的结果累加到天级表中,如果update失败就多重试几次,直到更新成功(失败次数超限可以报警人工处理)
3.把5分钟结果按第二步一样,累加到历史累计表中
实在不理解,你的每日统计表为啥每天要清空,加个日期字段,每天一条记录不就行了,这样历史统计表也省了。你要实时的话那就跟着那个实时数据表走啊,每五分钟数据来的时候顺便统计一次,然后更新一下。
1.保留原有数据为历史数据做准备。
2.如果修改历史数据注意数据同步问题。
没太懂啊,你是怎么做到每日统计表实时更新的呢?
请求过来,落到实时数量表中,实时数量表定时清空,你是怎么保证每次都实时落到了每日统计表中的呢?
如果你已经实时的落到了每日统计表,为什么不能实时的落到历史统计表中呢?
变成 0 的操作 要么是代码,要么是存储过程。复制一份新的代码或者新的存储过程把清0的操作跳过不可以吗?
这是你的回答
“因为每日统计表的计算方法就是定时把数量表全加起来的结果,假如有30条数据都是2,那他就是30×2=60,如果这时手动删除20条数据也就是只有10条数据,那他就成了10×2=20,不会累加,所以每天数量表没数据后,每日统计表也就都是0了”
那历史统计表的计算方法就为,定时把数量表全累加起来,假如以前有20条数据,假如有30条数据都是2,那他就是30×2=60,60+20=80,如果这时手动删除20条数据也就是只有10条数据,那他就成了10×2=20 20+80=100,这样不就累加了嘛
本来之前的方案是一张表就够了,但是考虑到运行几年也有几十W数据,以及沿用你的部分设计,可以分为两张表:实时表和历史表
1.定时更新历史表,将实时表中截止到前一天的数据按天统计后同步到历史表,同步成功后删除实时表中截止到前一天的数据
2.更新频率:考虑到失败的情况,可以每小时更新一次或n小时,每天一次也行
3.数据量:实时表中数据为当天数据及同步失败的数据,历史表中每天一条记录(如果没理解错你的意思的话应该是历史表一天一条记录),两张表的数据量都不大
4.统计查询:当天数据从实时表查询,只查询当天记录,实时表中有可能有同步失败的记录。历史统计从历史表查询(按年、月、日维度都可以)
你的问题中,最让人困惑的是
1.每日统计表的作用是什么?如果需要统计当天的数据,从实时表获取就好了
2.实时更新进历史表的作用是什么?一般来说,统计前一天的数据进历史表就好了
为啥要搞这样复杂的设计