mysql - 寻求统计新增合同数的方案
巴扎黑
巴扎黑 2017-05-02 09:26:05
0
5
764

场景

登陆用户可以随时查看某个时间段的新增合同数

部门成员关系

华东区总经理 
 |--- 华东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)

问题:每次 增加,删除,批量删除,都要修改这个字段,如果用户量增大,计数错误的可能性非常大,虽然统计方便了,但是数据不准确

求助

我们网站要统计今日新增,昨日新增,本周新增,本月新增,本季度新增,本年新增,用户还可以自己输入时间段查询
请问大家有没有什么好的方案,可以让数据既准确,统计起来效率又高的?

巴扎黑
巴扎黑

全部回复(5)
Ty80

考虑一下把新增的合同放一份到redis,每日清零一次就好了。

PHPzhong

方案一是优选方案,唯一的问题是递归获取所有下级人员比较慢。那么我们就解决这个问题!

假设人员表大概结构如下,一个典型的树状数据存储。
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!

大家讲道理

写一个定时任不就解决了啊,说这么多!!!

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板