>  Q&A  >  본문

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일 전717

모든 응답(5)나는 대답할 것이다

  • PHP中文网

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

    새롭게 추가된 계약의 사본을 Redis에 넣고 하루에 한 번씩 삭제하는 것을 고려해 보세요.

    회신하다
    0
  • PHPz

    PHPz2017-05-02 09:28:05

    옵션 1이 선호되는 옵션입니다. 유일한 문제는 모든 부하 직원을 재귀적으로 확보하는 것이 느리다는 것입니다. 그럼 이 문제를 해결해 볼까요!

    인사 테이블의 대략적인 구조는 전형적인 트리 형태의 데이터 저장소로 다음과 같다고 가정합니다.
    아이디, 이름, 부모ID

    값이 개인에 대한 액세스 경로인 경로 필드를 추가합니다. 예를 들어 -12-45-765-에서 765는 현재 사용자 ID이고, 45는 765의 상위, 12는 45의 상위입니다.

    이 필드를 사용하면 리더의 ID를 기준으로 리더의 부하 직원과 자신을 모두 쉽게 필터링할 수 있습니다. select id from employee where path like '%-45-%'

    향후 직원 소속을 업데이트할 때 이 필드를 업데이트하는 것을 잊지 마세요.

    회신하다
    0
  • 阿神

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

    데이터의 양이 많으면 확인할 때마다 쿼리하고 계산해야 하는데 이는 어떤 솔루션을 사용해도 매우 스트레스가 많습니다.
    이런 경우 스트리밍 계산 통계를 직접 수행하는 것이 좋습니다. 데이터를 한 번 계산하고, 사용할 때 직접 쿼리해 보세요.
    정상적인 프로세스의 성능에 영향을 주지 않기 위해 스트리밍 컴퓨팅 통계는 비동기식으로 운영될 수 있습니다
    저희 시스템도 비슷한 통계를 일간 통계로 보면 지난 90일, 최근 3년간의 통계를 볼 수 있습니다. 이전에는 연도별로만 볼 수 있었는데, 원하는 것과 비슷한 것 같습니다.
    스트림 계산 통계를 위한 작은 코드를 작성했는데, 일주일도 채 걸리지 않았습니다.
    github.com/panjjo/flysnow 물론 코드 작성이 상당히 형편없습니다.

    회신하다
    0
  • 高洛峰

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

    이것은 데이터베이스 분야의 일반적인 OLAP 요구 사항이며 구체화된 뷰를 고려할 수 있습니다.

    참고로.

    MongoDB를 사랑해주세요! 재미있게 보내세요!

    회신하다
    0
  • 大家讲道理

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

    타이머를 작성하면 문제가 해결됩니다. 그게 전부입니다! ! !

    회신하다
    0
  • 취소회신하다