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

场景

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

部门成员关系

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

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

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

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

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

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

阿神

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

小葫芦

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

참고로.

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

大家讲道理

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

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿