mysql - 尋求統計新增合約數的方案
巴扎黑
巴扎黑 2017-05-02 09:26:05
0
5
815

場景

登陸用戶可以隨時查看某個時段的新增合約數

部門成員關係

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

大家讲道理

寫一個定時任不就解決了啊,說這麼多! ! !

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板