Heim  >  Fragen und Antworten  >  Hauptteil

mysql - 寻求统计新增合同数的方案

场景

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

部门成员关系

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

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

求助

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

巴扎黑巴扎黑2727 Tage vor719

Antworte allen(5)Ich werde antworten

  • PHP中文网

    PHP中文网2017-05-02 09:28:05

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

    Antwort
    0
  • PHPz

    PHPz2017-05-02 09:28:05

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

    假设人员表大概结构如下,一个典型的树状数据存储。
    ID,Name, ParentId

    给它加一个字段Path,其值为到达该人员的访问路径,比如 -12-45-765-,其中765是当前用户Id,45是765的上级,12是45的上级。

    有了这个字段后,根据某个领导的id筛选出他所有的下级以及他自己就易如反掌。select id from employee where path like '%-45-%'

    以后在更新人员从属关系时,记得要更新这个字段就好了。

    Antwort
    0
  • 阿神

    阿神2017-05-02 09:28:05

    你这个如果数据量大,每次查看的时候都去现查询计算,这个压力非常非常大啊,不管是用哪种方案。
    对于这种的,你还不如直接做流式计算统计了。来一条数据计算一次,使用的时候直接查询一次即可。
    为了不影响正常流程的性能,流式计算统计可以异步操作
    我们系统就做过类似的统计,看每天统计可以看最近90天,看每月可以看最近3年,3年之前的就只能按年查看,感觉和你的需求差不多
    我是自己写了一个小流式计算统计的小代码,花不了一周时间。
    github.com/panjjo/flysnow 当然代码写的还是比较烂的。

    Antwort
    0
  • 高洛峰

    高洛峰2017-05-02 09:28:05

    这种是在数据库领域中常见的OLAP的需求,可以考虑物化视图。

    供参考。

    Love MongoDB! Have fun!

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-05-02 09:28:05

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

    Antwort
    0
  • StornierenAntwort