场景
登陆用户可以随时查看某个时间段的新增合同数
部门成员关系
华东区总经理
|--- 华东1区经理
| |---销售主管11
| | |---销售员111
| | |---销售员112
| |---销售主管12
| |---销售员121
| |---销售员122
|
|
|--- 华东2区经理
|---销售主管21
| |---销售员211
| |---销售员212
|---销售主管22
| |---销售员221
| |---销售员222
|---销售主管23
| |---销售员231
| |---销售员232
华北区总经理
|--- 华北1区经理
| |---销售主管31
| | |---销售员311
| | |---销售员312
| |---销售主管32
| |---销售员321
| |---销售员322
|
|
|--- 华北2区经理
|---销售主管41
| |---销售员411
| |---销售员412
|---销售主管42
| |---销售员421
| |---销售员422
|---销售主管43
| |---销售员431
| |---销售员432
合同表
id 合同id
name 合同名称
created_at 创建时间
created_by 创建人
updated_at 修改时间
updated_by 修改人
计算规则
【新增合同数】 = 【所有下级的新增合同数】+【本人新增合同数】
方案1
数据库是mysql,因为上级合同数,是所有下级的合同数之和,所以,我们递归得到了用户所有下级的用户id
然后再用count(*) from 表 where (created_at时间段条件) and created_by in (所有的下级用户id,包含当前登录用户id)
问题:数据是准确的,但是效率低下,对服务器性能也有影响
方案2
单独用一个表来记录每个用户每天的新增合同数,还是先得到所有下级用户的id,然后再用
select sum(inum) from user_count where (created_at时间段条件)
and created_by in (所有的下级用户id,包含当前登录用户id)
问题:每次 增加,删除,批量删除,都要修改这个字段,如果用户量增大,计数错误的可能性非常大,虽然统计方便了,但是数据不准确
求助
我们网站要统计今日新增,昨日新增,本周新增,本月新增,本季度新增,本年新增,用户还可以自己输入时间段查询
请问大家有没有什么好的方案,可以让数据既准确,统计起来效率又高的?
你这个如果数据量大,每次查看的时候都去现查询计算,这个压力非常非常大啊,不管是用哪种方案。
对于这种的,你还不如直接做流式计算统计了。来一条数据计算一次,使用的时候直接查询一次即可。
为了不影响正常流程的性能,流式计算统计可以异步操作
我们系统就做过类似的统计,看每天统计可以看最近90天,看每月可以看最近3年,3年之前的就只能按年查看,感觉和你的需求差不多
我是自己写了一个小流式计算统计的小代码,花不了一周时间。
github.com/panjjo/flysnow 当然代码写的还是比较烂的。