登陆用户可以随时查看某个时间段的新增合同数
华东区总经理
|--- 华东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 修改人
【新增合同数】 = 【所有下级的新增合同数】+【本人新增合同数】
数据库是mysql,因为上级合同数,是所有下级的合同数之和,所以,我们递归得到了用户所有下级的用户id
然后再用count(*) from 表 where (created_at时间段条件) and created_by in (所有的下级用户id,包含当前登录用户id)
问题:数据是准确的,但是效率低下,对服务器性能也有影响
单独用一个表来记录每个用户每天的新增合同数,还是先得到所有下级用户的id,然后再用
select sum(inum) from user_count where (created_at时间段条件)
and created_by in (所有的下级用户id,包含当前登录用户id)
问题:每次 增加,删除,批量删除,都要修改这个字段,如果用户量增大,计数错误的可能性非常大,虽然统计方便了,但是数据不准确
我们网站要统计今日新增,昨日新增,本周新增,本月新增,本季度新增,本年新增,用户还可以自己输入时间段查询
请问大家有没有什么好的方案,可以让数据既准确,统计起来效率又高的?
考虑一下把新增的合同放一份到redis,每日清零一次就好了。
方案一是优选方案,唯一的问题是递归获取所有下级人员比较慢。那么我们就解决这个问题!
假设人员表大概结构如下,一个典型的树状数据存储。
ID,Name, ParentId
给它加一个字段Path,其值为到达该人员的访问路径,比如
-12-45-765-
,其中765是当前用户Id,45是765的上级,12是45的上级。有了这个字段后,根据某个领导的id筛选出他所有的下级以及他自己就易如反掌。
select id from employee where path like '%-45-%'
以后在更新人员从属关系时,记得要更新这个字段就好了。
你这个如果数据量大,每次查看的时候都去现查询计算,这个压力非常非常大啊,不管是用哪种方案。
对于这种的,你还不如直接做流式计算统计了。来一条数据计算一次,使用的时候直接查询一次即可。
为了不影响正常流程的性能,流式计算统计可以异步操作
我们系统就做过类似的统计,看每天统计可以看最近90天,看每月可以看最近3年,3年之前的就只能按年查看,感觉和你的需求差不多
我是自己写了一个小流式计算统计的小代码,花不了一周时间。
github.com/panjjo/flysnow 当然代码写的还是比较烂的。
这种是在数据库领域中常见的OLAP的需求,可以考虑物化视图。
供参考。
Love MongoDB! Have fun!
写一个定时任不就解决了啊,说这么多!!!